a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

Cocos2d-x學(xué)習(xí)筆記之Hello World源碼分析

2020-01-26 15:20:15
字體:
供稿:網(wǎng)友

首先我們來說一下游戲的原理,游戲類似于一場(chǎng)電影,早期的電影不就是靠一張張的圖片放出來的嗎?把場(chǎng)景人物什么的畫在一幅幅圖片上,然后從第一張圖片開始播放就可以了。游戲更是如此,其實(shí)我們玩的游戲看到的畫面都是美工做出來的,我們程序員要做的事情是組織這些圖片,比如先弄個(gè)背景圖片,然后在某一個(gè)坐標(biāo)上放置一個(gè)人物的圖片,我們寫好程序,控制這個(gè)圖片的移動(dòng)路徑,等機(jī)器運(yùn)行的時(shí)候每秒都要刷新畫面,我們就看到人物動(dòng)了起來。而刷新頁面的快慢就是我們所說的幀率,這個(gè)在程序中我們可以控制。整體的意思就是游戲不過是一些圖片罷了,而我們就是控制這些圖片,讓這些圖片運(yùn)動(dòng),當(dāng)用戶單擊圖片的時(shí)候我們做一些事件響應(yīng)的處理等等,當(dāng)然還有一些其他的工作。然后cocos2d-x中有一些基本的類,比如導(dǎo)演類,這個(gè)是用來控制整個(gè)游戲的,正如正真的導(dǎo)演一樣,每個(gè)游戲中只有一個(gè)導(dǎo)演,是一種單例設(shè)計(jì)模式。還有場(chǎng)景類,圖層類,使用最廣的就是精靈類,場(chǎng)景里邊可以包含圖層,圖層上包含精靈。下面我們就通過這個(gè)helloworld場(chǎng)景來進(jìn)入cocos2d-x的編程世界吧。

我們先把結(jié)果運(yùn)行出來,看著圖來說明代碼的含義。大多數(shù)代碼的含義都有注釋,大家可以看代碼了。

首先是main.cpp

#include "main.h"#include "AppDelegate.h"#include "CCEGLView.h"USING_NS_CC;// uncomment below line, open debug console// #define USE_WIN32_CONSOLEint APIENTRY _tWinMain(HINSTANCE hInstance,            HINSTANCE hPrevInstance,            LPTSTR  lpCmdLine,            int    nCmdShow){  UNREFERENCED_PARAMETER(hPrevInstance);  UNREFERENCED_PARAMETER(lpCmdLine);#ifdef USE_WIN32_CONSOLE  AllocConsole();  freopen("CONIN$", "r", stdin);  freopen("CONOUT$", "w", stdout);  freopen("CONOUT$", "w", stderr);#endif  // create the application instance  AppDelegate app;	//CCEGLView是單例設(shè)計(jì)模式,通過調(diào)用sharedOpenGLView()(以后只要是看到shared...就代表是一種單例設(shè)計(jì)模式)函數(shù),獲得全局唯一的opengl圖像引擎的實(shí)例  CCEGLView* eglView = CCEGLView::sharedOpenGLView();	//以下這句比較重要,setFrameSize(x,y)是設(shè)置游戲窗口的大小,通過改變傳入的值,可以改變游戲窗口的大小,看到窗口頂部的那行字了嗎,就是寫的窗口的大小  eglView->setFrameSize(480, 320);  int ret = CCApplication::sharedApplication()->run();#ifdef USE_WIN32_CONSOLE  FreeConsole();#endif  return ret;}

Appdelegate.cpp如下

