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.pswp.cn/news/257153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安卓中bundle的使用

Bundle類用作攜帶數據&#xff0c;它類似于Map&#xff0c;用于存放key-value形式的值&#xff0c;相對于Map&#xff0c;它提供了各種常用類型的putXxx()/getXxx()方法&#xff0c;Bundle的內部實際上是使用了HashMap類型的變量來存放PutXxx()方法存入的值。 SDK里是這樣描述&…

NO.1 python_人工智能_學習路線

***##學習路線&#xff1a;* 1.python基礎 計算機組成原理、python開發環境、python變量、流程控制語句、文件操作、異常處理、模塊與包、飛機大戰游戲制作等 2.python高級應用 網絡編程、并發編程、數據庫編程、正則表達式、Linux系統應用、函數的高級應用、python的語法進階…

wds+mdt 分布式自動部署 操作系統

一、 安裝準備 1、工具的準備 首先介紹本次項目所涉及到的內容&#xff1a; MDT Microsoft Deployment Toolkit 2012&#xff08;簡稱MDT 2012&#xff09;是微軟最新一代部署工具&#xff0c;通過它可以自動完成桌面和服務器部署的推薦操作進程和工具&#xff0c;MDT主要…

iOS開發網絡篇—數據緩存

iOS開發網絡篇—數據緩存 一、關于同一個URL的多次請求 有時候&#xff0c;對同一個URL請求多次&#xff0c;返回的數據可能都是一樣的&#xff0c;比如服務器上的某張圖片&#xff0c;無論下載多少次&#xff0c;返回的數據都是一樣的。 上面的情況會造成以下問題 &#xff08…

[WinError 10061] 由于目標計算機積極拒絕,無法連接錯誤解決辦法

爬蟲的時候會經常出現"[WinError 10061] 由于目標計算機積極拒絕&#xff0c;無法連接"錯誤這種情況&#xff0c;有可能是LAN口設置不正確 我是在爬取全國天氣情況的時候出現的這種錯誤&#xff0c;后面調了以后可以了1.控制面板——網絡和 Internet—— Internet選項…

Chrome瀏覽器設置小窗口視頻

快捷工具先安裝1.28版本后用1.31版本替換&#xff0c;以實現視頻彈窗和雙擊關閉標簽頁功能。 首先下載Chrome擴展快捷工具1.28版的CRX安裝包&#xff1a;http://pan.baidu.com/s/1pJ4T4td&#xff1b; 然后拖放到chrome擴展管理頁面中安裝。 接著&#xff0c;下載打包好的快捷…

這門課有什么用?

每個老師都苦惱于學生常問的問題&#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;但…

英語 用on還是/at/還是in

in prep. 1. [表示地點、場所、位置等]在…里面&#xff1b;在…內部&#xff1b;在…上&#xff1a;例句: in the room 在房間里 2. [表示時間]在…期間&#xff1b;在(一段時間)以內&#xff1b;過…之久&#xff1a;例句: in summer 在夏天in 3. [表示狀態]在…狀態中&…

js編寫簡易返回頂部按鈕

之前ui設計讓我做個返回頂部的按鈕,我一定頭緒都沒,感覺真要加上這個功能,自己編寫就得一個下午,工作量大為由,所以就推脫了; 當靜下心,有時間搗鼓之后才發現原來so easy!!! 以下是我的js代碼,不足之處還請博友們批評指正; //原生js操作代碼  function scrolls(){   v…

NO.2_python_scrapy_反爬蟲(隨機請求頭IP代理)取消鏈接去重

1.隨機請求頭 # -*- coding: utf-8 -*- """ 所有請求頭的USER_AGENTS網址 http://www.useragentstring.com/pages/useragentstring.php?nameAll """ import json import random import requestsUSER_AGENTS [Mozilla/5.0 (Windows NT 10.0; W…

Cobub無碼埋點關鍵技術的實現

隨著大數據時代的到來&#xff0c;數據采集也已經變的越來越重要。前端埋點作為一個比較成熟的數據接入手段被廣泛應用著。目前埋點分為兩種方式&#xff0c;有碼與無碼埋點。有碼埋點比較容易理解&#xff0c;即調用SDK的API&#xff0c;在代碼中插入埋點的相關代碼&#xff0…

Dedesql數據庫類詳解(二次開發必備教程)(轉)

http://www.dedecms.com/help/development/2009/1028/1076.html 織夢DedeCMS的二次開發不僅僅是會寫寫織夢的標簽&#xff0c;會制作織夢的模板。很多時候&#xff0c;我們需要對織夢DedeCMS的數據庫進行查詢、插入、刪除等等之類的操作&#xff0c;進行這一類的操作之前&#…

裝系統換固態硬盤方法

1、將買回的固態硬盤直接換上電腦的原先機械硬盤 2、或者將自己的光驅拆卸&#xff0c;將固態硬盤裝上去 3、電腦進入boss 界面&#xff0c;找到boot(引導)欄&#xff0c;找到自己的u盤&#xff0c;進入后先分區&#xff0c;然后再重啟&#xff0c; 然后再進入BOSS進入U盤里&…

學習筆記(02):Python網絡編程并發編程-assert斷言的用途

立即學習:https://edu.csdn.net/course/play/24458/296228?utm_sourceblogtoedu 異常處理 1.異常的捕捉 try:正常需要運行的代碼except 可能出現的錯誤 as e:出現這種錯誤需要運行的代碼...except Exception as e:捕捉未知的錯誤&#xff0c;并且將需要運行的代碼放于此處el…

ionic tab顯示到頂部去了

添加配置調整顯示位置 .config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider) {$ionicConfigProvider.platform.ios.tabs.style(standard);$ionicConfigProvider.platform.ios.tabs.position(bottom);$ionicConfigProvider.platform.android.tabs.style(…

EasyUI加載外部頁面需要使用html片段

最后總結&#xff0c;如果使用easyui中加載外部界面的組件&#xff0c;例如&#xff1a;panel,window&#xff0c;dailog,tabs等。請確保引入的界面是一個html片段。html片段正確的寫法再次提醒不要出現<html><head><body>三個標簽。 http://www.cnblogs.com…

留言板

本軟件是作為部門內員工之間留言及發送消息使用。 系統必須通過口令驗證&#xff0c;登錄進入。方法是從數據庫內取出用戶姓名和口令的數據進行校驗。 系統包含四部分功能 1 登錄&#xff1a;驗證用戶名與口令&#xff0c;保存會話信息&#xff0c;進入主界面。 界面顯示代碼 &…

c++的32位和64位類型符的位數

看一下結果&#xff1a;WIN32下&#xff1a;sizeof(char):1sizeof(short):2sizeof(int):4sizeof(long):4sizeof(long long):8sizeof(unsigned int):4sizeof(float):4sizeof(double):8sizeof(pointer):4請按任意鍵繼續. . .x64下&#xff1a;sizeof(char):1sizeof(short):2sizeo…