Cocos2d-x C++ 工程初探


經過較為繁瑣的環境搭建后,我們終於運行出了一個helloworld窗口,可以正式上手cocos了

現在我們就從改代碼開始玩起

AppDelegate

AppDelegate類 是程序的入口,現在我們先來看AppDelegate的幾個成員函數

你可能會好奇入口為什么不是main函數,因為AppDelegate類其實是一個應用委托類,main.c里把游戲的運行委托給了這個類

  • applicationDidFinishLaunching 正如其名,我們的游戲啟動時會調用這個函數,也就是入口函數
    比如等下會提到的:實例化單例類 director,設置窗口大小,游戲分辨率等等
  • applicationDidEnterBackground 是在游戲要切換到后台時調用的函數
    比如:停止音樂,停止動畫等等
  • applicationWillEnterForeground 也就是游戲從后台切換回來時調用的函數
    比如:繼續播放音樂,繼續播放動畫

接下來我們的重點是看 applicationDidFinishLaunching 函數內的代碼

導演

首先可以看到第一行

實例化了一個 Director 類,director是干什么的呢?
如果把做游戲比作拍電影,director導演就是總指揮,切換場景,播放/停止音樂等動作都是director決定的
也就是說你你在cocos里需要通過director來實現這一系列操作,他是必不可少的

窗口

接下來你看到的會是

auto glview = director->getOpenGLView();
if(!glview) {
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
    glview = GLViewImpl::createWithRect("Test", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
    #else
    glview = GLViewImpl::create("Test");
    #endif
    director->setOpenGLView(glview);
}

你可能會有點懵,沒關系,先看

// 為方便閱讀我做了換行處理
glview = GLViewImpl::createWithRect(
    "Test", 
    cocos2d::Rect(
        0, 
        0, 
        designResolutionSize.width, 
        designResolutionSize.height
	)
);

再看看你運行出來的畫面

GLViewImpl::createWithRect() 的第一個參數 “Test” 其實就是運行出來的窗口的名稱(默認是你的項目名)

至於第二個參數

cocos2d::Rect(
    0, 
    0, 
    designResolutionSize.width, 
    designResolutionSize.height
)

從名字應該不難看出一個是高,一個是寬,在Visual Studio里按住Ctrl,鼠標左鍵點選designResolutionSize就能找到定義

cocos有一個叫做Size的類,這個尺寸的width和height兩個成員是我們經常需要使用的,在設置精靈的尺寸,坐標的時候會經常使用到

這是示例預先設置好的幾個窗口大小,所以你應該能理解上面那一段代碼是干什么的了吧——設置窗口名和大小

至於 #if#else#endif 是干嘛的,從字面上看其實就很好理解,是檢測你的運行環境的(WIN32,MAC,LINUX或其他)這個我們暫時不用深究

現在由於designResolutionSize提供的寬高太小了不方便我們調試,我們把參數換成mediumResolutionSize將下面這個designResolutionSize直接改成mediumResolutionSize即可:

改后

運行:

之后的兩行都很好理解

director->setDisplayStats(true);			// 顯示FPS
director->setAnimationInterval(1.0f / 60);	// 設置每幀的間隔

把第一個參數改成false就能關閉幀數顯示,可以發現FPS顯示和幀間隔也是director控制的

畫面分辨率

看字面應該就能理解了,setDesignResolutionSize就是設置畫面分辨率的,同樣是屬於Director導演類的成員函數

現在雖然我們窗口的尺寸設置成了mediumResolutionSize1024*768,但是實際上游戲窗口里的分辨率還是designResolutionSize480*320個像素

打開項目目錄的Resources文件夾我們可以看到HelloWorld.png這個圖片的分辨率是195*270

可以嘗試下更改窗口分辨率運行,窗口內的這個Logo還是一樣大的,但是改了畫面分辨率的話就不一定了

場景

最后有兩行比較關鍵的代碼

這里用我們寫好的HelloWorld類創建了一個場景helloWorldscene

然后讓directorhelloWorldscene這個場景開始,啟動整個程序

精靈

精靈(Sprite)是Cocos里的一個概念,我們helloworld界面的Cocos的logo就是一個精靈,現在我們嘗試把他換成別的圖片,選一張圖片放到項目目錄的Resources文件夾內

控制這個精靈的代碼在HelloWorldScene.cpp內,打開找到這段代碼:

只要把HelloWorld.png修改成你放入Resources內的圖片名即可

運行:

坐標系統

首先介紹一下Vec2類,有接觸過圖形庫或者游戲引擎的同學應該不陌生,這個類代表的是二維向量,有x和y這兩個成員,我們在設置游戲物體的坐標的時候會使用到

同樣在HelloWorldScene.cpp中,在創建sprite精靈的地方有這么幾行代碼,就是我們剛才換圖片的那里

// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

這行代碼就是使用 setPosition 設置初始化好的精靈(你的圖片)的坐標,

注意,坐標中出現了兩個對象,一個是visibleSizeorigin

  • visibleSize這個對象儲存了游戲世界的尺寸,也就是我們能夠看到的窗口的尺寸,設置游戲的分辨率可以影響這個值
  • origin指的是窗口左下角的點在游戲世界中的位置

在設置坐標的代碼下加入這樣一行代碼輸出一些信息(log函數可以當作c/c++的printf使用)

log("visibleSize.width=%f, visibleSize.height=%f, origin.x=%f, origin.y=%f", 
            visibleSize.width, 
            visibleSize.height,
            origin.x,
            origin.y);

運行,查看輸出窗口

可以看到visibleSize和origin的值

再回看設置坐標的代碼

// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

理性理解一下,實際上意思很簡單,就是set到了窗口正中間的位置

稍作改動
Vec2(visibleSize.width/4 + origin.x, visibleSize.height/2 + origin.y)

就向左移動了1/4窗口寬度的距離

最后一句

this->addChile(sprite, 0);

意思是將這個精靈加入到當前圖層中,參數0代表最底層,如果不加這行代碼,sprite不會成為游戲世界中的一員,編譯出來之后就不會顯示(這個涉及到場景的 z-order 值,下一節會講到)

總結

通過這篇文章你應該基本了解了實例工程HelloWorld里的幾個文件是干什么的了

關於場景和精靈,要學習的還有很多,我們之后會逐一介紹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM