场景地图资源

通常,游戏开发中,会把场景中位置不变的地图物件,写到配置文件中。客户端、服务器各持有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件事情:

  1. 创建地图边界障碍物 ( this.scenePhysic.CreateBoard(float32(this.mapConfig.Size)) )
  2. 创建静态障碍物 ( 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会在背后完成这个工作。

results matching ""

    No results matching ""