欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用原生js實(shí)現(xiàn)html5小游戲之打磚塊(附源碼)

 更新時(shí)間:2018年01月03日 09:35:32   作者:David Yang  
這篇文章主要給大家介紹了關(guān)于利用原生js實(shí)現(xiàn)html5小游戲之打磚塊的相關(guān)資料,這是最近工作遇到的一個(gè)小需求,文中通過示例代碼介紹的非常詳細(xì),并分享了完整的源碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

PS:本次項(xiàng)目中使用了大量 es6 語法,故對(duì)于 es6 語法不太熟悉的小伙伴最好能先了解一些基本的原理再繼續(xù)閱讀。

首先,先說明一下做這個(gè)系列的目的:其實(shí)主要源于博主希望熟練使用 canvas 的相關(guān) api ,同時(shí)對(duì)小游戲的實(shí)現(xiàn)邏輯比較感興趣,所以希望通過這一系列的小游戲來提升自身編程能力;關(guān)于 es6 語法,個(gè)人認(rèn)為以后 es6 語法會(huì)越來越普及,所以算是提前熟悉語法使用技巧。小游戲的實(shí)現(xiàn)邏輯上可能并不完善,也許會(huì)有一些 bug ,但是畢竟只是為了提升編程能力與技巧,希望大家不要太較真

作為第一次分享,我選擇打磚塊這個(gè)邏輯不算太復(fù)雜的小游戲。同時(shí),為了接近真實(shí)游戲效果,在游戲中也添加了關(guān)卡,磚塊血量,以及物理碰撞模型的簡略實(shí)現(xiàn)。其實(shí)關(guān)注游戲?qū)崿F(xiàn)邏輯就好了

線上演示地址:http://demo.jb51.net/js/2018/h5-game-blockBreaker

github地址:https://github.com/yangyunhe369/h5-game-blockBreaker

本地下載地址:http://xiazai.jb51.net/201801/yuanma/h5-game-blockBreaker(jb51.net).rar

ps:github地址和本地下載有代碼演示,以及源碼可供參考,線上演示地址可供預(yù)覽

先上一個(gè)游戲完成后的截圖

游戲工程目錄如下

.
├─ index.html // 首頁html
│ 
├─ css // css樣式資源文件
├─ images // 圖片資源文件 
└─ js
 ├─ common.js // 公共js方法
 ├─ game.js // 游戲主要運(yùn)行邏輯
 └─ scene.js // 游戲場景相關(guān)類

游戲?qū)崿F(xiàn)邏輯

這里對(duì)游戲中需要繪制的擋板、小球、磚塊、計(jì)分板都進(jìn)行了實(shí)例化,并將游戲主要運(yùn)行邏輯單獨(dú)進(jìn)行實(shí)例化

擋板 Paddle

class Paddle {
 constructor (_main) {
 let p = {
 x: _main.paddle_x,  // x 軸坐標(biāo)
 y: _main.paddle_y,  // y 軸坐標(biāo)
 w: 102,  // 圖片寬度
 h: 22,  // 圖片高度
 speed: 10,  // x軸移動(dòng)速度
 ballSpeedMax: 8,  // 小球反彈速度最大值
 image: imageFromPath(allImg.paddle), // 引入圖片對(duì)象
 isLeftMove: true,  // 能否左移
 isRightMove: true,  // 能否右移
 }
 Object.assign(this, p)
 }
 // 向左移動(dòng)
 moveLeft () {
 ...
 }
 // 向右移動(dòng)
 moveRight () {
 ...
 }
 // 小球、擋板碰撞檢測
 collide (ball) {
 ...
 }
 // 計(jì)算小球、擋板碰撞后x軸速度值
 collideRange (ball) {
 ...
 }
}

擋板類:主要會(huì)定義其坐標(biāo)位置、圖片大小、x 軸位移速度、對(duì)小球反彈速度的控制等,再根據(jù)不同按鍵響應(yīng) moveLeft 和 moveRight 移動(dòng)事件,collide 方法檢測小球與擋板是否碰撞,并返回布爾值

小球 Ball

class Ball {
 constructor (_main) {
 let b = {
 x: _main.ball_x, // x 軸坐標(biāo)
 y: _main.ball_y, // y 軸坐標(biāo)
 w: 18, // 圖片寬度
 h: 18, // 圖片高度
 speedX: 1, // x 軸速度
 speedY: 5, // y 軸速度
 image: imageFromPath(allImg.ball), // 圖片對(duì)象
 fired: false, // 是否運(yùn)動(dòng),默認(rèn)靜止不動(dòng)
 }
 Object.assign(this, b)
 }
 move (game) {
 ...
 }
}

小球類:其大部分屬性與擋板類似,主要通過 move 方法控制小球運(yùn)動(dòng)軌跡

磚塊 Block

