cocos2d-x学习之路——分析AppDelegate和HelloWorldScene文件

弱龄寄事外,委怀在琴书。这篇文章主要讲述cocos2d-x学习之路——分析AppDelegate和HelloWorldScene文件相关的知识,希望能为你提供帮助。
【cocos2d-x学习之路——分析AppDelegate和HelloWorldScene文件】这里我们来看一下cocos自动给我们生成的工程里有些什么东西,并且分析一下这些代码的用途,来为我们以后编写cocos程序铺下基础。
这里我建议看我这份随笔的看官先看看cocos官网的快速入门手册,不然可能会比较迷糊(因为待会要分析一些代码,如果以前没见过的话会比较昏)。传送门在这里
其中一些基本不需要程序员干涉的代码我可能会不予分析。你也可以查看官方API手册。传送门在这里
下面的代码分析,如果是非常有用的东西我会在分析中用蓝色标出。
  首先我们进入相关的系统(你的如果是mac就打开proj.ios_mac文件夹下的工程,是windows就打开proj.win32文件夹下的工程,以此类推)的工程。我这里是mac,运行一下cocos给我们生成的代码,结果如下:

cocos2d-x学习之路——分析AppDelegate和HelloWorldScene文件

文章图片

既然是自己的demo嘛,当然要给自己打个广告啦(那个居中的图标显然是cocos的logo)
这个界面里面有一些我们可以直接看出来的东西:
cocos2d-x学习之路——分析AppDelegate和HelloWorldScene文件

文章图片

这里所有的元素都是我根据以往用过的引擎猜测的,实际上我们还是要看一下代码。不过我们目前知道大概有这么些东西了,待会可以针对着看一下。
然后我们可以看看这些资源在哪里,我通过XCODE可以直接看到: 
cocos2d-x学习之路——分析AppDelegate和HelloWorldScene文件

文章图片

这里logo是HelloWorld.png,右下角的开关机图标是CloseNormal.png,而那个CloseSelected.png是按下按钮的图片。
 
分析AppDelegate
好的,到我们的分析阶段了。AppDelegate分为头文件和实现文件。我们当然是先看头文件啦。这个文件在Classes文件夹下。
1 #ifndef_APP_DELEGATE_H_ 2 #define_APP_DELEGATE_H_ 3 4 #include "cocos2d.h" 5 6 /** 7 @briefThe cocos2d Application. 8 9 Private inheritance here hides part of interface from Director. 10 */ 11 classAppDelegate : private cocos2d::Application 12 { 13 public: 14AppDelegate(); //构造函数 15virtual ~AppDelegate(); //析构函数 16 17virtual void initGLContextAttrs(); //这个暂时不知道是干什么的 18 19/** 20@briefImplement Director and Scene init code here. 21@return trueInitialize success, app continue. 22@return falseInitialize failed, app terminate. 23*/ 24virtual bool applicationDidFinishLaunching(); 25 26/** 27@briefCalled when the application moves to the background 28@paramthe pointer of the application 29*/ 30virtual void applicationDidEnterBackground(); 31 32/** 33@briefCalled when the application reenters the foreground 34@paramthe pointer of the application 35*/ 36virtual void applicationWillEnterForeground(); 37 }; 38 39 #endif // _APP_DELEGATE_H_

第4行包含了cocos2d的头文件。
第11行定义了AppDelegate类,继承自cocos2d的Application类。
这里堆AppDelegate类的几个虚函数在注释上都有一定的说明了:
第24行的applicationDidFinishLaunching()是在程序初始化的时候自动调用的函数。在这里面我们可以初始化导演(Director)和场景(Scence)。如果程序初始化成果会返回True,否则返回False。
第30行的applicationDidEnterBackground()是在程序失去焦点的时候调用。这里面一般是加入用来停止程序的代码。
第36行的applicationWillEnterForeground()是在程序获得焦点的时候调用,可以在里面加入继续游戏的代码。
 
