Cocos2d-x進修筆記之Hello World源碼剖析。本站提示廣大學習愛好者:(Cocos2d-x進修筆記之Hello World源碼剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是Cocos2d-x進修筆記之Hello World源碼剖析正文
起首我們來講一下流戲的道理,游戲相似於一場片子,晚期的片子不就是靠一張張的圖片放出來的嗎?把場景人物甚麼的畫在一幅幅圖片上,然後從第一張圖片開端播放便可以了。游戲更是如斯,其實我們玩的游戲看到的畫面都是美工做出來的,我們法式員要做的工作是組織這些圖片,好比先弄個配景圖片,然後在某一個坐標上放置一小我物的圖片,我們寫好法式,掌握這個圖片的挪動途徑,等機械運轉的時刻每秒都要刷新畫面,我們就看到人物動了起來。而刷新頁面的快慢就是我們所說的幀率,這個在法式中我們可以掌握。全體的意思就是游戲不外是一些圖片而已,而我們就是掌握這些圖片,讓這些圖片活動,當用戶單擊圖片的時刻我們做一些事宜呼應的處置等等,固然還有一些其他的任務。然後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_CONSOLE
int 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" //這個是聲響引擎的頭文件
//要應用聲響引擎,必需應用定名空間CocosDenshion
using 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"
//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場景。