iT邦幫忙

4

遊戲引擎 Cocos2d-html5

Cocos2d-html5 是一個用來開發網頁2D遊戲的遊戲引擎,是 Cocos2d 家族的其中一個分支,利用 Cocos2d-html5 來開發遊戲可以讓開發者專注在遊戲本體的設計上。
Cocos2d-html5 是一個用來開發網頁2D遊戲的遊戲引擎,以JavaScript寫成,是 Cocos2d 家族的其中一個分支。在這個網站有更多的介紹與官方遊戲範例:
http://igdshare.org/content/cocos2d\_html5

下面我簡單示範如何使用 sprite sheet 在網頁繪製動畫。內容大多是我自己網路摸索的,如有錯誤還請告知。

首先是 sprite sheet 的圖檔,來自一個叫做 BrowserQuest 的遊戲
每一行都代表一個動作,而列是代表的是分解動作
藉由改變顯示出來的圖案就能讓人產生動畫的錯覺

另外在 Cocos2d-html5 中要使用 sprite sheet 還需要一個以 xml 寫成的 plist 檔案
用來定義 sprite sheet 被顯示的位置跟大小跟他的名字
內容大概是長這樣子:

<key>goblin_atk_right_0</key>
<dict>
    <key>x</key>
    <integer>0</integer>
    <key>y</key>
    <integer>0</integer>
    <key>width</key>
    <integer>52</integer>
    <key>height</key>
    <integer>52</integer>
    <key>offsetX</key>
    <integer>0</integer>
    <key>offsetY</key>
    <integer>0</integer>
    <key>originalWidth</key>
    <integer>52</integer>
    <key>originalHeight</key>
    <integer>52</integer>
</dict>

以上內容定義了一個叫做 goblin_atk_right_0 的 sprite
座標原點在左上角
這個 sprite 只顯示 sprite sheet(0, 0)到(52, 52)這個範圍的像素
zwoptex 或 TexturePacker 可以幫你輸出這種檔案,但目前我是用手刻的XD

接下來就是遊戲邏輯的部份
其中 s_goblinPlist 是 Plist 檔案的路徑,s_goblint 是圖檔的路徑
將檔案放到cache中,方便之後調用。

var cache = cc.SpriteFrameCache.getInstance()
cache.addSpriteFrames(s_goblinPlist, s_goblin);

建立一個 Sprite

var enemy = cc.Sprite.createWithSpriteFrameName("goblin_idle_right_0");
enemy.setPosition(cc.p(150, 100));
enemy.setScale(1.5);
this.addChild(enemy);

在Cocos2d-html5中 Sprite 有很多可以執行的動作
組合這些動作來讓 Sprite 執行

//在三秒中移動到相對位置(200, 30)。
var move = cc.MoveBy.create(3, cc.p(200, 30))

//每0.2秒換顯示的影像,形成一個走動的動畫。
var walkAnimate = cc.Animate.create(cc.Animation.create([
    cache.getSpriteFrame("goblin_walk_right_0"),
    cache.getSpriteFrame("goblin_walk_right_1"),
    cache.getSpriteFrame("goblin_walk_right_2")], 0.2));

//重複走動的動畫5次。
var walkRepeat = cc.Repeat.create(walkAnimate, 5);

//同時移動並播放走動的動畫。
var walk = cc.Spawn.create(move, walkRepeat)

//建立攻擊的動畫
var atk = cc.Animate.create(cc.Animation.create([
    cache.getSpriteFrame("goblin_atk_right_0"),
    cache.getSpriteFrame("goblin_atk_right_1"),
    cache.getSpriteFrame("goblin_atk_right_2")], 0.2));

//依序執行walk, atk, atk, walk。
var action = cc.Sequence.create(walk, atk, atk, walk)
        
enemy.runAction(action)

程式碼執行的成果:
https://dl.dropboxusercontent.com/u/10533972/ithelp/index.html
看,很簡單吧~

才怪w
我認為這部份遊戲引擎應該可以包裝得再好一些
不過也有可能是我使用的方法有錯

最後附上一個兩年多前沒使用引擎的舊程式做參考
可以右鍵看原始碼
https://dl.dropboxusercontent.com/u/10533972/ithelp/%E6%9D%B1%E6%96%B9%E6%B7%AB%E7%8D%B8%E8%A1%8C%28B%29.html


1 則留言

0
ted99tw
iT邦高手 1 級 ‧ 2013-04-22 08:15:18

灑花Cocos2d+html5真是超強組合,這下前端不愁沒做到死的機會了...哈哈

我要留言

立即登入留言