亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Cocos2d-x學習筆記之Hello World源碼分析

2020-01-26 15:20:15
字體:
來源:轉載
供稿:網友

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

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

首先是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是單例設計模式,通過調用sharedOpenGLView()(以后只要是看到shared...就代表是一種單例設計模式)函數,獲得全局唯一的opengl圖像引擎的實例  CCEGLView* eglView = CCEGLView::sharedOpenGLView();	//以下這句比較重要,setFrameSize(x,y)是設置游戲窗口的大小,通過改變傳入的值,可以改變游戲窗口的大小,看到窗口頂部的那行字了嗎,就是寫的窗口的大小  eglView->setFrameSize(480, 320);  int ret = CCApplication::sharedApplication()->run();#ifdef USE_WIN32_CONSOLE  FreeConsole();#endif  return ret;}

Appdelegate.cpp如下

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

以上倆個文件中的代碼我們使用模板生成成功以后基本不用更改,我們需要做的就是寫自己的場景類,寫之前,讓我們看看HelloWorld這個場景的實現吧。

先來看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場景類的初始化函數,是一個虛函數  virtual bool init();  //這是一個靜態函數,可以通過指向類名的指針->scene()直接調用,返回一個CCScene場景的指針  static cocos2d::CCScene* scene();  //這是一個回調函數,是對單擊結束按鈕事件的響應函數  void menuCloseCallback(CCObject* pSender);  //這個宏可以通過f12看看他的具體實現,其實就是new一個對象,然后調用它的init函數(現在知道init函數什么時候調用了吧),然后返回該對象的指針  CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__

然后是HelloWorld.cpp

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线免费观看视频| 国内精品模特av私拍在线观看| 91成人在线观看国产| 久久九九有精品国产23| 亚洲丝袜在线视频| 欧美日韩在线视频首页| 亚洲一区二区三区香蕉| 久久久精品国产一区二区| 亚洲小视频在线观看| 欧美日本国产在线| 精品亚洲精品福利线在观看| 国产精品永久在线| 亚洲电影免费观看高清完整版在线| 国产剧情久久久久久| 欧美日韩国产va另类| 国产精品伦子伦免费视频| 色婷婷av一区二区三区久久| 欧美亚洲在线播放| 欧美黑人巨大精品一区二区| 国外成人在线播放| 日本sm极度另类视频| 精品久久久一区| 国模gogo一区二区大胆私拍| 久久久久久国产精品| 伊人伊成久久人综合网小说| 欧美日韩成人精品| 九九久久久久99精品| 国产精品极品尤物在线观看| 欧美丝袜一区二区| 久久频这里精品99香蕉| 5566成人精品视频免费| 久久国产精品久久久久久| 日韩电视剧免费观看网站| 青青草国产精品一区二区| 日韩av电影在线网| 精品美女永久免费视频| 欧美黑人xxx| 亚洲国产精品嫩草影院久久| 日韩国产欧美区| 国产成人一区二区在线| 亚洲国产精彩中文乱码av| 成人在线视频网站| 国产一区二区三区视频免费| 91沈先生在线观看| 精品免费在线观看| 日韩最新av在线| 日韩av色综合| 亚洲欧美日韩精品| 一区二区成人精品| 久久久精品网站| 日韩av片电影专区| 91伊人影院在线播放| 欧美性xxxxx极品| 伊人伊成久久人综合网小说| 欧美成人免费全部观看天天性色| 亚洲欧洲一区二区三区在线观看| 久久久久久网站| www.欧美免费| 91国产在线精品| 久久亚洲精品中文字幕冲田杏梨| 精品亚洲一区二区三区在线播放| 成人午夜在线视频一区| 国产ts人妖一区二区三区| 久久影院资源站| 久久久国产视频| 欧美一区二区三区免费视| 超在线视频97| 亚洲电影免费观看高清完整版在线| 国产精品久久久久福利| 91精品国产综合久久久久久蜜臀| 亚洲国产精品99久久| 亚洲福利在线看| 国产精品入口夜色视频大尺度| 日韩欧美大尺度| 国产精品成人一区| 成人免费网站在线看| 国产亚洲成av人片在线观看桃| 黑人巨大精品欧美一区二区三区| 亚洲男人天堂2019| 成人激情在线观看| 欧美成人黑人xx视频免费观看| 视频在线观看一区二区| 欧美天天综合色影久久精品| 国产午夜精品全部视频播放| 欧美日韩国产精品一区二区三区四区| 美女福利精品视频| 色青青草原桃花久久综合| 欧美综合在线第二页| 亚洲国产又黄又爽女人高潮的| 久久这里只有精品视频首页| 欧美精品一区二区三区国产精品| 91在线高清视频| 国产一区二区久久精品| 日韩在线观看免费全集电视剧网站| 91国产视频在线| 日本高清不卡在线| 欧美中在线观看| 92国产精品久久久久首页| 日本成人在线视频网址| 久久久在线视频| 91在线无精精品一区二区| 色婷婷久久一区二区| 日韩精品视频在线| 日韩精品在线视频美女| 国产精品美女主播在线观看纯欲| 欧美激情国产高清| 久久免费视频在线观看| 欧美日韩色婷婷| 国产精品美女午夜av| 日韩电影免费观看在线观看| 欧美乱大交xxxxx| 国产精品视频免费观看www| 国产精品一二区| 日韩在线观看精品| 欧美丰满少妇xxxxx| www.99久久热国产日韩欧美.com| 最近2019年手机中文字幕| 成人有码在线视频| 久久人人爽人人爽人人片av高请| 66m—66摸成人免费视频| 久久久久久久久久久久久久久久久久av| 亚洲韩国日本中文字幕| 成人免费在线视频网站| 国产一区二区av| 国产精品永久免费视频| 国产成人福利夜色影视| 日本三级韩国三级久久| 成人黄色av播放免费| 中文字幕亚洲一区二区三区五十路| 国产精品视频大全| 超薄丝袜一区二区| 亚洲精品成人久久| 欧美日韩在线影院| 91精品国产高清久久久久久| 欧美精品18videos性欧美| 久久影院中文字幕| 日本在线精品视频| 国产丝袜精品第一页| 日韩在线观看高清| 精品国产欧美一区二区五十路| 国产91色在线免费| 欧美成人免费一级人片100| 夜夜嗨av色综合久久久综合网| xxxxx成人.com| 久久久久久久久久久av| 久久亚洲精品一区| 91av国产在线| 欧美激情a∨在线视频播放| 成人av电影天堂| 91豆花精品一区| 精品福利视频导航| 欧美成人免费视频| 国产欧美在线观看| 影音先锋欧美在线资源| 国产精品网址在线| 亚洲国产精品久久久| 亚洲美女久久久| 91九色国产社区在线观看| 欧美视频裸体精品| 欧美日韩爱爱视频| 中文字幕在线观看日韩| 亚洲精品v天堂中文字幕| 亚洲欧美日韩一区二区三区在线| 成人动漫网站在线观看|