书接前文。
创造出世界之后要制定规则。游戏中有些地方是不可以穿过的。有些地方是会触发特殊效果的。现在来实现。
墙壁、石堆、牌子这些都是不可以穿过的。
首先在TileMap中编辑一下,大概方法是创建一个新层,专门负责碰撞部分。
具体可见:子龙翻译的 http://www.cnblogs.com/andyque/archive/2011/05/03/2033620.html
编辑好了之后保存,替换到工程中。
开始编码。
首先要取得控制层,另外这层也不能显示出来。
头文件中增加:
CCTMXLayer* m_meta;
m_meta = m_tileMap->layerNamed("Meta"); m_meta->setVisible(false);
没找到Qt版本的怎么显示这个数字。另外似乎没有写好的函数,有的话请留言告诉一下 哈 。自己写:
CCPoint HelloWorld::posToMapBlock(CCPoint pos) { int x = pos.x / m_tileMap->getTileSize().width; int y = ( m_tileMap->getContentSize().height - pos.y)/m_tileMap->getTileSize().height; return ccp(x,y); }
这部分加在响应里。
CCPoint pConverted = posToMapBlock(ccp(moveTo.x,moveTo.y)); int tileGID = m_meta->tileGIDAt(pConverted); if(tileGID) { CCDictionary* pro = m_tileMap->propertiesForGID(tileGID); if(pro) { CCString* collision =const_cast<CCString*>(pro->valueForKey("Collidable")); if(collision && collision->compare("true") == 0) { return; } } }
行了,有这个gid返回的字典,就可以取到在地图中设定的信息。数据、消息一到位,也就基本完成了。
编译运行,就成了。
有限制不够,还要有奖励。地图上的西瓜可以吃掉,加个血什么的。
新建一个层,专门放西瓜。把之前的西瓜挪到这层中。在meta层用绿色的块填充这部分,并设置属性。
具体可以看一开始那个外链。
接下来就是要弄一个层专门显示吃掉的西瓜数了。
自己写个ScoreScene:
#pragma once #include "cocos2d.h" USING_NS_CC; class ScoreLayer:public CCLayer { public: CREATE_FUNC(ScoreLayer); virtual bool init(); void numberadd(); private: CCLabelTTF* m_label; int m_score; };
#include "ScoreLayer.h" bool ScoreLayer::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); m_label = CCLabelTTF::create(); m_label->initWithString("0","Verdana-Bold",18); m_label->setColor(ccc3(0,0,0)); int magin = 10; m_label->setPosition(ccp(winSize.width - m_label->getContentSize().width/2 - magin, m_label->getContentSize().height + magin)); m_score = 0; this->addChild(m_label); bRet = true; }while(0); return bRet; } void ScoreLayer::numberadd() { m_score++; m_label->setString(CCString::createWithFormat("%d",m_score)->getCString()); }
在HelloWorld.cpp中创建一个全局变量:
ScoreLayer *score_layer;
score_layer = ScoreLayer::create(); CC_BREAK_IF(! score_layer); scene->addChild(score_layer);
CCString* collectable = const_cast<CCString*>(pro->valueForKey("Collectable")); if(collectable && collectable->compare("true") == 0) { //此处地图已经更改过了,将西瓜放在foreground上了。 m_meta->removeTileAt(pConverted); m_foreground->removeTileAt(pConverted); score_layer->numberadd(); }
它们都应该是在Scene层的管制之下,互相之间是不应该有关联的。
此处我是用全局变量了,这种最省事的方法。大型项目的话应该封一个管理的类,不然该乱了。
行了,编译运行就成了。
0资源分 代码:http://download.csdn.net/detail/fansongy/5323719