场景地图资源
通常,游戏开发中,会把场景中位置不变的地图物件,写到配置文件中。客户端、服务器各持有1分相同的配置文件。
如服务器端,在场景初始化时,开始加载这个配置文件,创建地图中的物件。
下面实例分析,本项目中,是如何定义场景地图配置的。
mope\server\config\xml\map.xml
定义了所有场景,如下面配置,目前只有个场景1002
<?xml version="1.0" encoding="utf-8"?>
<config>
<scene id="1002" model="5"/>
</config>
mope\server\config\terrain
该目录下,定义了所有场景地图信息,如1002.json
{
"title": "1002",
"size": 75,
"nodes": [
{
"id": 1,
"type": 1,
"px": 10.25,
"py": 10.25,
"radius": 0.25
},
// ... (省略中间的,方便查看。)
// 友情提示:json无法添加注释,因此这2行是存在语法错误的!
{
"id": 27,
"type": 1,
"px": 4.25,
"py": 0.75,
"radius": 0.25
}
]
}
地图大小: 75。
目前地图物件只有一种,type:1,这里把它叫做静态障碍物。按玩法可以扩展更多的地图物件。
项目加载地图代码分析 - Scene.go
func (this *Scene) LoadMap() {
this.roomSize = this.mapConfig.Size
this.cellNumX = int(math.Ceil(this.roomSize / cll.CellWidth))
this.cellNumY = int(math.Ceil(this.roomSize / cll.CellHeight))
this.scenePhysic.CreateBoard(float32(this.mapConfig.Size))
for _, v := range this.mapConfig.Nodes {
LoadMapObjectByConfig(v, this)
randblock := this.GetSquare(v.Px, v.Py, v.Radius)
for index, _ := range randblock {
this.AppendFixedPos(int(randblock[index].X), int(randblock[index].Y))
}
}
}
这段代码做了2件事情:
- 创建地图边界障碍物 ( this.scenePhysic.CreateBoard(float32(this.mapConfig.Size)) )
- 创建静态障碍物 ( LoadMapObjectByConfig(v, this) )
细节请自行跟踪代码
项目地图物件代码分析 - MapObject.go
如何表示一个静态障碍物,代码中就是类:MapObject
type MapObject struct {
apeObject *ape.RectangleParticle
blockType usercmd.MapObjectConfigType
typeId int
}
持有一个base/ape库的碰撞对象:apeObject *ape.RectangleParticle
创建时,会把apeObject加入到blockAll碰撞组
func LoadMapObjectByConfig(config *conf.MapNodeConfig, scene *Scene) {
var obj *MapObject
switch usercmd.MapObjectConfigType(config.Type) {
case usercmd.MapObjectConfigType_Block:
obj = NewPhysicBlock(config)
}
scene.scenePhysic.AddBlock(obj.apeObject)
}
scene.scenePhysic.AddBlock(obj.apeObject) 加入到blockAll碰撞组
然后玩家就能正常的碰到这个静态障碍物了。base/ape会在背后完成这个工作。