Tiled Map Editor(二)

来源:互联网 发布:网络直播方案 编辑:程序博客网 时间:2024/05/16 17:25

出处:http://blog.csdn.net/zhy_cheng/article/details/8316277

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

 

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

[cpp] view plain copy
  1. CCTMXObjectGroup *objects=_tileMap->objectGroupNamed("hero");//获取对象层  
  2. CCDictionary  *spawnPoint=objects->objectNamed("pa");//获取对象  
  3. heroPoint.x=spawnPoint->valueForKey("x")->floatValue();//获取对象的坐标  
  4. heroPoint.y=spawnPoint->valueForKey("y")->floatValue();  
  5. CCLog("x=%f,y=%f",heroPoint.x,heroPoint.y);  


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

 

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

[cpp] view plain copy
  1. _player=CCSprite::create("www.png");  
  2. _player->setAnchorPoint(CCPoint(0,0));  
  3. _player->setPosition(heroPoint);  
  4. _tileMap->addChild(_player,0);  


 

 

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

 

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

[cpp] view plain copy
  1. void HelloWorld::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)  
  2. {  
  3.     CCPoint pp=pTouch->getPreviousLocation();//获取之前的点  
  4.     CCPoint np=pTouch->getLocation();//获取现在的点  
  5.     CCPoint dp=ccpSub(np,pp);//获取差  
  6.       
  7.       
  8.     if(_tileMap->getPosition().x+dp.x>-480&&_tileMap->getPosition().x+dp.x<0)  
  9.     {  
  10.         mapPoint=ccp(_tileMap->getPosition().x+dp.x,0);  
  11.         _tileMap->setPosition(mapPoint);//移动地图  
  12.     }  
  13.       
  14.       
  15.   
  16.   
  17. }  


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

1.碰撞检测

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

[cpp] view plain copy
  1. 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))))  
  2.                 {  
  3.                     _player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));}  


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

2.动态修改地图

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

做好之后地图为

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

[cpp] view plain copy
  1. if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&  
  2.     _player->getPosition().x/32-1<50&&_player->getPosition().x/32-1>=0&&  
  3.     !(wall->tileGIDAt(ccp(_player->getPosition().x/32-1,9-_player->getPosition().y/32))))  
  4.     {  
  5.         _player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));  
  6.         if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))  
  7.         {  
  8.         foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));  
  9.         }  
  10.     }  

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

2.创建一个积分器

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

[cpp] view plain copy
  1. if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))  
  2. {  
  3. foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));  
  4. count++;  
  5. CCString *temp=CCString::stringWithFormat("%d",count);  
  6. label->setString(temp->getCString());  
  7. }  


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

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

下面来几张截图:

这张图吃了3个西瓜

好了,就这样吧。

原创粉丝点击