欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年09月11日 09:15:11   投稿:junjie  
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之Hello World源碼分析,接上一篇內(nèi)容,本文著重分析源碼文件,需要的朋友可以參考下

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

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

首先是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是單例設(shè)計模式,通過調(diào)用sharedOpenGLView()(以后只要是看到shared...就代表是一種單例設(shè)計模式)函數(shù),獲得全局唯一的opengl圖像引擎的實例
  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引擎,就要包含這個頭文件
#include "CCEGLView.h"	//這個是opengl圖形引擎的頭文件
#include "AppDelegate.h"	//這個是生命周期類的頭文件
#include "HelloWorldScene.h"	//這個是HelloWorld場景的頭文件
#include "SimpleAudioEngine.h"	//這個是聲音引擎的頭文件

//要使用聲音引擎,必須使用命名空間CocosDenshion
using namespace CocosDenshion;

//要使用cocos2d-x引擎,必須使用命名空間cocos2d,這個宏定義相當(dāng)于using namespace cocos2d,大家可以選中它,按下f12,轉(zhuǎn)到它的定義
USING_NS_CC;

//以下這倆個分別是生命周期類的構(gòu)造函數(shù)和析構(gòu)函數(shù)
AppDelegate::AppDelegate()
{
}

AppDelegate::~AppDelegate()
{
	//游戲生命周期結(jié)束的時候停止播放聲音,知道c++基礎(chǔ)的人一定知道end()函數(shù)是靜態(tài)函數(shù)吧
  SimpleAudioEngine::end();
}

//當(dāng)游戲啟動的時候,就會調(diào)用這個函數(shù),所以以后我們應(yīng)該從這個函數(shù)看起
bool AppDelegate::applicationDidFinishLaunching()
{
  //導(dǎo)演類的初始化,又是shared...所以又是單例設(shè)計模式啊
  CCDirector *pDirector = CCDirector::sharedDirector();
  pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());

  //大家看到了游戲左下角的那個數(shù)字60了嗎,這個就是幀率(就是每秒鐘游戲屏幕刷新的次數(shù)),這里可以設(shè)置它是否顯示在左下角
  pDirector->setDisplayStats(true);

  //當(dāng)然這里就是設(shè)置這個幀率了,在手機上的時候幀率不能小于30,否則游戲玩起來就會卡,幀率越高當(dāng)然越耗CPU了,也就越費電了,所以幀率應(yīng)該合理的設(shè)置
  pDirector->setAnimationInterval(1.0 / 60);

  //創(chuàng)建一個helloworld場景,從這里就能看出scene是一個靜態(tài)函數(shù)吧
  CCScene *pScene = HelloWorld::scene();

  //然后導(dǎo)演調(diào)用runWithScene()函數(shù)來運行helloworld場景
  pDirector->runWithScene(pScene);
  return true;
}

//當(dāng)我們玩游戲的時候突然被其他事情打斷的時候,比如接電話,就會調(diào)用這個函數(shù)
void AppDelegate::applicationDidEnterBackground()
{
	//導(dǎo)演調(diào)用stopAnimation()來停止播放畫面
  CCDirector::sharedDirector()->stopAnimation();
	//聲音引擎停止播放聲音
  SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}

//當(dāng)事件處理完成之后就會調(diào)用這個函數(shù),比如電話接聽完畢
void AppDelegate::applicationWillEnterForeground()
{
  CCDirector::sharedDirector()->startAnimation();

  SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}

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

先來看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場景類的初始化函數(shù),是一個虛函數(shù)
  virtual bool init();

  //這是一個靜態(tài)函數(shù),可以通過指向類名的指針->scene()直接調(diào)用,返回一個CCScene場景的指針
  static cocos2d::CCScene* scene();

  //這是一個回調(diào)函數(shù),是對單擊結(jié)束按鈕事件的響應(yīng)函數(shù)
  void menuCloseCallback(CCObject* pSender);

  //這個宏可以通過f12看看他的具體實現(xiàn),其實就是new一個對象,然后調(diào)用它的init函數(shù)(現(xiàn)在知道init函數(shù)什么時候調(diào)用了吧),然后返回該對象的指針
  CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

然后是HelloWorld.cpp

#include "HelloWorldScene.h"

using namespace cocos2d;

CCScene* HelloWorld::scene()
{
  CCScene * scene = NULL;
	//這個do,while循環(huán)只會執(zhí)行一次,為什么這樣寫,先不用管
  do
  {
    //首先創(chuàng)建一個CCScene的場景,調(diào)用的是create函數(shù),其實對象的創(chuàng)建大多數(shù)都是調(diào)用create函數(shù)
		//這個create函數(shù)內(nèi)部就是new一個對象,然后調(diào)用對象的init()函數(shù),還有關(guān)于內(nèi)存管理的一些工作,先不用管,你只需要記住c++中我們創(chuàng)建指向?qū)ο蟮闹羔樖峭ㄟ^new,現(xiàn)在都封裝在了create函數(shù)中了
    //可能有時候我們需要往create()中傳入一些東西,但是它的內(nèi)部實現(xiàn)函數(shù)我上邊說的,就是帶了幾個參數(shù)而已
		scene = CCScene::create();
		//CC_BREAK_IF宏的含義是如果沒有創(chuàng)建成功對象scene,就跳出do,while語句
    CC_BREAK_IF(! scene);

    //大家可以對create()f12一下,看是不是到了CREATE_FUNC(HelloWorld)這了,說明我上邊說的就是對的。這里產(chǎn)生了一個指向helloworld層的指針。
    HelloWorld *layer = HelloWorld::create();
    CC_BREAK_IF(! layer);

    //將helloworld層添加到scene場景中,往一個場景中添加層,往層中添加精靈等都是用的這個函數(shù)addChild()
    scene->addChild(layer);
  } while (0);

  //返回包含helloworld這個層的場景
  return scene;
}

