首先,项目工程来自于9秒社团,项目下载地址是:http://www.9miao.com/news/6/65041
要说明的一点是,以上地址下来之后需要修改一个入口,而且引擎最好用coco2dx 2.2这样一来,在修改了这个入口之后,代码无需再任何修改就可以直接运行了。如下:
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
CCDirector* pDirector = CCDirector::sharedDirector();
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
pDirector->setOpenGLView(pEGLView);
// turn on display FPS
//pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
//CCScene *pScene = HelloWorld::scene();
CCScene *pScene = TollgateSceneOne::scene();
// run
pDirector->runWithScene(pScene);
return true;
}
从TollgateSceneOne.cpp开始讲起,一开始创建了一个场景scene对象,接着在init函数里做了一下几个操作:
CCNotificationCenter::sharedNotificationCenter()->addObserver(this,callfuncO_selector(TollgateSceneOne::dead),"dead",NULL);
我也是第一次接触这个,简单的来说,就是不同层之间的互相通信的问题吧,具体可以看这里:http://www.cnblogs.com/imoon/archive/2013/01/15/2860877.html,这里使用到了也可以参考下。
void CCNotificationCenter::addObserver(CCObject *target,
SEL_CallFuncO selector,
const char *name,
CCObject *obj)
{
if (this->observerExisted(target, name))
return;
CCNotificationObserver *observer = new CCNotificationObserver(target, selector, name, obj);
if (!observer)
return;
observer->autorelease();
m_observers->addObject(observer);
}
讲要创建的对象以及回调,数据等放进 CCArray *m_observers对象中。在
void CCNotificationCenter::postNotification(const char *name, CCObject *object)
{
CCArray* ObserversCopy = CCArray::createWithCapacity(m_observers->count());
ObserversCopy->addObjectsFromArray(m_observers);
CCObject* obj = NULL;
CCARRAY_FOREACH(ObserversCopy, obj)
{
CCNotificationObserver* observer = (CCNotificationObserver*) obj;
if (!observer)
continue;
if (!strcmp(name,observer->getName()) && (observer->getObject() == object || observer->getObject() == NULL || object == NULL))
{
if (0 != observer->getHandler())
{
CCScriptEngineProtocol* engine = CCScriptEngineManager::sharedManager()->getScriptEngine();
engine->executeNotificationEvent(this, name);
}
else
{
observer->performSelector(object);
}
}
}
}
从数组对象中遍历找到对应的对象,然后执行对应的回调。成员函数registerScriptObserver一直没被调用,setHandler也一直没被调用?所以一直显示这里么。
添加地图到场景中
CCTMXTiledMap* map=CCTMXTiledMap::create("level1.tmx");
CCTMXLayer* groundLayer=map->layerNamed("sky");
this->addChild(map);
addPlayer实现的是m_mary->bindSprite(sprite);英雄绑定到地图中,并且用SimpleMoveController对象绑定在地图上的行走
for(int i=1;i<=5;i++)
{
CCSprite* sp1=CCSprite::createWithSpriteFrame(CCSpriteFrame::create("core.png",CCRectMake(0,0,30,27)));
m_money=Money::create();
m_money->bindSprite(sp1);
m_money->bindPlayer(m_mary);
CCTMXObjectGroup* objGroup1=map->objectGroupNamed("object");
CCDictionary* moneyPointDic=objGroup1->objectNamed(CCString::createWithFormat("MoneyPoint%d",i)->getCString());
float moneyX=moneyPointDic->valueForKey("x")->floatValue();
float moneyY=moneyPointDic->valueForKey("y")->floatValue();
m_money->setPosition(ccp(moneyX,moneyY));
map->addChild(m_money);
}
绑定金币在对应的地图中的位置,并且在money中每一帧检查是否与英雄碰撞,在update函数中进行了碰撞,如果碰撞了,改变分数,隐藏金币。
createRunBtn();createCore();两个函数分别初始化按钮的位置,创建旋转的金币。