Cocos格子地图(3)

本文介绍了Cocos2d-x游戏中地图对象层的概念,包括对象组、对象及其属性,以及如何在C++代码中读取和操作这些对象。此外,还探讨了TileMap的源码,如TMXTileMap的创建函数、属性获取方法以及TMXLayer的相关操作,如设置格子GID和获取像素坐标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地图对象层

就是一些依附于地图的对象所在的层,如下:

其中的小方框就是对象,这些对象在游戏时理解为小怪和马里奥出现的位置和活动区间

在.tmx中:

<objectgroupname="objects"width="228"height="14">

  <objectname="enemy"type="mushroom"x="648"y="176"/>

  <objectname="enemy"type="mushroom"x="824"y="176"/>

 <objectname="mushroom"type="MushroomReward"x="336"y="128">

   <properties>

    <propertyname="isMushroomReward"value="1"/>

   </properties>

  </object>

ObjectGroup是对象层,有名字。其中的对象object有自己的名字,类型位置等属性(有的还有Property)

使用方法:

map= TMXTiledMap::create("MarioMap1.tmx");

addChild(map); //创建地图

 

TMXObjectGroup * objGroup =map->getObjectGroup("objects");//获取对象层

ValueVector& vv =objGroup->getObjects();//获取对象组——由ValueVector保存

for (auto it = vv.begin(); it!= vv.end(); ++it)

{

// v对应的是一个<object name="enemy" type="mushroom"x="648" y="176"/>

//<object name="enemy" type="mushroom" x="648"y="176"/>在cocos中,叫作字典,keyMap

//ValueMap结构

Value& v = *it;

        ValueMap& vm =v.asValueMap();

        std::string& type = vm["type"].asString();

 

        if (type == "BirthPoint")//找到马里奥出生位置

        {

                int x = vm["x"].asInt();

                int y = vm["y"].asInt();

                CCLOG("x=%d,y=%d", x,y);

//放上马里奥

                Sprite* mario = Sprite::create("smallWalkRight.png", Rect(0, 0, 14, 16));

                map->addChild(mario);       mario->setPosition(x, y-16);

                mario->setLocalZOrder(100);

mario->setAnchorPoint(Vec2(0, 0));

        }

}

对象层配套数据结构:

ValueVector中存放着Value,每个Value就和标准库的map一样,,有key有value,Value有很多as…函数,如上面用到的asMap,都是封装好的便于转换类型的方法。这里我们用了asMap转成ValueMap(就可以以map的下标放式用key取值了),可以看到ValueMap也有很多as函数,这样非常方便使用。

对象层都用的是&引用类型,表示也可以对文件作出变更(只是内存中的.tmx

 

.tmx中的的xy都是UI坐标系的,原点左上角。但是当我们用asInt之类的as函数时自动将坐标转成了GL坐标——左下角

 

TileMap源码

TMXTileMap继承于Node,有两个create函数,一个是create()用.tmx做参数,一个是createWithXML用xml做参数。

getProperty()获取地图属性,tmx文件中了可以存储很多东西

getPropertiesForGId图块属性

getMapOrientation获取地图方向(是90度还是45度

getProperties返回一个&ValueMap

 

TMXMapInfo类,负责解析tmx文件,在我们create 了之后就会将信息放入TMXMapInfo

 

TMXLayer类继承于SpriteBatchNode——批处理精灵。说明每层都有必须相同的图块来源才行。通常我们不用它的create函数,常常Layer是获取得到的。其中方法如下:

setTileGID可以设置格子的GID,之后可以随意修改格子的内容图片为其他格子图(将GID置为0 表示让这个精灵消失)

getPositionAt(Vec2&tileCoordinate)从格子坐标转像素坐标

getProperty获取层属性

setupTiles创建精灵安装格子的过程

_tiles:uint32_t* _tiles; 用1唯数组形式保存了二维的格子的GID(如二维数组s[2][3],转成1唯m[6])

getTiles就是获取上面的数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值