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

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

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

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

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

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

spirit.js

游戏基础的精灵类

代码

/**
* 游戏基础的精灵类
*/
export default class Sprite {
constructor(imgSrc = '', width= 0, height = 0, x = 0, y = 0) {
this.img = new Image()
this.img.src = imgSrc this.width = width
this.height = height this.x = x
this.y = y this.visible = true
} /**
* 将精灵图绘制在canvas上
*/
drawToCanvas(ctx) {
if ( !this.visible )
return ctx.drawImage(
this.img,
this.x,
this.y,
this.width,
this.height
)
} /**
* 简单的碰撞检测定义:
* 另一个精灵的中心点处于本精灵所在的矩形内即可
* @param{Sprite} sp: Sptite的实例
*/
isCollideWith(sp) {
let spX = sp.x + sp.width / 2
let spY = sp.y + sp.height / 2 if ( !this.visible || !sp.visible )
return false return !!( spX >= this.x
&& spX <= this.x + this.width
&& spY >= this.y
&& spY <= this.y + this.height )
}
}

Spirite类

constructor

构造器

  • 根据输入图片路径,高度,宽度,初始坐标(x,y)生成一个精灵

    • 这里的x,y 是指图片的左上角坐标
    • 应注意的一点是此处所有参数均有缺省值
  • 初始visible设置为true,即可见

drawToCanvas(ctx)

将精灵画于画布上

  • 如果不可见,那么不画到画布上
  • 如果可见,根据该精灵的x,y坐标

isCollideWith(sp)

  • 根据传入物体的左上角的坐标和大小计算中心坐标
  • 若两个物体中任意一个不可见,则无需计算,直接返回失败
  • 判断传入物体的中心坐标有没有在该物体的方框之内

animation.js

动画类所在文件

代码

import Sprite  from './sprite'
import DataBus from '../databus' let databus = new DataBus() const __ = {
timer: Symbol('timer'),
} /**
* 简易的帧动画类实现
*/
export default class Animation extends Sprite {
constructor(imgSrc, width, height) {
super(imgSrc, width, height) // 当前动画是否播放中
this.isPlaying = false // 动画是否需要循环播放
this.loop = false // 每一帧的时间间隔
this.interval = 1000 / 60 // 帧定时器
this[__.timer] = null // 当前播放的帧
this.index = -1 // 总帧数
this.count = 0 // 帧图片集合
this.imgList = [] /**
* 推入到全局动画池里面
* 便于全局绘图的时候遍历和绘制当前动画帧
*/
databus.animations.push(this)
} /**
* 初始化帧动画的所有帧
* 为了简单,只支持一个帧动画
*/
initFrames(imgList) {
imgList.forEach((imgSrc) => {
let img = new Image()
img.src = imgSrc this.imgList.push(img)
}) this.count = imgList.length
} // 将播放中的帧绘制到canvas上
aniRender(ctx) {
ctx.drawImage(
this.imgList[this.index],
this.x,
this.y,
this.width * 1.2,
this.height * 1.2
)
} // 播放预定的帧动画
playAnimation(index = 0, loop = false) {
// 动画播放的时候精灵图不再展示,播放帧动画的具体帧
this.visible = false this.isPlaying = true
this.loop = loop this.index = index if ( this.interval > 0 && this.count ) {
this[__.timer] = setInterval(
this.frameLoop.bind(this),
this.interval
)
}
} // 停止帧动画播放
stop() {
this.isPlaying = false if ( this[__.timer] )
clearInterval(this[__.timer])
} // 帧遍历
frameLoop() {
this.index++ if ( this.index > this.count - 1 ) {
if ( this.loop ) {
this.index = 0
} else {
this.index--
this.stop()
}
}
}
}

准备内容

  • 引入Spirit类和DataBus类
  • 生成一个databus对象
  • 确定一个Symbol对象

Animation类

继承于Sprite类

constructor

构造器

  • 先用图片路径和宽度高度初始化超类(spirit类)
  • 一些基本的动画设置参数,如备注所述作用