接下来看看实现文件:
1 #include "AppDelegate.h" 2 #include "HelloWorldScene.h" 3 4 // #define USE_AUDIO_ENGINE 1 5 // #define USE_SIMPLE_AUDIO_ENGINE 1 6 7 #if USE_AUDIO_ENGINE & & USE_SIMPLE_AUDIO_ENGINE 8 #error "Don\'t use AudioEngine and SimpleAudioEngine at the same time. Please just select one in your game!" 9 #endif 10 11 #if USE_AUDIO_ENGINE 12 #include "audio/include/AudioEngine.h" 13 using namespace cocos2d::experimental; 14 #elif USE_SIMPLE_AUDIO_ENGINE 15 #include "audio/include/SimpleAudioEngine.h" 16 using namespace CocosDenshion; 17 #endif 18 19 USING_NS_CC; 20 21 static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320); 22 static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320); 23 static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768); 24 static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536); 25 26 AppDelegate::AppDelegate() 27 { 28 } 29 30 AppDelegate::~AppDelegate() 31 { 32 #if USE_AUDIO_ENGINE 33AudioEngine::end(); 34 #elif USE_SIMPLE_AUDIO_ENGINE 35SimpleAudioEngine::end(); 36 #endif 37 } 38 39 // if you want a different context, modify the value of glContextAttrs 40 // it will affect all platforms 41 void AppDelegate::initGLContextAttrs()//这个真心没看懂是个啥 42 { 43// set OpenGL context attributes: red,green,blue,alpha,depth,stencil,multisamplesCount 44GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8, 0}; 45 46GLView::setGLContextAttrs(glContextAttrs); 47 } 48 49 // if you want to use the package manager to install more packages, 50 // don\'t modify or remove this function 51 static int register_all_packages() 52 { 53return 0; //flag for packages manager 54 } 55 56 bool AppDelegate::applicationDidFinishLaunching() { 57// initialize director 58auto director = Director::getInstance(); 59auto glview = director-> getOpenGLView(); 60if(!glview) { 61 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) 62glview = GLViewImpl::createWithRect("TestGame", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height)); 63 #else 64glview = GLViewImpl::create("TestGame"); 65 #endif 66director-> setOpenGLView(glview); 67} 68 69// turn on display FPS 70director-> setDisplayStats(true); 71 72// set FPS. the default value is 1.0/60 if you don\'t call this 73director-> setAnimationInterval(1.0f / 60); 74 75// Set the design resolution 76glview-> setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER); //不知道是干啥的 77auto frameSize = glview-> getFrameSize(); 78// if the frame\'s height is larger than the height of medium size. 79if (frameSize.height > mediumResolutionSize.height) 80{ 81director-> setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width)); 82} 83// if the frame\'s height is larger than the height of small size. 84else if (frameSize.height > smallResolutionSize.height) 85{ 86director-> setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width)); 87} 88// if the frame\'s height is smaller than the height of medium size. 89else 90{ 91director-> setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width)); 92} 93 94register_all_packages(); 95 96// create a scene. it\'s an autorelease object 97auto scene = HelloWorld::createScene(); 98 99// run 100director-> runWithScene(scene); 101 102return true; 103 } 104 105 // This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. 106 void AppDelegate::applicationDidEnterBackground() { 107Director::getInstance()-> stopAnimation(); 108 109 #if USE_AUDIO_ENGINE 110AudioEngine::pauseAll(); 111 #elif USE_SIMPLE_AUDIO_ENGINE 112SimpleAudioEngine::getInstance()-> pauseBackgroundMusic(); 113SimpleAudioEngine::getInstance()-> pauseAllEffects(); 114 #endif 115 } 116 117 // this function will be called when the app is active again 118 void AppDelegate::applicationWillEnterForeground() { 119Director::getInstance()-> startAnimation(); 120 121 #if USE_AUDIO_ENGINE 122AudioEngine::resumeAll(); 123 #elif USE_SIMPLE_AUDIO_ENGINE 124SimpleAudioEngine::getInstance()-> resumeBackgroundMusic(); 125SimpleAudioEngine::getInstance()-> resumeAllEffects(); 126 #endif 127 }

  第18行以上的乱七八糟的东西我们就先不看了,无非就是包含头文件啊,使用命名空间什么的。这些暂时不管。
第19行是一个宏,可以进入到里面看看(这个宏后面用到的还比较多):
#define USING_NS_CCusing namespace cocos2d

  可以看到就是使用cocos2d的命名空间。
  • 第21~24行定义了四种大小(从cocos2d::Size可以看出是大小的定义),按照变量名字分别是设计时大小,最小化大小,通常化大小和最大化大小。这里我还是要重复说一下:现在这些只是我们的猜测,具体的还是要看到相关代码才行。
那么我们可以想,我是不是更改一下这些玩意就可以改变窗口大小了呢?嗯……可以尝试一下,就先从designResolutionSize下手吧。
我这里将designResolutionSize参数改成1024,480,果然窗口的大小改变了: 
cocos2d-x学习之路——分析AppDelegate和HelloWorldScene文件

文章图片

不过改变了其他三个尺寸之后窗口没什么变化。暂时先不管吧,反正现在知道designResolutionSize变量存储的是当前窗口的大小就行了