程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Cocos2d-x進修筆記之Hello World源碼剖析

Cocos2d-x進修筆記之Hello World源碼剖析

編輯:關於C++

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場景。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved