我們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、將精靈加到層上