微信小遊戲 demo 飛機大戰 代碼分析(一)(main.js)html
微信小遊戲 demo 飛機大戰 代碼分析(三)(spirit.js, animation.js)設計模式
微信小遊戲 demo 飛機大戰 代碼分析(四)(enemy.js, bullet.js, index.js)數組
本博客將使用逐行代碼分析的方式講解該demo,本文適用於對其餘高級語言熟悉,對js還未深刻了解的同窗,博主會盡量將全部遇到的不明白的部分標註清楚,如有不正確或不清楚的地方,歡迎在評論中指正微信
本文的代碼均由微信小遊戲自動生成的demo飛機大戰中獲取函數
代碼:性能
import Pool from './base/pool' let instance /** * 全局狀態管理器 */ export default class DataBus { constructor() { if ( instance ) return instance instance = this this.pool = new Pool() this.reset() } reset() { this.frame = 0 this.score = 0 this.bullets = [] this.enemys = [] this.animations = [] this.gameOver = false } /** * 回收敵人,進入對象池 * 此後不進入幀循環 */ removeEnemey(enemy) { let temp = this.enemys.shift() temp.visible = false this.pool.recover('enemy', enemy) } /** * 回收子彈,進入對象池 * 此後不進入幀循環 */ removeBullets(bullet) { let temp = this.bullets.shift() temp.visible = false this.pool.recover('bullet', bullet) } }
構造器this
移除某個敵方對象(敵機)設計
移除某一個子彈code
操做方式同上一個函數相同htm
一個用於實現對象池的函數
代碼:
const __ = { poolDic: Symbol('poolDic') } /** * 簡易的對象池實現 * 用於對象的存貯和重複使用 * 能夠有效減小對象建立開銷和避免頻繁的垃圾回收 * 提升遊戲性能 */ export default class Pool { constructor() { this[__.poolDic] = {} } /** * 根據對象標識符 * 獲取對應的對象池 */ getPoolBySign(name) { return this[__.poolDic][name] || ( this[__.poolDic][name] = [] ) } /** * 根據傳入的對象標識符,查詢對象池 * 對象池爲空建立新的類,不然從對象池中取 */ getItemByClass(name, className) { let pool = this.getPoolBySign(name) let result = ( pool.length ? pool.shift() : new className() ) return result } /** * 將對象回收到對象池 * 方便後續繼續使用 */ recover(name, instance) { this.getPoolBySign(name).push(instance) } }
用於防止魔術字符串出現的常量列表
獲取對象
回收對象