超级玛丽 源码解析

2023-10-30 18:50
文章标签 源码 解析 超级玛丽

本文主要是介绍超级玛丽 源码解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


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

bool AppDelegate::applicationDidFinishLaunching() {// initialize directorCCDirector* 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 thispDirector->setAnimationInterval(1.0 / 60);// create a scene. it's an autorelease object//CCScene *pScene = HelloWorld::scene();CCScene *pScene =  TollgateSceneOne::scene();// runpDirector->runWithScene(pScene);return true;
}

修改的地方为//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,这里使用到了也可以参考下。


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();两个函数分别初始化按钮的位置,创建旋转的金币。


最后效果图:

这篇关于超级玛丽 源码解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/309918

相关文章

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三