生活随笔
收集整理的這篇文章主要介紹了
Cocos2d-3.x版的HelloWorld工程分析 (二)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
我們HelloWorld 從applicationDidFinishLaunching()后,
大部分人都會從這部分代碼開始研究,如果想要研究main函數(shù) 如何調(diào)用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;
//標(biāo)準(zhǔn)命名空間
using namespace std;
//構(gòu)造函數(shù)
AppDelegate::AppDelegate() {}
//析構(gòu)函數(shù)
AppDelegate::~AppDelegate()
{
}//初始化OpenGl的上下文屬性
void AppDelegate::initGLContextAttrs()
{GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};GLView::setGLContextAttrs(glContextAttrs);
}bool AppDelegate::applicationDidFinishLaunching() {// 獲取導(dǎo)演實例auto director = Director::getInstance();//獲取導(dǎo)演的GLView對象(通過一些函數(shù),GLView可以操作的幀信息EGL視圖)//GLView是一個抽象類//cocos2d-x提供GLViewImpl,繼承它為默認(rèn)渲染器上下文,你也可以有自己的GLViewImpl,通過繼承重寫auto glview = director->getOpenGLView();//判空if(!glview) {//創(chuàng)建窗口名glview = GLViewImpl::create("Cpp Empty Test");//設(shè)置opengl的視圖director->setOpenGLView(glview);}director->setOpenGLView(glview);// 設(shè)置決定的分辨率glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);//獲取EGL視圖大小Size frameSize = glview->getFrameSize();//一個string容器vector<string> searchPath;//在這個例子里,我們選擇資源根據(jù)畫面的高度//如果資源不同于我們的分辨率大小,你需要設(shè)置一個contentScaleFactor//我們使用資源的高度比的高度設(shè)計解決//這樣我們可以確保資源的高度 填充設(shè)計分辨率的高度//如果畫面的高度比設(shè)備的小,選擇大的資源if (frameSize.height > mediumResource.size.height){//高度大于設(shè)備高度//設(shè)置選擇資源路徑searchPath.push_back(largeResource.directory);//設(shè)置比例(高分辨率的設(shè)備可能有一個更高的表面比屏幕尺寸大小)director->setContentScaleFactor(MIN(largeResource.size.height/designResolutionSize.height, largeResource.size.width/designResolutionSize.width));}//如果畫面高度大于設(shè)置資源高度,選擇設(shè)置資源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));}//如果畫面高度小于設(shè)置資源高度,選擇小的資源else{searchPath.push_back(smallResource.directory);director->setContentScaleFactor(MIN(smallResource.size.height/designResolutionSize.height, smallResource.size.width/designResolutionSize.width));}//設(shè)置搜索目錄FileUtils::getInstance()->setSearchPaths(searchPath);// 如果你想要加載json,用下面的方法/*cocostudio::ILocalizationManager * lm = cocostudio::JsonLocalizationManager::getInstance();lm->initLanguageData("your localize file name.lang.json");cocostudio::LocalizationHelper::setCurrentManager(lm, false);*///如果你想要 載入二進制數(shù)據(jù) .csb 用一下方法/*cocostudio::ILocalizationManager * lm = cocostudio::BinLocalizationManager::getInstance();lm->initLanguageData("your localize file name.lang.csb");cocostudio::LocalizationHelper::setCurrentManager(lm, true);*/// 顯示 FPSdirector->setDisplayStats(true);// 設(shè)置 FPS.默認(rèn)值是 1.0/60 director->setAnimationInterval(1.0 / 60);// 創(chuàng)建一個自動釋放的場景對象,通過一個靜態(tài)方法auto scene = HelloWorld::scene();// 運行場景director->runWithScene(scene);return true;
}//這個函數(shù)將被調(diào)用,當(dāng)app是不活躍的。例如打來電話了,它就會被喚起
void AppDelegate::applicationDidEnterBackground() {Director::getInstance()->stopAnimation();// 如果使用 SimpleAudioEngine,必須在這pause// SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}//當(dāng)app再次活躍起來的時候,這個函數(shù)會被調(diào)用
void AppDelegate::applicationWillEnterForeground() {Director::getInstance()->startAnimation();// 如果使用SimpleAudioEngine, 你必須在這 resume // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}
AppDelegate.cpp中的代碼主要實現(xiàn)了游戲啟動后執(zhí)行的操作,游戲啟動后的操作:
1、初始化導(dǎo)演類
2、創(chuàng)建的窗口
3、設(shè)置openGL 視圖
4、設(shè)置動畫的幀數(shù)顯示和幀率
5、調(diào)用場景
6、運行場景(游戲真正的開始)
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"class HelloWorld : public cocos2d::Layer
{
public://初始化層 virtual bool init() override;//創(chuàng)建場景 static cocos2d::Scene* scene();// 響應(yīng)消息 void menuCloseCallback(Ref* sender);// //用于創(chuàng)建:場景、菜單、層等東西 ,宏函數(shù)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很容易理解成屏幕的長寬多少,其實不是,分辨率和實際的長寬沒有必然聯(lián)系。比如:蓋世3的尺寸(長寬)為4.8寸,分辨率為1280x720蓋世4的尺寸(長寬)為4.99寸,分辨率為1920x1080所以在設(shè)計游戲時,只考慮屏幕的分辨率即可,不用考慮屏幕的實際長寬。 *//************************************************************************//*WinSize就是設(shè)計分辨率,相當(dāng)于游戲設(shè)計的邏輯大小,可以這樣理解,上面的FrameSize就是畫框,這里的WinSize就是畫布。VisibleSize就是畫布顯示在畫框中的部分,注意:它的大小是用WinSize來表示的。VisibleOrigin就是VisibleSize在畫框中的左下角坐標(biāo)點,注意也是用WinSize來表示的。
*/auto visibleSize = Director::getInstance()->getVisibleSize();auto origin = Director::getInstance()->getVisibleOrigin();// 添加一個關(guān)閉按鈕icon,設(shè)置回調(diào)函數(shù),這是一個自動釋放的對象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標(biāo)簽,字體是arial.ttfauto label = Label::createWithTTF("Hello World", "fonts/arial.ttf", TITLE_FONT_SIZE);// label的位置設(shè)置到屏幕中心label->setPosition(origin.x + visibleSize.width/2,origin.y + visibleSize.height - label->getContentSize().height);//添加標(biāo)簽到這個層上this->addChild(label, 1);// 添加HelloWorld圖片auto sprite = Sprite::create("HelloWorld.png");//精靈的位置在屏幕中心sprite->setPosition(Vec2(visibleSize / 2) + origin);// 把精靈作為兒子加到層上this->addChild(sprite);return true;
}//回調(diào)函數(shù)
void HelloWorld::menuCloseCallback(Ref* sender)
{//Director結(jié)束執(zhí)行,釋放資源Director::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)//IOS的退出exit(0);
#endif
}
HelloWorldScene.cpp中的代碼中的Scene* HelloWorld::scene(),實現(xiàn)了創(chuàng)建場景的過程:
1、創(chuàng)建場景
2、創(chuàng)建層?
3、將層加到場景上 4、返回場景
HelloWorldScene.cpp中的代碼中的Scene* HelloWorld::init(),實現(xiàn)了初始化實例:
1、初始化父類的Layer
2、得到窗口的大小(WinSiez)
3、得到窗口的坐標(biāo)(左下角點)
4、創(chuàng)建關(guān)閉按鈕(Normal、Push)和回調(diào)函數(shù)
5、設(shè)置關(guān)閉按鈕的位置
6、創(chuàng)建菜單項
7、設(shè)置菜單項的位置
8、設(shè)置菜單的位置
9、將菜單加到層中
10、創(chuàng)建標(biāo)簽
11、設(shè)置標(biāo)簽的位置
12、將標(biāo)簽加到層上
13、創(chuàng)建精靈
14、設(shè)置精靈的位置
15、將精靈加到層上
轉(zhuǎn)載于:https://www.cnblogs.com/hiwoshixiaoyu/p/10035086.html
總結(jié)
以上是生活随笔為你收集整理的Cocos2d-3.x版的HelloWorld工程分析 (二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。