首先,对上篇的一些代码进行优化,一个是从对象获取对象的坐标。上次使用的代码有点麻烦,现在改为下面的代码:
-
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个西瓜
好了,就这样吧。
欢迎继续关注Tiled的使用,下一篇接着介绍学习心得。
最后上传源代码:
点击下载
。