class Block {
 constructor (x, y, life = 1) {
 let bk = {
 x: x,     // x 軸坐標(biāo)
 y: y,     // y 軸坐標(biāo)
 w: 50,     // 圖片寬度
 h: 20,     // 圖片高度
 image: life == 1 ? imageFromPath(allImg.block1) : imageFromPath(allImg.block2), // 圖片對(duì)象
 life: life,     // 生命值
 alive: true,     // 是否存活
 }
 Object.assign(this, bk)
 }
 // 消除磚塊
 kill () {
 ...
 }
 // 小球、磚塊碰撞檢測
 collide (ball) {
 ...
 }
 // 計(jì)算小球、磚塊碰撞后x軸速度方向
 collideBlockHorn (ball) {
 ...
 }
}

磚塊類:會(huì)有兩個(gè)屬性不同,分別是 life 和 是否存活。然后,在小球和磚塊撞擊時(shí),調(diào)用 kill 方法扣除當(dāng)前磚塊血量,當(dāng)血量為0時(shí),清除磚塊。collide 方法檢測小球與磚塊是否碰撞,并返回布爾值

計(jì)分板 Score

class Score {
 constructor (_main) {
 let s = {
 x: _main.score_x,  // x 軸坐標(biāo)
 y: _main.score_y,  // y 軸坐標(biāo)
 text: '分?jǐn)?shù):',   // 文本分?jǐn)?shù)
 textLv: '關(guān)卡:',  // 關(guān)卡文本
 score: 200,   // 每個(gè)磚塊對(duì)應(yīng)分?jǐn)?shù)
 allScore: 0,   // 總分
 blockList: _main.blockList,  // 磚塊對(duì)象集合
 blockListLen: _main.blockList.length, // 磚塊總數(shù)量
 lv: _main.LV,   // 當(dāng)前關(guān)卡
 }
 Object.assign(this, s)
 }
 // 計(jì)算總分
 computeScore () {
 ...
 }
}

分?jǐn)?shù)類:會(huì)記錄當(dāng)前分?jǐn)?shù)、關(guān)卡數(shù),其中 computeScore 方法會(huì)在小球碰撞磚塊且磚塊血量為0時(shí)調(diào)用,并累加總分

場景 Scene

class Scene {
 constructor (lv) {
 let s = {
 lv: lv,   // 游戲難度級(jí)別
 canvas: document.getElementById("canvas"), // canvas 對(duì)象
 blockList: [],   // 磚塊坐標(biāo)集合
 }
 Object.assign(this, s)
 }
 // 實(shí)例化所有磚塊對(duì)象
 initBlockList () {
 ...
 }
 // 創(chuàng)建磚塊坐標(biāo)二維數(shù)組,并生成不同關(guān)卡
 creatBlockList () {
 ...
 }
}

場景類:主要是根據(jù)游戲難度級(jí)別,繪制不同關(guān)卡及磚塊集合(目前只生成了三個(gè)關(guān)卡)。其中 creatBlockList 方法先生成所有磚塊的二維坐標(biāo)數(shù)組,再調(diào)用 initBlockList 方法進(jìn)行所有磚塊的實(shí)例化

游戲主邏輯 Game

class Game {
 constructor (fps = 60) {
 let g = {
 actions: {},    // 記錄按鍵動(dòng)作
 keydowns: {},    // 記錄按鍵 keycode
 state: 1,    // 游戲狀態(tài)值,初始默認(rèn)為1
 state_START: 1,   // 開始游戲
 state_RUNNING: 2,   // 游戲開始運(yùn)行
 state_STOP: 3,   // 暫停游戲
 state_GAMEOVER: 4,   // 游戲結(jié)束
 state_UPDATE: 5,   // 游戲通關(guān)
 canvas: document.getElementById("canvas"),  // canvas 元素
 context: document.getElementById("canvas").getContext("2d"), // canvas 畫布
 timer: null,    // 輪詢定時(shí)器
 fps: fps,    // 動(dòng)畫幀數(shù),默認(rèn)60
 }
 Object.assign(this, g)
 }
 ...
}

游戲核心類:這里包括游戲主要運(yùn)行邏輯,包括但不限于以下幾點(diǎn)

  • 繪制游戲整個(gè)場景
  • 調(diào)用定時(shí)器逐幀繪制動(dòng)畫
  • 游戲通關(guān)及游戲結(jié)束判定
  • 綁定按鈕事件
  • 邊界檢測處理函數(shù)
  • 碰撞檢測處理函數(shù)

入口函數(shù) _main

