出处: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解渴。
做好之后地图为
然后判断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的值。
最后还应该加入一些音效,前面讲过,就不多说了。
下面来几张截图:
这张图吃了3个西瓜
好了,就这样吧。