首页 > 代码库 > cocos2d-x C++ 原始工程引擎运行机制解析
cocos2d-x C++ 原始工程引擎运行机制解析
新建一个工程,相信感兴趣的同学都想知道cocos引擎都是如何运行的
想知道是如何运行的,看懂四个文件即可
话不多说,上代码:
1、首先解释 AppDelegate.h
1 #ifndef _APP_DELEGATE_H_ 2 #define _APP_DELEGATE_H_ 3 4 #include "cocos2d.h" 5 6 /** 7 @brief The cocos2d Application. 8 9 Private inheritance here hides part of interface from Director. 10 */ //从这里可以看到AppDelegate继承了cocos2d::Application ,而cocos2d::Application是cocos2d-x引擎提供的基类 11 class AppDelegate : private cocos2d::Application 12 { 13 public: 14 AppDelegate(); 15 virtual ~AppDelegate(); 16 /* 17 18 */ 19 virtual void initGLContextAttrs(); 20 21 /** 22 @brief Implement Director and Scene init code here. 23 @return true Initialize success, app continue. 24 @return false Initialize failed, app terminate. 25 *游戏启动时调用的函数,在这里可以初始化导演对象和场景对象 26 */ 27 virtual bool applicationDidFinishLaunching(); 28 29 /** 30 @brief Called when the application moves to the background 31 @param the pointer of the application 32 *游戏进入后台时调用的函数 33 */ 34 virtual void applicationDidEnterBackground(); 35 36 /** 37 @brief Called when the application reenters the foreground 38 @param the pointer of the application 39 *游戏进入前台时调用的函数 40 */ 41 virtual void applicationWillEnterForeground(); 42 }; 43 44 #endif // _APP_DELEGATE_H_
2、AppDelegate.cpp
#include "AppDelegate.h" #include "HelloWorldScene.h" USING_NS_CC;//这个是cocos2d-x提供的一个宏,它是用来替换 using namespace cocos2d语句的。 static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320); static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320); static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768); static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536); AppDelegate::AppDelegate() { } AppDelegate::~AppDelegate() { } // if you want a different context, modify the value of glContextAttrs // it will affect all platforms void AppDelegate::initGLContextAttrs() { // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); } // if you want to use the package manager to install more packages, // don‘t modify or remove this function static int register_all_packages() { return 0; //flag for packages manager } // 游戏启动时调用的函数 bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance();//初始化导演类 auto glview = director->getOpenGLView(); if(!glview) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) glview = GLViewImpl::createWithRect("NotesDamo", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height)); #else glview = GLViewImpl::create("NotesDamo"); #endif director->setOpenGLView(glview);//设置导演类的OpenGL视图 } // turn on display FPS director->setDisplayStats(true);//设置是否在屏幕上显示帧率信息(一般都是为了测试,实际发布时是不会显示的) // set FPS. the default value is 1.0/60 if you don‘t call this director->setAnimationInterval(1.0f / 60);//一秒执行60帧 // Set the design resolution glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER); auto frameSize = glview->getFrameSize(); // if the frame‘s height is larger than the height of medium size. if (frameSize.height > mediumResolutionSize.height) { director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width)); } // if the frame‘s height is larger than the height of small size. else if (frameSize.height > smallResolutionSize.height) { director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width)); } // if the frame‘s height is smaller than the height of medium size. else { director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width)); } register_all_packages(); // create a scene. it‘s an autorelease object auto scene = HelloWorld::createScene();//创建导演类对象scene // run director->runWithScene(scene);//运行该场景(会使游戏进入该场景) return true; } // This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. //游戏进入后台时调用的函数 void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stopAnimation();//停止场景中的动画 // if you use SimpleAudioEngine, it must be paused // 停止背景音乐,默认时注释掉的 // SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); } // this function will be called when the app is active again // 游戏进入前台时调用的函数 void AppDelegate::applicationWillEnterForeground() { Director::getInstance()->startAnimation();//开始场景中的动画 // if you use SimpleAudioEngine, it must resume here // 继续背景音乐的,默认是注释掉的 // SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); }
3、HelloWorldScene.h
1 #ifndef __HELLOWORLD_SCENE_H__ 2 #define __HELLOWORLD_SCENE_H__ 3 4 #include "cocos2d.h" 5 6 7 /* 8 *在这里我们可以看出,HelloWorld类继承了cocos2d::Layer类;它被称为层(layer),这些层被放到了场景(scene)中,场景类是:cocos2d::Scene; 9 注意:HelloWorld.h虽然命名为场景,但是它内部定义的HelloWorld类是一个层 10 */ 11 //HelloWorld继承了cocos2d::Layer,HelloWorld是一个层,而不是场景。 12 class HelloWorld : public cocos2d::Layer 13 { 14 15 public: 16 17 static cocos2d::Menu* m_pSelectedItem(); 18 19 virtual ~HelloWorld(){} 20 21 static cocos2d::Scene* createScene();//声明创建当前的层HelloWorld所在场景的静态函数createScene(); 22 23 virtual bool init();//声明初始化层HelloWorld实例函数。 24 25 // a selector callback 26 void menuCloseCallback(cocos2d::Ref* pSender);//声明菜单回调函数menuCloseCallback,用于触摸菜单事件的回调。 27 28 CREATE_FUNC(HelloWorld);//CREATE_FUNC是cocos2d-x中定义的一个宏(作用是:创建一个静态函数"static create()",该函数可以用来创建层); 29 30 31 32 // implement the "static create()" method manually 33 34 }; 35 36 #endif // __HELLOWORLD_SCENE_H__
4、HelloWorldScene.cpp
1 #include "HelloWorldScene.h" 2 #include "SimpleAudioEngine.h" 3 4 USING_NS_CC; 5 /* 6 说明:createScene()函数式是在游戏应用启动的时候,在AppDelegate中的bool AppDelegate::applicationDidFinishLaunching()函数中通过 auto scene = HelloWorld::createScene()语句调用的。 7 createScene()中做了三件事情,首先创建了HelloWorld层所在的场景对象,其次创建了HelloWorld层,最后将HelloWorld层添加到场景scene中; 8 */ 9 Scene* HelloWorld::createScene() 10 { 11 // ‘scene‘ is an autorelease object 12 auto scene = Scene::create(); 13 14 // ‘layer‘ is an autorelease object 15 // 当调用到这句创建层的时候,会调用HelloWorld的实例函数init(),达到初始化HelloWorld层的目的。 16 auto layer = HelloWorld::create(); 17 18 // add layer as a child to scene 19 scene->addChild(layer); 20 21 // return the scene 22 return scene; 23 } 24 25 // on "init" you need to initialize your instance 26 bool HelloWorld::init() 27 { 28 ////////////////////////////// 29 // 1. super init first 30 // 初始化父类 31 if ( !Layer::init() ) 32 { 33 return false; 34 } 35 36 auto visibleSize = Director::getInstance()->getVisibleSize(); 37 Vec2 origin = Director::getInstance()->getVisibleOrigin(); 38 39 ///////////////////////////// 40 // 2. add a menu item with "X" image, which is clicked to quit the program 41 // you may modify it. 42 43 // add a "close" icon to exit the progress. it‘s an autorelease object 44 // 增加一个菜单项,单机的时候退出程序 45 auto closeItem = MenuItemImage::create( 46 "CloseNormal.png", 47 "CloseSelected.png", 48 CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); 49 50 closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , 51 origin.y + closeItem->getContentSize().height/2)); 52 53 // create menu, it‘s an autorelease object 54 auto menu = Menu::create(closeItem, NULL); 55 menu->setPosition(Vec2::ZERO);//自定义菜单对象的位置 56 this->addChild(menu, 1);//把菜单对象添加到当前HelloWorld层上 57 58 ///////////////////////////// 59 // 3. add your codes below... 60 61 // add a label shows "Hello World" 62 // create and initialize a label 63 64 //添加label标签标题 65 auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24); 66 67 // position the label on the center of the screen 68 label->setPosition(Vec2(origin.x + visibleSize.width/2, 69 origin.y + visibleSize.height - label->getContentSize().height)); 70 71 // add the label as a child to this layer 72 this->addChild(label, 1); 73 74 // add "HelloWorld" splash screen" 75 //添加精灵,也就是cocos2d-x的logo,定义到屏幕中央 76 auto sprite = Sprite::create("HelloWorld.png"); 77 78 // position the sprite on the center of the screen 79 sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); 80 81 // add the sprite as a child to this layer 82 this->addChild(sprite, 0); 83 84 85 return true; 86 } 87 88 // 菜单回调函数(返回主界面) 89 void HelloWorld::menuCloseCallback(Ref* pSender) 90 { 91 //Close the cocos2d-x game scene and quit the application 92 Director::getInstance()->end(); 93 94 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)//IOS表示iOS平台 95 exit(0); 96 #endif 97 98 /*To navigate back to native iOS screen(if present) without quitting the application ,do not use Director::getInstance()->end() and exit(0) as given above,instead trigger a custom event created in RootViewController.mm as below*/ 99 100 //EventCustom customEndEvent("game_scene_close_event"); 101 //_eventDispatcher->dispatchEvent(&customEndEvent); 102 103 104 105 106 // PhysicsShape物理引擎类精灵(也属于精灵) 107 108 109 // 节点 110 //(1)创建节点 111 Node * chilNode = Node::create(); 112 //(2)查找子节点 113 Node *node = node ->getChildByTag(123); 114 //(3)增加新的子节点 115 node->addChild(chilNode,0,123); 116 //(4)删除子节点,并停止该节点上的一切动作 117 node->removeChildByTag(123,true); 118 //(5)通过NOde指针删除节点 119 node ->removeChild(node); 120 //(6)删除所有子节点,并停止这些节点上的一切动作 121 node ->removeAllChildrenWithCleanup(true); 122 //(7)从父节点中删除 node 节点,并停止该节点上的一切动作。 123 node->removeFromParentAndCleanup(true); 124 /*Node重要属性*/ 125 // setPosition; 坐标 126 // setAnchorPoint(Vce2(0.5,.05)); 锚点 127 128 129 130 131 //坐标 132 // Vec2 touchLocation = touch ->getLocationInView(); 133 // Vec2 touchLocation2 = Director::getInstance()->convertToGL(touchLocation); 134 135 136 } 137 138 139 /** 140 cocos2d-x的事件响应机制:即菜单层最先接收到系统事件,则排在后面的是精灵层,最后是背景层,在事件的传递过程中 ,如果有一个层处理了该事件,则排在后面的层将不再接受到该事件。 141 */
cocos2d-x C++ 原始工程引擎运行机制解析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。