微信小游戏 demo 飞机大战 代码分析(二)(databus.js)

微信小游戏 demo 飞机大战 代码分析(一)(main.js)

微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js)

微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

本博客将使用逐行代码分析的方式讲解该demo,本文适用于对其他高级语言熟悉,对js还未深入了解的同学,博主会尽可能将所有遇到的不明白的部分标注清楚,若有不正确或不清楚的地方,欢迎在评论中指正

本文的代码均由微信小游戏自动生成的demo飞机大战中获取

databus.js

代码:

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)
}
}

instance

  • 该对象用于承载该文件中惟一的databus类,实现单例模式
  • 单例模式是一种设计模式,保证全局仅有一个该类的对象,这样能在该demo中保证全局数据的一致性

constructor

构造器

  • 如果instance不为空已经存在,那么就返回instance

    • 这是实现单例模式,保证不管多少次new都只能产生一个对象
  • 如果不为空,将instance设置为自身,并进行下列初始化操作
    • 创建一个对象池pool

      • 对象池技术是通过将生成的对象暂时保存于池中,需要对象时先在池中查看是否有多余对象,若不足再生成对象,而在销毁对象时不进行真正销毁,而是加入对象池中
    • 重置所有内容,设置为空

removeEnemey(enemy)

移除某个敌方对象(敌机)

  • 从enemys数组中获取第一个元素

    • shift方法是js中移除第一个元素并返回的方法
  • 设置其不可见
  • 移入名为enemy的池中

removeBullet(bullet)

移除某一个子弹

操作方式同上一个函数相同

pool.js

一个用于实现对象池的函数

代码:

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)
}
}

const __

用于防止魔术字符串出现的常量列表

  • Symbol

    • 在js中反复用于获取某些值或者对象的字符串称为魔术字符串,如果字符串过多,正常使用可以,但是若需要修改,则需要同时修改多个字符串,非常不利于维护
    • 为了解决这个问题,ES6引入了一个新的数据类型Symbol,用于存储这些字符串类型,而之后需要用到该字符串仅需要用该常量取得
    • symbol类型为类似于字符串的类型,不能使用new命令,也不能添加属性
  • 在这里声明了一个对象名称为poolDic,用于保存多个对象池的一个字典

constructor()

  • 创建一个空的poolDic

getPoolBySign(name)

  • 根据传入的名称获取相应的对象池,若不存在则生成一个新的,以一个数组来作为对象池

getItemByClass(name, className)

获取对象

  • 获取相应对象池
  • 判断对象池是否为空,若不为空,返回第一个元素,并从对象池中移除
  • 若不为空,则用传入的类名生成新的一个对象

recover(name, instance)

回收对象

  • 获取对象池并向其中推入元素

    • push是js数组中的操作,用于将元素打入数组当中

微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)的更多相关文章

  1. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  2. 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)

    微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...

  3. 微信小游戏 demo 飞机大战 代码分析 (一)(game.js, main.js)

    微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

  4. Python小游戏之 - 飞机大战美女 !

    用Python写的"飞机大战美女"小游戏 源代码如下: # coding=utf-8 import os import random import pygame # 用一个常量来存 ...

  5. Python小游戏之 - 飞机大战 !

    用Python写的"飞机大战"小游戏 源代码如下: # coding=utf-8 import random import os import pygame # 用一个常量来存储屏 ...

  6. 微信demo小游戏:飞机大战从无到有

    微信demo游戏飞机大战从无到有 现在创建新项目会默认给飞机大战的demo,这里给大家从基础开始讲解游戏的从无到有是怎么实现的. 具体实现步骤: 创建背景图->背景图运动起来->创建飞机并 ...

  7. 微信小游戏的本地缓存和清除的使用 (text.js image.js file-util.js)

    参考: 微信小游戏,文件系统 UpdateManager-小游戏 一.Egret提供的本地缓存工具类( 备注:新版本进行了修改,并增加了sound.js等) 在微信小游戏项目中,Egret提供了fil ...

  8. cocos creator开发微信小游戏记录

    先用cocoscreator实现游戏逻辑 在cocoscreator项目里可以调用微信小游戏api 在cocos里面判断小游戏的运行环境 if (cc.sys.platform === cc.sys. ...

  9. 近期热门微信小程序demo源码下载汇总

    近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...

随机推荐

  1. Helvetic Coding Contest 2016 online mirror D1

    Description "The zombies are lurking outside. Waiting. Moaning. And when they come..." &qu ...

  2. flush logs时做的操作

    flush logs时做的操作:  对于一般查询日志和慢日志,先关闭文件再打开  对于binlog,关闭当前的,开始用下一个新的  用错误日志文件的话,先关闭再打开flush logs可以对一般查询日 ...

  3. abp(net core)+easyui+efcore仓储系统——解决方案介绍(二)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) ABP框架 首先介绍一下abp框架,abp其 ...

  4. SpringBoot | 第二十章:异步开发之异步请求

    前言 关于web开发的相关知识点,后续有补充时再开续写了.比如webService服务.发邮件等,这些一般上觉得不完全属于web开发方面的,而且目前webService作为一个接口来提供服务的机会应该 ...

  5. InteliJ idea import project 找不到文件结构解决办法

    一.按下列步骤操作:       1. 关闭IDEA,        2.然后删除项目文件夹下的.idea文件夹       3.重新用IDEA工具打开项目: 二.import新项目之后,可能需要等1 ...

  6. java注解相关

    本文参考很多大神的文档,特别再次表示感谢分享!! 1.何为注解?  概念:注解(Annotation),也叫元数据.一种代码级别的说明. 它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在 ...

  7. Git远程推送文件太大的error解决

    error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errfno 10054 方法1: 改成ssh推送 方法2: 把推送的缓 ...

  8. hibernate丢失更新

    如果多个线程操作基于同一个查询结构对表中的记录进行修改,那么后修改的记录将会覆盖前面修改的记录,前面的修改就丢失掉了,这就叫做更新丢失.Serializable可以防止更新丢失问题的发生.其他的三个隔 ...

  9. ios下表单disabled样式重置

    在做最近的一个活动项目时,需要用到表单的disabled状态,但是在IOS下那颜色不是一般的浅,就跟没有一样,一开始通过如下样式重置: input:disabled, input[disabled]{ ...

  10. grunt配置sass项目自动编译

    1.安装Ruby和SASS 首先我们需要在电脑上安装Ruby和SASS.如果您使用的是Mac,您就没必要安装Ruby.如果您使用的是Window系统,你需要安装Ruby. 2.安装Nodejs 由于使 ...