Cocos2d-3.x版的HelloWorld工程分析 (二)

大笑大笑大笑大笑大笑大笑大笑大笑

我们HelloWorld 从applicationDidFinishLaunching()后,

大部分人都会从这部分代码开始研究,如果想要研究main函数 如何调用applicationDidFinishLaunching() 

传送门 http://blog.csdn.net/hiwoshixiaoyu/article/details/51472707



#include "AppDelegate.h"#include <vector>
#include <string>#include "HelloWorldScene.h"
#include "AppMacros.h"//Uncomment the following line to use localize manager
//#include "editor-support/cocostudio/LocalizationManager.h"//cocos2d的命名空间
USING_NS_CC;
//标准命名空间
using namespace std;
//构造函数
AppDelegate::AppDelegate() {}
//析构函数
AppDelegate::~AppDelegate() 
{
}//初始化OpenGl的上下文属性
void AppDelegate::initGLContextAttrs()
{GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};GLView::setGLContextAttrs(glContextAttrs);
}bool AppDelegate::applicationDidFinishLaunching() {// 获取导演实例auto director = Director::getInstance();//获取导演的GLView对象(通过一些函数,GLView可以操作的帧信息EGL视图)//GLView是一个抽象类//cocos2d-x提供GLViewImpl,继承它为默认渲染器上下文,你也可以有自己的GLViewImpl,通过继承重写auto glview = director->getOpenGLView();//判空if(!glview) {//创建窗口名glview = GLViewImpl::create("Cpp Empty Test");//设置opengl的视图director->setOpenGLView(glview);}director->setOpenGLView(glview);// 设置决定的分辨率glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);//获取EGL视图大小Size frameSize = glview->getFrameSize();//一个string容器vector<string> searchPath;//在这个例子里,我们选择资源根据画面的高度//如果资源不同于我们的分辨率大小,你需要设置一个contentScaleFactor//我们使用资源的高度比的高度设计解决//这样我们可以确保资源的高度 填充设计分辨率的高度//如果画面的高度比设备的小,选择大的资源if (frameSize.height > mediumResource.size.height){//高度大于设备高度//设置选择资源路径searchPath.push_back(largeResource.directory);//设置比例(高分辨率的设备可能有一个更高的表面比屏幕尺寸大小)director->setContentScaleFactor(MIN(largeResource.size.height/designResolutionSize.height, largeResource.size.width/designResolutionSize.width));}//如果画面高度大于设置资源高度,选择设置资源else if (frameSize.height > smallResource.size.height){searchPath.push_back(mediumResource.directory);director->setContentScaleFactor(MIN(mediumResource.size.height/designResolutionSize.height, mediumResource.size.width/designResolutionSize.width));}//如果画面高度小于设置资源高度,选择小的资源else{searchPath.push_back(smallResource.directory);director->setContentScaleFactor(MIN(smallResource.size.height/designResolutionSize.height, smallResource.size.width/designResolutionSize.width));}//设置搜索目录FileUtils::getInstance()->setSearchPaths(searchPath);//  如果你想要加载json,用下面的方法/*cocostudio::ILocalizationManager * lm = cocostudio::JsonLocalizationManager::getInstance();lm->initLanguageData("your localize file name.lang.json");cocostudio::LocalizationHelper::setCurrentManager(lm, false);*///如果你想要 载入二进制数据   .csb 用一下方法/*cocostudio::ILocalizationManager * lm = cocostudio::BinLocalizationManager::getInstance();lm->initLanguageData("your localize file name.lang.csb");cocostudio::LocalizationHelper::setCurrentManager(lm, true);*/// 显示 FPSdirector->setDisplayStats(true);// 设置 FPS.默认值是 1.0/60 director->setAnimationInterval(1.0 / 60);// 创建一个自动释放的场景对象,通过一个静态方法auto scene = HelloWorld::scene();// 运行场景director->runWithScene(scene);return true;
}//这个函数将被调用,当app是不活跃的。例如打来电话了,它就会被唤起
void AppDelegate::applicationDidEnterBackground() {Director::getInstance()->stopAnimation();// 如果使用 SimpleAudioEngine,必须在这pause// SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}//当app再次活跃起来的时候,这个函数会被调用
void AppDelegate::applicationWillEnterForeground() {Director::getInstance()->startAnimation();// 如果使用SimpleAudioEngine, 你必须在这 resume // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}



AppDelegate.cpp中的代码主要实现了游戏启动后执行的操作,游戏启动后的操作:

1、初始化导演类

2、创建的窗口

3、设置openGL 视图

4、设置动画的帧数显示和帧率

5、调用场景

6、运行场景(游戏真正的开始)


#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"class HelloWorld : public cocos2d::Layer
{
public://初始化层 virtual bool init() override;//创建场景  static cocos2d::Scene* scene();// 响应消息  void menuCloseCallback(Ref* sender);// //用于创建:场景、菜单、层等东西 ,宏函数CREATE_FUNC(HelloWorld);
};#endif // __HELLOWORLD_SCENE_H__

#include "HelloWorldScene.h"
#include "AppMacros.h"USING_NS_CC;Scene* HelloWorld::scene()
{//'scene'是一个自动释放的对象auto scene = Scene::create();// 'layer'是一个自动释放的对象HelloWorld *layer = HelloWorld::create();// 把 layer作为一个儿子加到 scene上scene->addChild(layer);// 返回 scenereturn scene;
}// 在 "init" 你需要初始化你想要的实例
bool HelloWorld::init()
{//// 1. 父类 首先初始化if ( !Layer::init() ){return false;}/************************************************************************//*  FrameSize就是屏幕的实际分辨率,这是不变的,比如我用的盖世三的手机分辨率为1280x720,这就是盖世三的FrameSize。注意这个FrameSize很容易理解成屏幕的长宽多少,其实不是,分辨率和实际的长宽没有必然联系。比如:盖世3的尺寸(长宽)为4.8寸,分辨率为1280x720盖世4的尺寸(长宽)为4.99寸,分辨率为1920x1080所以在设计游戏时,只考虑屏幕的分辨率即可,不用考虑屏幕的实际长宽。                                                                     *//************************************************************************//*WinSize就是设计分辨率,相当于游戏设计的逻辑大小,可以这样理解,上面的FrameSize就是画框,这里的WinSize就是画布。VisibleSize就是画布显示在画框中的部分,注意:它的大小是用WinSize来表示的。VisibleOrigin就是VisibleSize在画框中的左下角坐标点,注意也是用WinSize来表示的。
*/auto visibleSize = Director::getInstance()->getVisibleSize();auto origin = Director::getInstance()->getVisibleOrigin();// 添加一个关闭按钮icon,设置回调函数,这是一个自动释放的对象auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));closeItem->setPosition(origin + Vec2(visibleSize) - Vec2(closeItem->getContentSize() / 2));//常见一个菜单,它是一个自动释放的对象auto menu = Menu::create(closeItem, nullptr);menu->setPosition(Vec2::ZERO);this->addChild(menu, 1);//常见一个label标签,字体是arial.ttfauto label = Label::createWithTTF("Hello World", "fonts/arial.ttf", TITLE_FONT_SIZE);// label的位置设置到屏幕中心label->setPosition(origin.x + visibleSize.width/2,origin.y + visibleSize.height - label->getContentSize().height);//添加标签到这个层上this->addChild(label, 1);// 添加HelloWorld图片auto sprite = Sprite::create("HelloWorld.png");//精灵的位置在屏幕中心sprite->setPosition(Vec2(visibleSize / 2) + origin);// 把精灵作为儿子加到层上this->addChild(sprite);return true;
}//回调函数
void HelloWorld::menuCloseCallback(Ref* sender)
{//Director结束执行,释放资源Director::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)//IOS的退出exit(0);
#endif
}

HelloWorldScene.cpp中的代码中的Scene* HelloWorld::scene(),实现了创建场景的过程:

1、创建场景

2、创建层 

3、将层加到场景上

4、返回场景

HelloWorldScene.cpp中的代码中的Scene* HelloWorld::init(),实现了初始化实例:

1、初始化父类的Layer

2、得到窗口的大小(WinSiez)

3、得到窗口的坐标(左下角点)

4、创建关闭按钮(Normal、Push)和回调函数

5、设置关闭按钮的位置

6、创建菜单项

7、设置菜单项的位置

8、设置菜单的位置

9、将菜单加到层中

10、创建标签

11、设置标签的位置

12、将标签加到层上

13、创建精灵

14、设置精灵的位置

15、将精灵加到层上




转载于:https://www.cnblogs.com/hiwoshixiaoyu/p/10035086.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NO.1 python_人工智能_学习路线

***##学习路线&#xff1a;* 1.python基础 计算机组成原理、python开发环境、python变量、流程控制语句、文件操作、异常处理、模块与包、飞机大战游戏制作等 2.python高级应用 网络编程、并发编程、数据库编程、正则表达式、Linux系统应用、函数的高级应用、python的语法进阶…

iOS开发网络篇—数据缓存

iOS开发网络篇—数据缓存 一、关于同一个URL的多次请求 有时候&#xff0c;对同一个URL请求多次&#xff0c;返回的数据可能都是一样的&#xff0c;比如服务器上的某张图片&#xff0c;无论下载多少次&#xff0c;返回的数据都是一样的。 上面的情况会造成以下问题 &#xff08…

[WinError 10061] 由于目标计算机积极拒绝,无法连接错误解决办法

爬虫的时候会经常出现"[WinError 10061] 由于目标计算机积极拒绝&#xff0c;无法连接"错误这种情况&#xff0c;有可能是LAN口设置不正确 我是在爬取全国天气情况的时候出现的这种错误&#xff0c;后面调了以后可以了1.控制面板——网络和 Internet—— Internet选项…

这门课有什么用?

每个老师都苦恼于学生常问的问题&#xff1a;“某某课学了有什么用&#xff1f;”老师费劲巴拉解释一通&#xff0c;结果还是&#xff1a;然并卵。 一门课有什么用&#xff0c;很难解释得令人信服&#xff0c;因为这和人的认知水平有关。认知水平达不到&#xff0c;解释的多深入…

NO.1_python_scrapy组成爬取多页数据连接数据库配置文件书写

scrapy框架组成及各部分作用 item pipelines: 用于存放需要存储数据的数据模型&#xff0c;一般格式为&#xff1a; #需要存储多少中类型的数据就写多少行&#xff0c;一般是key_value组合 数据名称&#xff0c;即key scrapy.Field()spiders 用于解析返回来的response im…

“智云大咖秀”:大咖摄影师谈惊艳亮相的“大咖级”设备

古人云&#xff0c;善书者不择笔。 古人又云&#xff0c;工欲善其事必先利其器。 古人很矛盾。 这两句话如果用在影像创作这个领域&#xff0c;可以说都有道理&#xff1a;没有好的设备&#xff0c;创意大师一样能够拍出足够惊艳的作品&#xff1b;有足够强的设备&#xff0c;但…

Cobub无码埋点关键技术的实现

随着大数据时代的到来&#xff0c;数据采集也已经变的越来越重要。前端埋点作为一个比较成熟的数据接入手段被广泛应用着。目前埋点分为两种方式&#xff0c;有码与无码埋点。有码埋点比较容易理解&#xff0c;即调用SDK的API&#xff0c;在代码中插入埋点的相关代码&#xff0…

Dedesql数据库类详解(二次开发必备教程)(转)

http://www.dedecms.com/help/development/2009/1028/1076.html 织梦DedeCMS的二次开发不仅仅是会写写织梦的标签&#xff0c;会制作织梦的模板。很多时候&#xff0c;我们需要对织梦DedeCMS的数据库进行查询、插入、删除等等之类的操作&#xff0c;进行这一类的操作之前&#…

留言板

本软件是作为部门内员工之间留言及发送消息使用。 系统必须通过口令验证&#xff0c;登录进入。方法是从数据库内取出用户姓名和口令的数据进行校验。 系统包含四部分功能 1 登录&#xff1a;验证用户名与口令&#xff0c;保存会话信息&#xff0c;进入主界面。 界面显示代码 &…

2017-2018-1 20155301 《信息安全系统设计基础》第7周学习总结

2017-2018-1 20155301 《信息安全系统设计基础》第7周学习总结 教材学习内容总结 作为我们处理器实现的运行实例&#xff0c;因为受x86-64指令集的启发&#xff0c;它被俗称为“x86”&#xff0c;所以我们称我们的指令集为“Y86-64”&#xff0c;与“x86-64”相比&#xff0c;Y…

Dubbo原理解析-监控

Dubbo发布代码中&#xff0c;自带了一个简易的监控中心实现。对于一般的小业务这个监控中心应该能够满足需求&#xff0c;对于那些大业务量的大公司一般都会有自己的监控中心&#xff0c;更加丰富的功能如常用的报警短信通知等等。这章讲解分析使得读者能够了解一般的监控中心实…

学习笔记(04):Python网络编程并发编程-什么是socket

立即学习:https://edu.csdn.net/course/play/24458/296233?utm_sourceblogtoedu 1.什么是网络编程&#xff1f; 答&#xff1a;网络编程也叫做socket编程即套接字编程&#xff0c;基于遵循socket套接字的规定进行的编程 2.什么是socket&#xff1f; 答&#xff1a;socket就是…

JeeSite 4.0 说说前端的那些事

2019独角兽企业重金招聘Python工程师标准>>> 引言 一个不得不说的话题&#xff0c;经过近几年的发展&#xff0c;Web前端开发已经不是一个新有的岗位了&#xff0c;前端技术发展非常迅速&#xff0c;技术更新换代也很快&#xff0c;对于前端工程师来说是一个很大的挑…

程序包com.sun.istack.internal不存在

添加一下依赖 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version></dependency&…

iOS微博项目(七)发微博和定位

class a导入class b&#xff0c;class b导入class a 会出现错误 如果keyboard不显示&#xff0c;应该是hardware-》connect选择了 1. 发微博UI 2.定位 一直不回调&#xff0c;后来发现是ios8后方法更新了&#xff1a;http://blog.devzeng.com/blog/ios8-corelocation-framework…

设计模式之UML类图

在学设计模式的过程中经常碰到各式各样的UML类图。那些眼花缭乱的符号有什么含义呢&#xff1f; 类图含义 类图中的关系 从网上找来一张图作为实例 依赖关系&#xff1a;比如动物依赖氧气和水&#xff0c;这里如学生要依赖自行车。用虚线箭头表示。关联关系&#xff1a;学生和身…

tomcat启动报:No Spring WebApplicationInitializer types detected on classpath

2019独角兽企业重金招聘Python工程师标准>>> 对于maven项目&#xff0c;tomcat启动不加载spring配置文件&#xff0c;是因为找不到web.xml文件 右键项目properties 选择 Deployment Assembly 编辑 Web Deployment Assembly&#xff0c;注意主要是红色线框中的路径 …

Linux-正则表达式学习(精)

正则表达式30分钟入门教程 来园子之前写的一篇正则表达式教程&#xff0c;部分翻译自codeproject的The 30 Minute Regex Tutorial。 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了如果有问题,再到这里来提出. 一些要说的话&#xff1a; 如果你没有正则表…

Flume sink=avro rpc connection error

要求 conf 文件 a1.sourcesr1 a1.sinksk1 a1.channelsc1a1.sources.r1.typeavro a1.sources.r1.bindmaster a1.sources.r1.port9999a1.sinks.k1.typeavro a1.sinks.k1.hostnameslave1 a1.sinks.k1.port7777a1.channels.c1.typememory a1.channels.c1.capacity1000 a1.channels.…

【腾许Bugly干货分享】“HTTPS”安全在哪里?

背景 最近基于兴趣学学习了下 HTTPS 相关的知识&#xff0c;在此记录下学习心得。 在上网获取信息的过程中&#xff0c;我们接触最多的信息加密传输方式也莫过于 HTTPS 了。每当访问一个站点&#xff0c;浏览器的地址栏中出现绿色图标时&#xff0c;意味着该站点支持 HTTPS 信息…