#include "cocos2d.h"	//想要使用cocos2d-x引擎,就要包含這個(gè)頭文件#include "CCEGLView.h"	//這個(gè)是opengl圖形引擎的頭文件#include "AppDelegate.h"	//這個(gè)是生命周期類的頭文件#include "HelloWorldScene.h"	//這個(gè)是HelloWorld場(chǎng)景的頭文件#include "SimpleAudioEngine.h"	//這個(gè)是聲音引擎的頭文件//要使用聲音引擎,必須使用命名空間CocosDenshionusing namespace CocosDenshion;//要使用cocos2d-x引擎,必須使用命名空間cocos2d,這個(gè)宏定義相當(dāng)于using namespace cocos2d,大家可以選中它,按下f12,轉(zhuǎn)到它的定義USING_NS_CC;//以下這倆個(gè)分別是生命周期類的構(gòu)造函數(shù)和析構(gòu)函數(shù)AppDelegate::AppDelegate(){}AppDelegate::~AppDelegate(){	//游戲生命周期結(jié)束的時(shí)候停止播放聲音,知道c++基礎(chǔ)的人一定知道end()函數(shù)是靜態(tài)函數(shù)吧  SimpleAudioEngine::end();}//當(dāng)游戲啟動(dòng)的時(shí)候,就會(huì)調(diào)用這個(gè)函數(shù),所以以后我們應(yīng)該從這個(gè)函數(shù)看起bool AppDelegate::applicationDidFinishLaunching(){  //導(dǎo)演類的初始化,又是shared...所以又是單例設(shè)計(jì)模式啊  CCDirector *pDirector = CCDirector::sharedDirector();  pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());  //大家看到了游戲左下角的那個(gè)數(shù)字60了嗎,這個(gè)就是幀率(就是每秒鐘游戲屏幕刷新的次數(shù)),這里可以設(shè)置它是否顯示在左下角  pDirector->setDisplayStats(true);  //當(dāng)然這里就是設(shè)置這個(gè)幀率了,在手機(jī)上的時(shí)候幀率不能小于30,否則游戲玩起來就會(huì)卡,幀率越高當(dāng)然越耗CPU了,也就越費(fèi)電了,所以幀率應(yīng)該合理的設(shè)置  pDirector->setAnimationInterval(1.0 / 60);  //創(chuàng)建一個(gè)helloworld場(chǎng)景,從這里就能看出scene是一個(gè)靜態(tài)函數(shù)吧  CCScene *pScene = HelloWorld::scene();  //然后導(dǎo)演調(diào)用runWithScene()函數(shù)來運(yùn)行helloworld場(chǎng)景  pDirector->runWithScene(pScene);  return true;}//當(dāng)我們玩游戲的時(shí)候突然被其他事情打斷的時(shí)候,比如接電話,就會(huì)調(diào)用這個(gè)函數(shù)void AppDelegate::applicationDidEnterBackground(){	//導(dǎo)演調(diào)用stopAnimation()來停止播放畫面  CCDirector::sharedDirector()->stopAnimation();	//聲音引擎停止播放聲音  SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();}//當(dāng)事件處理完成之后就會(huì)調(diào)用這個(gè)函數(shù),比如電話接聽完畢void AppDelegate::applicationWillEnterForeground(){  CCDirector::sharedDirector()->startAnimation();  SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();}

以上倆個(gè)文件中的代碼我們使用模板生成成功以后基本不用更改,我們需要做的就是寫自己的場(chǎng)景類,寫之前,讓我們看看HelloWorld這個(gè)場(chǎng)景的實(shí)現(xiàn)吧。

先來看HelloWorld.h

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#include "SimpleAudioEngine.h"http://HelloWorld繼承自CCLayer圖層class HelloWorld : public cocos2d::CCLayer{public:  //這是HelloWorld場(chǎng)景類的初始化函數(shù),是一個(gè)虛函數(shù)  virtual bool init();  //這是一個(gè)靜態(tài)函數(shù),可以通過指向類名的指針->scene()直接調(diào)用,返回一個(gè)CCScene場(chǎng)景的指針  static cocos2d::CCScene* scene();  //這是一個(gè)回調(diào)函數(shù),是對(duì)單擊結(jié)束按鈕事件的響應(yīng)函數(shù)  void menuCloseCallback(CCObject* pSender);  //這個(gè)宏可以通過f12看看他的具體實(shí)現(xiàn),其實(shí)就是new一個(gè)對(duì)象,然后調(diào)用它的init函數(shù)(現(xiàn)在知道init函數(shù)什么時(shí)候調(diào)用了吧),然后返回該對(duì)象的指針  CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__

然后是HelloWorld.cpp

