如何做html5山寨版憤怒的小鳥


今日終於得空,補一篇html5做的山寨版憤怒小鳥的技術貼,共入門級參考。

主要有以下幾點,主要是一些鏈接,供大家學習

1.游戲框架
2.Sprite sheet和Animition
3.box2D
4.Audio

 

1.游戲框架

http://www.brighthub.com/internet/web-development/articles/40512.aspx

http://www.brighthub.com/internet/web-development/articles/40513.aspx

簡單而是用的小游戲框架,為你創建好了canvas,而且用了double buffer的canves

主要的類圖如下:

框架定義了GameObject基類,游戲中每一個可以活動的部件均可以繼承它,還定義了VisualGameObject類,它繼承自GameObject類,添加了draw方法,游戲中可見的部件可以從它繼承,實現自己的draw方法,draw方法帶有參數,就是canvas的context。所有GameObject由GameObjectManager管理,所有自定義的GameObject子類的對象都需要添加到GameObjectManager,它有一個draw方法會被定時調用,如果每1/30秒調用一次,那么你的游戲從設計上來說就是30FPS的。這個方法會把它管理的所有GameObject都調用一遍draw方法(如果有的話),實現所有GameObject的定時重繪,這個就是大家常看到的游戲設計里的主循環。它的功能好比windows編程里的消息循環一樣。

有了這個framework,你要做的就是繼承VisualGameObject,實現draw方法繪制知己,實例化並添加到GameObjectManager中即可。

 

2.Sprite sheet和Animition

Sprite sheet就是精靈表。

http://codeutopia.net/blog/2009/08/21/using-canvas-to-do-bitmap-sprite-animation-in-javascript/

這篇文章講解了如何自己實現Animation,主要原理簡述如下:

定義SpriteSheet類,它負責從一張大圖中剪切出我們需要的一個個小圖。把所有你游戲重要到的圖片做成一張大圖,提高性能,多個小圖意味着客戶端需要發起多次web request,每個http request含有head,tcp,ip等都含有head,減少請求次數意味着較少數據流量,這個好處你懂的。貌似html5中的websocket就是用的這個原理,來提高系統吞吐量的,將http連接upgrade成websocket,之后所有的雙向通信都直接傳數據,最少只需要兩個字節的表頭。

Animation類負責將各個剪切出來的小圖拼接成動畫,每一個小圖是一幀,每一幀定義一個duration,每一幀顯示的duration完了,就顯示下一幀,然后循環,看起來就是連續的動畫了,其實是欺騙了你的眼睛。

 

3.box2D

隨着AngryBird的火爆,這個庫也進入了廣大開發者的視野,現在介紹這個庫的文章太多了,我就不啰嗦了,只寫幾個關鍵點:

box2D源代碼使用c++開發,可以從http://box2d.org/下載到最新版本和文檔,它port到了各種平台,如java,c#,flash,javascript。我是用的是box2Dweb,這個javascript庫是從actionacript庫port過來的,可以從http://code.google.com/p/box2dweb/下載。

Seth Ladd寫過幾篇很經典的入門級文章:http://creativejs.com/2011/09/box2d-javascript-tutorial-series-by-seth-ladd/

這個庫的適用范圍是幾米到幾十米之間,也就是牛頓定律的使用范圍(不含天體運動),對於微觀離子的運動,用這個庫是不合適的,太大的范圍也不精確。

速度太快是可以穿越的。這個是我測試過的,如果給小鳥太大的力,使其速度過快,它能夠穿越木頭。原因是box2D的庫每1/60秒(可配置)是一個step,它會計算每個step結束時各個剛體(Rigid body)應該在什么位置,如果發現有重疊的,就認定在這個step中會有碰撞發生,會觸發碰撞事件,並且修正剛體的位置,使其不重疊,但是如果某一個剛體速度太快,在這個step結束的時候已經成功穿越的另一個剛體,則碰撞就無法被檢測到,實現了穿越。

 

4.Audio

在html5里,audio實現起來非常簡單

this.getAudio = function(id){
    if(this.audios[id] == undefined) {
        this.audios[id] = new Audio();
        this.audios[id].src = "music/"+id;
        this.audios[id].load();
    }
    return this.audios[id];
};

var audio = this.getAudio("title_theme.mp3");
audio.loop = true;
audio.play();

 

作為一個windows平台程序員,發現web在處理事件時與windows桌面應用有不同之處。桌面程序在處理鼠標或鍵盤事件時,注冊一個事件處理方法就可以了,當事件發生時,這個事件處理方法就會被調用執行。但是web有點不一樣,加入你的游戲時30FPS的,1/30秒你的程序才獲得一次執行機會,但是在這短短的1/30秒時間內,可能已經發生了好幾次鼠標鍵盤事件,所有需要在事件發生時記錄下事件類型及狀態,當程序獲得執行機會時,讀取剛才這些記錄,處理事件,刪除記錄。

 

介紹及源代碼下載:

http://www.cnblogs.com/piyeyong/archive/2011/12/30/2307366.html


免責聲明!

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



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