【Cocos2d-x游戏引擎开发笔记(14)】Tiled Map Editor(二)

时间:2023-02-08 23:15:55

原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/8316277

这篇文章接着上篇继续学习使用Tiled制作游戏。

 

首先,对上篇的一些代码进行优化,一个是从对象获取对象的坐标。上次使用的代码有点麻烦,现在改为下面的代码:

CCTMXObjectGroup *objects=_tileMap->objectGroupNamed("hero");//获取对象层
CCDictionary *spawnPoint=objects->objectNamed("pa");//获取对象
heroPoint.x=spawnPoint->valueForKey("x")->floatValue();//获取对象的坐标
heroPoint.y=spawnPoint->valueForKey("y")->floatValue();
CCLog("x=%f,y=%f",heroPoint.x,heroPoint.y);


这是因为我找到了一个函数,直接获得float值。

 

将hero放到地图中,随地图一起移动。

_player=CCSprite::create("www.png");
_player->setAnchorPoint(CCPoint(0,0));
_player->setPosition(heroPoint);
_tileMap->addChild(_player,0);


 

 

还有一个地方就是,要严格判断用户是点击还是拖动,在头文件中声明beginPoint,在ccTouchBegan函数中赋值,在ccTouchEnded中判断,只要这个点与beginPoint相同,则为点击。

 

对于判断地图的拖动,则放到了ccTouchMoved中,这样用户体验更好。

void HelloWorld::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
CCPoint pp=pTouch->getPreviousLocation();//获取之前的点
CCPoint np=pTouch->getLocation();//获取现在的点
CCPoint dp=ccpSub(np,pp);//获取差


if(_tileMap->getPosition().x+dp.x>-480&&_tileMap->getPosition().x+dp.x<0)
{
mapPoint=ccp(_tileMap->getPosition().x+dp.x,0);
_tileMap->setPosition(mapPoint);//移动地图
}




}


好了,优化都做完了,现在开始新的知识。

1.碰撞检测

获取建筑层,在hero移动的时候,检测该层是否有建筑,有则不让hero移动。wall->tileGIDAt()这个函数获得在某一个Tile的块是那一块,图块都被编号了,从1开始,如果wall没有图块的话则为0.

if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&_player->getPosition().x/32-1<50&&_player->getPosition().x/32-1>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32-1,9-_player->getPosition().y/32))))
{
_player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));}


这行代码就是先判断将要去的位置是否在地图中,然后判断是否有建筑,没有建筑则让hero移动。

2.动态修改地图

这原来的地图上再建一个图层,改为foreground,在这个图层中添加一些西瓜,用于沙漠中的hero解渴。

【Cocos2d-x游戏引擎开发笔记(14)】Tiled Map Editor(二)

做好之后地图为

【Cocos2d-x游戏引擎开发笔记(14)】Tiled Map Editor(二)

然后判断hero所在的位置是否有西瓜,若有,则在foreground中移除西瓜,表示hero吃了西瓜。

if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&
_player->getPosition().x/32-1<50&&_player->getPosition().x/32-1>=0&&
!(wall->tileGIDAt(ccp(_player->getPosition().x/32-1,9-_player->getPosition().y/32))))
{
_player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));
if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
}
}

使用foreground->removeTileAt(CCPoint &pt)这个函数移除图块。

2.创建一个积分器

创建一个积分器,显示hero吃了多少西瓜,在头文件中声明一个int的count,每当hero吃了一个西瓜,就加一。然后创建一个CCLabelTTF显示出来。

if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))
{
foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));
count++;
CCString *temp=CCString::stringWithFormat("%d",count);
label->setString(temp->getCString());
}


吃了西瓜后,计数加一,改变CCLabelTTF的值。

最后还应该加入一些音效,前面讲过,就不多说了。

下面来几张截图:

【Cocos2d-x游戏引擎开发笔记(14)】Tiled Map Editor(二)

这张图吃了3个西瓜

【Cocos2d-x游戏引擎开发笔记(14)】Tiled Map Editor(二)

好了,就这样吧。

欢迎继续关注Tiled的使用,下一篇接着介绍学习心得。

最后上传源代码:点击下载