当前位置:   article > 正文

超级玛丽 源码解析_超级玛丽源码启动分析

超级玛丽源码启动分析

首先,项目工程来自于9秒社团,项目下载地址是:http://www.9miao.com/news/6/65041


要说明的一点是,以上地址下来之后需要修改一个入口,而且引擎最好用coco2dx 2.2这样一来,在修改了这个入口之后,代码无需再任何修改就可以直接运行了。如下:

  1. bool AppDelegate::applicationDidFinishLaunching() {
  2. // initialize director
  3. CCDirector* pDirector = CCDirector::sharedDirector();
  4. CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
  5. pDirector->setOpenGLView(pEGLView);
  6. // turn on display FPS
  7. //pDirector->setDisplayStats(true);
  8. // set FPS. the default value is 1.0/60 if you don't call this
  9. pDirector->setAnimationInterval(1.0 / 60);
  10. // create a scene. it's an autorelease object
  11. //CCScene *pScene = HelloWorld::scene();
  12. CCScene *pScene = TollgateSceneOne::scene();
  13. // run
  14. pDirector->runWithScene(pScene);
  15. return true;
  16. }

修改的地方为//CCScene *pScene = HelloWorld::scene();注释了这句,修改成 CCScene *pScene = TollgateSceneOne::scene();


从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,这里使用到了也可以参考下。


  1. void CCNotificationCenter::addObserver(CCObject *target,
  2. SEL_CallFuncO selector,
  3. const char *name,
  4. CCObject *obj)
  5. {
  6. if (this->observerExisted(target, name))
  7. return;
  8. CCNotificationObserver *observer = new CCNotificationObserver(target, selector, name, obj);
  9. if (!observer)
  10. return;
  11. observer->autorelease();
  12. m_observers->addObject(observer);
  13. }
讲要创建的对象以及回调,数据等放进 CCArray *m_observers对象中。在
  1. void CCNotificationCenter::postNotification(const char *name, CCObject *object)
  2. {
  3. CCArray* ObserversCopy = CCArray::createWithCapacity(m_observers->count());
  4. ObserversCopy->addObjectsFromArray(m_observers);
  5. CCObject* obj = NULL;
  6. CCARRAY_FOREACH(ObserversCopy, obj)
  7. {
  8. CCNotificationObserver* observer = (CCNotificationObserver*) obj;
  9. if (!observer)
  10. continue;
  11. if (!strcmp(name,observer->getName()) && (observer->getObject() == object || observer->getObject() == NULL || object == NULL))
  12. {
  13. if (0 != observer->getHandler())
  14. {
  15. CCScriptEngineProtocol* engine = CCScriptEngineManager::sharedManager()->getScriptEngine();
  16. engine->executeNotificationEvent(this, name);
  17. }
  18. else
  19. {
  20. observer->performSelector(object);
  21. }
  22. }
  23. }
  24. }
从数组对象中遍历找到对应的对象,然后执行对应的回调。成员函数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();两个函数分别初始化按钮的位置,创建旋转的金币。


最后效果图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/215881
推荐阅读
相关标签
  

闽ICP备14008679号