let _main = {
 LV: 1,  // 初始關(guān)卡
 MAXLV: 3,  // 最終關(guān)卡
 scene: null,  // 場景對(duì)象
 blockList: null,  // 所有磚塊對(duì)象集合
 ball: null,  // 小球?qū)ο?
 paddle: null,  // 擋板對(duì)象
 score: null,  // 計(jì)分板對(duì)象
 ball_x: 491,  // 小球默認(rèn) x 軸坐標(biāo)
 ball_y: 432,  // 小球默認(rèn) y 軸坐標(biāo)
 paddle_x: 449,  // 擋板默認(rèn) x 軸坐標(biāo)
 paddle_y: 450,  // 擋板默認(rèn) y 軸坐標(biāo)
 score_x: 10,  // 計(jì)分板默認(rèn) x 軸坐標(biāo)
 score_y: 30,  // 計(jì)分板默認(rèn) y 軸坐標(biāo)
 fps: 60,  // 游戲運(yùn)行幀數(shù)
 game: null,  // 游戲主要邏輯對(duì)象
 start: function () {
 let self = this
 /**
 * 生成場景(根據(jù)游戲難度級(jí)別不同,生成不同關(guān)卡)
 */
 self.scene = new Scene(self.LV)
 // 實(shí)例化所有磚塊對(duì)象集合
 self.blockList = self.scene.initBlockList()
 /**
 * 小球
 */
 self.ball = new Ball(self)
 /**
 * 擋板
 */
 self.paddle = new Paddle(self)
 /**
 * 計(jì)分板
 */
 self.score = new Score(self)
 /**
 * 游戲主要邏輯
 */
 self.game = new Game(self.fps)
 /**
 * 游戲初始化
 */
 self.game.init(self)
 }
}

入口函數(shù):實(shí)現(xiàn)了游戲中需要的所有類的實(shí)例化,并進(jìn)行游戲的初始化

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • js獲取圖片base64的正確實(shí)現(xiàn)方式

    js獲取圖片base64的正確實(shí)現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于js獲取圖片base64的正確實(shí)現(xiàn)方式,BLOB是二進(jìn)制大對(duì)象,是一個(gè)可以存儲(chǔ)二進(jìn)制文件的容器,?在計(jì)算機(jī)中BLOB常常是數(shù)據(jù)庫中用來存儲(chǔ)二進(jìn)制文件的字段類型,需要的朋友可以參考下
    2024-01-01
  • JavaScript實(shí)現(xiàn)簡單的雙色球(實(shí)例講解)

    JavaScript實(shí)現(xiàn)簡單的雙色球(實(shí)例講解)

    下面小編就為大家?guī)硪黄狫avaScript實(shí)現(xiàn)簡單的雙色球(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • javascript中關(guān)于類型判斷的一些疑惑小結(jié)

    javascript中關(guān)于類型判斷的一些疑惑小結(jié)

    這篇文章主要給大家介紹了關(guān)于javascript中關(guān)于類型判斷的一些疑惑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • webpack多入口多出口的實(shí)現(xiàn)方法

    webpack多入口多出口的實(shí)現(xiàn)方法

    這篇文章主要介紹了webpack多入口多出口的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 微信公眾平臺(tái) 客服接口發(fā)消息的實(shí)現(xiàn)代碼(Java接口開發(fā))

    微信公眾平臺(tái) 客服接口發(fā)消息的實(shí)現(xiàn)代碼(Java接口開發(fā))

    這篇文章主要介紹了微信公眾平臺(tái) 客服接口發(fā)消息的實(shí)現(xiàn)代碼(Java接口開發(fā)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • JS實(shí)現(xiàn)手機(jī)號(hào)脫敏、郵箱脫敏、身份證號(hào)脫敏、姓名脫敏等常見脫敏代碼示例

    JS實(shí)現(xiàn)手機(jī)號(hào)脫敏、郵箱脫敏、身份證號(hào)脫敏、姓名脫敏等常見脫敏代碼示例

    這篇文章主要給大家介紹了關(guān)于JS實(shí)現(xiàn)手機(jī)號(hào)脫敏、郵箱脫敏、身份證號(hào)脫敏、姓名脫敏等常見脫敏的相關(guān)資料,脫敏的目的是保護(hù)用戶隱私,一種常見的方式是顯示部分字符,用星號(hào)或其他字符替代,需要的朋友可以參考下
    2024-02-02
  • 深入淺析var,let,const的異同點(diǎn)

    深入淺析var,let,const的異同點(diǎn)

    這篇文章主要介紹了var,let,const異同點(diǎn),文中較詳細(xì)的給大家介紹了let和const的相同點(diǎn)和不同點(diǎn),需要的朋友可以參考下
    2018-08-08
  • 一文詳解JavaScript的轉(zhuǎn)碼方式

    一文詳解JavaScript的轉(zhuǎn)碼方式

    JavaScript 轉(zhuǎn)碼是指將 JavaScript 代碼從一種編碼方式轉(zhuǎn)換為另一種編碼方式,常見的轉(zhuǎn)碼方式包括 URL 編碼和 Base64 編碼,解碼是前端比較常見的一種操作,本文就給大家講講JavaScript轉(zhuǎn)碼方式
    2023-09-09
  • js中數(shù)組常用方法總結(jié)(推薦)

    js中數(shù)組常用方法總結(jié)(推薦)

    這篇文章主要介紹了js中數(shù)組常用方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 微信小程序?qū)崿F(xiàn)動(dòng)態(tài)列表項(xiàng)的順序加載動(dòng)畫

    微信小程序?qū)崿F(xiàn)動(dòng)態(tài)列表項(xiàng)的順序加載動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)動(dòng)態(tài)列表項(xiàng)的順序加載動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評(píng)論