//有些人可能還會問init函數(shù)是什么時候調(diào)用的,我建議你好好看看上邊的注釋
bool HelloWorld::init()
{
  bool bRet = false;
  do
  {
		//首先初始化父類的init()函數(shù)
    CC_BREAK_IF(! CCLayer::init());

    //這是一個菜單項,對應(yīng)圖中的那個關(guān)閉按鈕,傳入倆張圖片,對應(yīng)正常狀態(tài)時候的按鈕盒按下狀態(tài)的按鈕圖片
		//第四個參數(shù)中menu_selector是菜單選擇器,cocos2d-x中還有不少的選擇器,先記住,menuCloseCallback對應(yīng)那個回調(diào)函數(shù),第三個參數(shù)this就代表是哪個類的回調(diào)函數(shù)
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
      "CloseNormal.png",
      "CloseSelected.png",
      this,
      menu_selector(HelloWorld::menuCloseCallback));
    CC_BREAK_IF(! pCloseItem);

    //設(shè)置這個按鈕的坐標(biāo),ccp也是一個宏,用來設(shè)置坐標(biāo)的,getWinSize()獲得了屏幕的尺寸,返回CCSize,width、height是它的屬性
    pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

    //創(chuàng)建一個菜單,在cocos2d-x中需要將菜單項添加到菜單中也就是CCMenu中才可以,NULL表示菜單項的結(jié)束。
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
		//設(shè)置這個菜單的坐標(biāo)CCPointZero對應(yīng)(0,0)
    pMenu->setPosition(CCPointZero);
    CC_BREAK_IF(! pMenu);

    //將菜單添加到HelloWorld的圖層中,1表示的是深度,數(shù)字越小深度越深,只有添加到圖層中才可以顯示
    this->addChild(pMenu, 1);

    //創(chuàng)建一個文字,傳入要顯示的字,字體,大小,對應(yīng)圖片上的那個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));

    //將這個文字天劍到圖層中才能顯示
    this->addChild(pLabel, 1);

    //往圖層中添加一個精靈是最常用的,精靈初始化的時候傳入了一張圖片,這個資源就在resource下
    CCSprite* pSprite = CCSprite::create("HelloWorld.png");
    CC_BREAK_IF(! pSprite);

    //設(shè)置這個精靈的坐標(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)閉按鈕的時候調(diào)用該回調(diào)函數(shù),CCObject代表的是和這個函數(shù)綁定的按鈕,用的時候強制轉(zhuǎn)化為CCMenuItemImg*
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
  //導(dǎo)演調(diào)用end方法結(jié)束游戲
  CCDirector::sharedDirector()->end();
}

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

相關(guān)文章

  • C++實現(xiàn)圖像壓縮的示例代碼

    C++實現(xiàn)圖像壓縮的示例代碼

    這篇文章主要為大家詳細介紹了如何使用C++實現(xiàn)圖像壓縮的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解

    C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解

    這篇文章主要介紹了C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解,基本數(shù)據(jù)類型有int、long、long long、float、double、char、string,正文有詳細介紹,歡迎參考
    2018-01-01
  • C++實現(xiàn)AVL樹的基本操作指南

    C++實現(xiàn)AVL樹的基本操作指南

    AVL樹是高度平衡的而二叉樹,它的特點是AVL樹中任何節(jié)點的兩個子樹的高度最大差別為1,下面這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)AVL樹的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • C/C++實現(xiàn)FTP文件上傳下載的示例詳解

    C/C++實現(xiàn)FTP文件上傳下載的示例詳解

    FTP(文件傳輸協(xié)議)是一種用于在網(wǎng)絡(luò)上傳輸文件的標(biāo)準(zhǔn)協(xié)議,這篇文章主要為大家詳細介紹了C++如何實現(xiàn)FTP文件上傳下載功能,需要的小伙伴可以參考下
    2023-12-12
  • C++回文數(shù)及素數(shù)問題計算方法

    C++回文數(shù)及素數(shù)問題計算方法

    這篇文章主要介紹了C++回文數(shù)及素數(shù)問題計算方法,可實現(xiàn)一定范圍內(nèi)的素數(shù)與回文數(shù)運算功能,涉及C++字符串遍歷與數(shù)字數(shù)學(xué)運算的相關(guān)技巧,需要的朋友可以參考下
    2016-05-05
  • C語言實現(xiàn)ATM系統(tǒng)程序的完整代碼

    C語言實現(xiàn)ATM系統(tǒng)程序的完整代碼

    這篇文章主要介紹了C語言實現(xiàn)ATM系統(tǒng)程序的完整代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動

    C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動

    這篇文章主要介紹了C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 雙向鏈表插入刪除基本應(yīng)用介紹

    雙向鏈表插入刪除基本應(yīng)用介紹

    本文將詳細介紹建立雙向鏈表,實現(xiàn)對雙向鏈表的插入,刪除操作,需要了解的朋友可以參考下
    2012-11-11
  • c語言實現(xiàn)順序表的基本操作

    c語言實現(xiàn)順序表的基本操作

    這篇文章主要介紹了c語言實現(xiàn)順序表的基本操作,需要的朋友可以參考下
    2014-03-03
  • Redis的新特性懶惰刪除Lazy Free詳解

    Redis的新特性懶惰刪除Lazy Free詳解

    這篇文章主要介紹了Redis的新特性懶惰刪除Lazy Free詳解,Redis4.0新增了非常實用的lazy free特性,從根本上解決Big Key(主要指定元素較多集合類型Key)刪除的風(fēng)險,需要的朋友可以參考下
    2019-06-06

最新評論