微信小游戏 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) } }
用于防止魔术字符串出现的常量列表
获取对象
回收对象