我们的游戏已经很像游戏了(像?敢情它真的不是一个游戏?),于是我们给主角加点吃的吧,老是这么跑,没有追求啊喂~
1.
画点吃的物体
现在,我们又要打开我们的地图编辑器,把下面的星星作为可以吃的物品画到barrier地图层上:
看看我的画吧,依旧有大师风范~噗
2.
添加“另类”障碍物。
其实,吃的物品,也可以当成是障碍物,只不过这个障碍物和主角碰撞之后会消失,仅此而已。
于是,我们和之前描红格子的方式一样,不过,这次我们要描蓝色格子,选择图块上的蓝色格子,噢,抱歉,它是绿色的= =。右键,属性,我们给绿色格子添加一个属性,叫做“star”,属性值为true。
然后,我们把地图切换到meta层,在上面用绿色格子把我们的所有星星都覆盖~效果如下:
3.
让主角把星星吃掉
其实大家到这里应该早就知道接下来该怎么做了,是吧,不过我还是稍微啰嗦一下哈。
打开我们Player.cpp的setSimplePosition函数,以前我们只是取得主角当前所在地图格子的属性里的Collidable属性值,这次我们还要再多获取一个值,那就是star的属性值。函数稍微修改了一些,并且加了一些容错机制:
01 | void Player::setSimplePosition( int x, inty ) |
09 | CCPoint tiledPos = tileCoordForPosition(ccp(x,y)); |
13 | int tiledGid = meta->tileGIDAt(tiledPos); |
29 | CCDictionary* propertiesDict = map->propertiesForGID(tiledGid); |
31 | if (propertiesDict !=NULL) { |
33 | const CCString* prop = CCString::create( "" ); |
37 | prop = propertiesDict->valueForKey( "Collidable" ); |
39 | if (prop->length() > 0 &&prop->m_sString.compare( "true" ) == 0) { |
69 | prop = propertiesDict->valueForKey( "star" ); |
71 | if (prop->length() > 0 &&prop->m_sString.compare( "true" ) == 0) { |
73 | barrier->removeTileAt(tiledPos); |
81 | Entity::setSimplePosition(x,y); |
85 | setViewPointByPlayer(); |
做法和之前的红色格子是一样的,不多说了,已经注释了。这次说明一点,我加了一个barrier变量,就是我们的障碍层,加到Entity类里:
01 | class Entity : public CCNode, public ControllerListener { |
05 | void setSprite(CCSprite* mSprite); |
07 | void setController(Controller* controller); |
11 | virtual void setSimplePosition(intx,inty); |
13 | virtual CCPoint getCurPosition(); |
19 | Controller* mController; |
35 | CCPoint tileCoordForPosition(CCPoint pos); |
然后在Player.cpp的initWithTiledMap函数里给barrier赋值:
03 | CCTMXObjectGroup* objGroup = map->objectGroupNamed( "objects" ); |
07 | meta = map->layerNamed( "meta" ); |
09 | meta->setVisible( false ); |
13 | barrier = map->layerNamed( "barrier" ); |
OK了,编译运行,当主角经过星星时就会吃掉它,啊,不过,只是吃掉部分而已。这个不是很好,但是,暂时就这么做吧。
对了,我们有没有发现,现在主角是在星星和石头的下面的?这是图层次序问题,我们做一个小改动就好了,打开Player.cpp的initWithTiledMap函数,添加主角精灵到地图的时候增加一个order参数:
Ctrl+Enter 发布
发布
取消