H5 Flappy Bird 游戲制作 (1)

前言

我打算用幾期的時間做一個 Flappy Bird 游戲。

H5 游戲有不少現成的引擎,可以讓開發這很方便的完成游戲開發。比如:

然而今天我不用這些引擎。使用原生 js 實現這個游戲。

新建項目

通過 gt 腳手架工具,使用 gt-front-end-scaffold 腳手架新建了項目:flappy-bird

新項目中默認包含了 es6, webpack 等特性幫助我們開發。

修改 src/entries/demo.js 的名稱為 flappy-bird.js。內容修改為:

import '../FlappyBird';

if (module.hot) {
    module.hot.accept('../FlappyBird', () => {
        location.reload();
    });
}

我們接受了 webpack hot reload,當受影響的文件為 ../FlappyBird/index.js 時,進行頁面的刷新。這樣我們可以在改動了源碼后

src 目錄下新建 FlappyBird 目錄。目錄下新建 index.js 。新建 index.pcss,進行樣式編寫。

canvas

我們先放一個 canvas,讓項目跑起來。

修改 templates/index.html,添加一個 canvas 元素。

<canvas></canvas>

我們通過 canvas 的方式進行游戲的元素繪制。

canvas 默認是 inline 元素,因此需要在 canvas 上設置 display: block;,清除元素的默認邊距。

目前大家的設備都是高清屏幕了,對于 retina 來說,一個像素點展示了4個實際像素的內容,對于更高清的屏幕來說,比例更大。可以通過 window.devicePixelRatio 獲取到比例。

我們把 canvas 的實際寬高放大到屏幕寬高的相應倍數,再使用 css 的縮放展示在頁面上即可。

模塊拆分

仔細看下游戲,我們嘗試拆分下游戲的元素。游戲包括:背景,柱子,鳥。背景不動。柱子每次都是上下兩根對應,中間留空讓鳥飛過,柱子可以抽象成方形。鳥左右位置固定,上下根據用戶操作來。

我們還需要單獨的游戲管理的類管理其中所有類。畫布類進行 canvas 設置。用戶輸入類來獲取用戶輸入,控制元素的變化。柱子管理類來管理所有的柱子。

GameManager

需要控制 StickManagerInputCanvasBirdBackground,提供 start 方法進行初始化。

游戲中的繪制是實時進行的,通過 requestAnmiationFrame 回調來獲取瀏覽器渲染的下一幀,在下一幀進行繪圖。

繪圖時考慮不同設備的差異,通過時間差來計算變動,獲取新的一幀的狀態,避免不同設備上游戲難度不一致。

class GameManager {
    loop() {
        // get time
        // calculate position
        this.paint();
        requestAnimationFrame(() => {
            // next frame
            this.loop();
        });
    }
}

TBC

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容