Tiled Map Editor(二)

  • Post author:
  • Post category:其他



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



  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放到地图中,随地图一起移动。



  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中,这样用户体验更好。



  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. if


    (_tileMap->getPosition().x+dp.x>-480&&_tileMap->getPosition().x+dp.x<0)


  7. {

  8. mapPoint=ccp(_tileMap->getPosition().x+dp.x,0);

  9. _tileMap->setPosition(mapPoint);

    //移动地图




  10. }





  11. }



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



1.碰撞检测


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



  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吃了西瓜。



  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显示出来。



  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个西瓜


好了,就这样吧。


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


最后上传源代码:

点击下载





转自:

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