initFrames(imgList)

初始化帧动画的所有帧

  • 对传入参数imgList进行遍历

    • forEach是对js中对数组遍历的一种方式
    • =>是匿名函数的语法

aniRender(ctx)

把播放中的帧画到画布上

  • 通过调用drawImage画上动画在该时刻应该有的图像
  • 该函数在main.js中的render中有调用

playAnimation(index = 0, loop = false)

  • 将精灵图的可见设为false

    • 在本例子中有一个敌机被击毁,发生了敌机爆炸,展示爆炸的动画
  • 设置正在播放
  • 将是否循环的情况设置为初始设置的(初始设置为不循环)
  • 判断是否有动画切换间隔和帧数
    • 有的话设置定时器,使用函数setInterval
    • setInterval函数
      • 第一个参数是回调函数,是在这个过程中不断调用的函数
      • 第二个参数是间隔
      • 整个函数的含义就是在该间隔内不断调用传入的回调函数
      • (博主猜测一般情况来说主函数中的图像切换频率大于该间隔,这样才能体现动画的变化)

stop()

停止帧动画播放

  • 将播放设置为false
  • 清除原本设置的定时器

frameLoop()

帧遍历

  • 帧计数变量index加加
  • 若帧数大于图片数-1(由于计数从0开始)
    • 如果要求循环,将index置0
    • 否则将index--,即设置为最后一张图片,并且调用stop()函数暂停

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

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

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

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

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

  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. 【转】利用 three.js 开发微信小游戏的尝试

    前言 这是一次利用 three.js 开发微信小游戏的尝试,并不能算作是教程,只能算是一篇笔记吧. 微信 WeChat 6.6.1 开始引入了微信小游戏,初期上线了一批质量相当不错的小游戏.我在查阅各 ...

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

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

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

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

随机推荐

  1. hadoop map 个数 源码分析

    本文转自http://ronxin999.blog.163.com/blog/static/42217920201279112163/

  2. arch安装软件提示包损坏

    错误:lib32-libjpeg6-turbo: signature from "Colin Keenan <colinnkeenan@gmail.com>" is u ...

  3. less css用法思维导图

    Less 是一个Css 预编译器,可以扩展Css语言,添加功能如允许变量(variables),混合(mixins),函数(functions) 和许多其他的技术,让你的Css更具维护性,主题性,扩展 ...

  4. ElasticSearch java API 按照某个字段排序

    searchRequestBuilder.addSort("publish_time", SortOrder.DESC); 按照某个字段排序的话,hit.getScore()将会失 ...

  5. iOS开发ReactiveCocoa学习笔记(三)

    RAC常用用法: 1.监听按钮的点击事件: UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame ...

  6. 用简单的方法学习ES6

    ES6 简要概览 这里是ES6 简要概览.本文大量参考了ES6特性代码仓库,请允许我感谢其作者@Luke Hoban的卓越贡献,也感谢@Axel Rauschmayer所作的[优秀书籍]//explo ...

  7. pandas:数据分析

    一.介绍 pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的. 1.主要功能 具备对其功能的数据结构DataFrame.Series 集成时间序列功能 提供丰富的数学运算和操 ...

  8. js学习的一些想法(有一些来自网络)

    javascript开发最佳实践学习 1.给变量和函数命名--变量名和函数名尽量简短 好的变量命名应该是简短易懂的,还有需要避免的陷阱就是在命名中将数值与功能结合. 匈牙利命名法就是一个不错的选择,也 ...

  9. iOS中UIWebview中网页宽度自适应的问题

    有的网页中会使用"<meta name="viewport" content="width=device-width, initial-scale=1.0 ...

  10. MongoDB-2.6.0 (OpenLogic CentOS7.2)

    平台: CentOS 类型: 虚拟机镜像 软件包: mongodb basic software database linux open source 服务优惠价: 按服务商许可协议 云服务器费用:查 ...