超级玛丽 源码解析

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

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六