經過較為繁瑣的環境搭建后,我們終於運行出了一個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導演類的成員函數
現在雖然我們窗口的尺寸設置成了mediumResolutionSize
的1024*768
,但是實際上游戲窗口里的分辨率還是designResolutionSize
的480*320
個像素
打開項目目錄的Resources文件夾我們可以看到HelloWorld.png
這個圖片的分辨率是195*270
可以嘗試下更改窗口分辨率運行,窗口內的這個Logo還是一樣大的,但是改了畫面分辨率的話就不一定了
場景
最后有兩行比較關鍵的代碼
這里用我們寫好的HelloWorld類創建了一個場景helloWorldscene
然后讓director從helloWorldscene這個場景開始,啟動整個程序
精靈
精靈(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
設置初始化好的精靈(你的圖片)的坐標,
注意,坐標中出現了兩個對象,一個是visibleSize和origin
- 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里的幾個文件是干什么的了
關於場景和精靈,要學習的還有很多,我們之后會逐一介紹