#include "HelloWorldScene.h"using namespace cocos2d;CCScene* HelloWorld::scene(){  CCScene * scene = NULL;	//這個(gè)do,while循環(huán)只會(huì)執(zhí)行一次,為什么這樣寫,先不用管  do  {    //首先創(chuàng)建一個(gè)CCScene的場(chǎng)景,調(diào)用的是create函數(shù),其實(shí)對(duì)象的創(chuàng)建大多數(shù)都是調(diào)用create函數(shù)		//這個(gè)create函數(shù)內(nèi)部就是new一個(gè)對(duì)象,然后調(diào)用對(duì)象的init()函數(shù),還有關(guān)于內(nèi)存管理的一些工作,先不用管,你只需要記住c++中我們創(chuàng)建指向?qū)ο蟮闹羔樖峭ㄟ^new,現(xiàn)在都封裝在了create函數(shù)中了    //可能有時(shí)候我們需要往create()中傳入一些東西,但是它的內(nèi)部實(shí)現(xiàn)函數(shù)我上邊說的,就是帶了幾個(gè)參數(shù)而已		scene = CCScene::create();		//CC_BREAK_IF宏的含義是如果沒有創(chuàng)建成功對(duì)象scene,就跳出do,while語句    CC_BREAK_IF(! scene);    //大家可以對(duì)create()f12一下,看是不是到了CREATE_FUNC(HelloWorld)這了,說明我上邊說的就是對(duì)的。這里產(chǎn)生了一個(gè)指向helloworld層的指針。    HelloWorld *layer = HelloWorld::create();    CC_BREAK_IF(! layer);    //將helloworld層添加到scene場(chǎng)景中,往一個(gè)場(chǎng)景中添加層,往層中添加精靈等都是用的這個(gè)函數(shù)addChild()    scene->addChild(layer);  } while (0);  //返回包含helloworld這個(gè)層的場(chǎng)景  return scene;}//有些人可能還會(huì)問init函數(shù)是什么時(shí)候調(diào)用的,我建議你好好看看上邊的注釋bool HelloWorld::init(){  bool bRet = false;  do  {		//首先初始化父類的init()函數(shù)    CC_BREAK_IF(! CCLayer::init());    //這是一個(gè)菜單項(xiàng),對(duì)應(yīng)圖中的那個(gè)關(guān)閉按鈕,傳入倆張圖片,對(duì)應(yīng)正常狀態(tài)時(shí)候的按鈕盒按下狀態(tài)的按鈕圖片		//第四個(gè)參數(shù)中menu_selector是菜單選擇器,cocos2d-x中還有不少的選擇器,先記住,menuCloseCallback對(duì)應(yīng)那個(gè)回調(diào)函數(shù),第三個(gè)參數(shù)this就代表是哪個(gè)類的回調(diào)函數(shù)    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(      "CloseNormal.png",      "CloseSelected.png",      this,      menu_selector(HelloWorld::menuCloseCallback));    CC_BREAK_IF(! pCloseItem);    //設(shè)置這個(gè)按鈕的坐標(biāo),ccp也是一個(gè)宏,用來設(shè)置坐標(biāo)的,getWinSize()獲得了屏幕的尺寸,返回CCSize,width、height是它的屬性    pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));    //創(chuàng)建一個(gè)菜單,在cocos2d-x中需要將菜單項(xiàng)添加到菜單中也就是CCMenu中才可以,NULL表示菜單項(xiàng)的結(jié)束。    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);		//設(shè)置這個(gè)菜單的坐標(biāo)CCPointZero對(duì)應(yīng)(0,0)    pMenu->setPosition(CCPointZero);    CC_BREAK_IF(! pMenu);    //將菜單添加到HelloWorld的圖層中,1表示的是深度,數(shù)字越小深度越深,只有添加到圖層中才可以顯示    this->addChild(pMenu, 1);    //創(chuàng)建一個(gè)文字,傳入要顯示的字,字體,大小,對(duì)應(yīng)圖片上的那個(gè)helloworld    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);    CC_BREAK_IF(! pLabel);    //獲得屏幕的尺寸    CCSize size = CCDirector::sharedDirector()->getWinSize();		//為pLabel設(shè)置坐標(biāo)    pLabel->setPosition(ccp(size.width / 2, size.height - 50));    //將這個(gè)文字天劍到圖層中才能顯示    this->addChild(pLabel, 1);    //往圖層中添加一個(gè)精靈是最常用的,精靈初始化的時(shí)候傳入了一張圖片,這個(gè)資源就在resource下    CCSprite* pSprite = CCSprite::create("HelloWorld.png");    CC_BREAK_IF(! pSprite);    //設(shè)置這個(gè)精靈的坐標(biāo)    pSprite->setPosition(ccp(size.width/2, size.height/2));    //將精靈添加到圖層中,深度是0    this->addChild(pSprite, 0);    bRet = true;  } while (0);  return bRet;}//當(dāng)用戶按下關(guān)閉按鈕的時(shí)候調(diào)用該回調(diào)函數(shù),CCObject代表的是和這個(gè)函數(shù)綁定的按鈕,用的時(shí)候強(qiáng)制轉(zhuǎn)化為CCMenuItemImg*void HelloWorld::menuCloseCallback(CCObject* pSender){  //導(dǎo)演調(diào)用end方法結(jié)束游戲  CCDirector::sharedDirector()->end();}

顯示的圖片中還有幾點(diǎn)要說,那個(gè)左下角的3代表3個(gè)元素,在這個(gè)圖層中,我們添加了一個(gè)精靈,一個(gè)文字,一個(gè)菜單項(xiàng),所以是3,0.000代表每一幀的間隔。整體的含義就是在scene中添加了helloworld層,層中添加了三個(gè)精靈,然后導(dǎo)演調(diào)用runWithScene()函數(shù)運(yùn)行scene場(chǎng)景。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 国产精品精品视频一区二区三区 | 亚洲成人一区二区三区 | 天堂av中文在线 | 成人欧美一区二区三区在线播放 | 色av一区 | 国产精品一区二区久久精品爱微奶 | 国产精品片aa在线观看 | 人人九九 | 区一区二区三在线观看 | 国产精品片aa在线观看 | 久久国产经典视频 | 亚洲美女性视频 | 亚洲中午字幕 | 久久成人综合 | 探花在线 | 精品国产一区二区三区电影小说 | 国外成人在线视频网站 | 无套内谢孕妇毛片免费看红桃影视 | 国产91在线视频 | 亚洲精品一区久久久久久 | 国产亚洲久久 | 最新高清无码专区 | 国产精品九九九 | 久久手机在线视频 | 久久免费国产精品 | 久草免费在线视频 | 国产三区在线观看 | 久草在线青青草 | 国产高清一区二区 | 国产精品视频看看 | 91精品久久久久久久久久久久久久久 | 日本在线观看视频一区 | 国产精品高潮99久久久久久久 | 国产午夜久久 | 精品在线播放 | 成人18视频在线观看 | 国产成人精品午夜在线播放 | av看片网 | 伊人影院在线视频 | 一区二区三区四区在线 | 男人天堂999 |