首先新建一个微信小游戏我的项目。删掉我的项目初始化后的代码。建设一个game.js的文件:

const canvas = wx.createCanvas()const context = canvas.getContext('2d')context.fillStyle = '#1aad19'context.fillRect(0, 0, 50, 50)

成果如下:

接下来,让它动起来。

把上面的代码删掉

context.fillRect(0, 0, 50, 50)

而后,定义屏幕宽高,及设置2个变量x和y:

const {  windowWidth,  windowHeight} = wx.getSystemInfoSync()let x=0let y=0

再定义一个绘制的办法

function draw(x, y) {  context.clearRect(0, 0, windowWidth, windowHeight)  context.fillRect(x, y, 50, 50)}

当执行draw(x,y)时,成果是一样的:

接下来,要让它动起来。简略一点,从左往右,出屏幕后再从右边从新开始。

const step=(timestamp)=>{  x+=1  if(x>=windowWidth){    x=0  }  draw(x,y)  window.requestAnimationFrame(step);}window.requestAnimationFrame(step);

成果如下:

动是动起来了,然而这并不是引擎。所以,要用引擎的形式。

先建设一个codetyphon文件夹。外面新建一个sprite.js:

export default class Sprite {  constructor(x = 0, y = 0) {    this.x=x    this.y=y  }  draw(context){    context.fillStyle = '#1aad19'    context.fillRect(this.x, this.y, 50, 50)  }}

其中,constructor是初始化,定义了x和y默认为0.
draw办法调用context绘制了一个矩形。

接下来,在codetyphon中新建一个index.js文件:

import Sprite from './sprite'export {  Sprite}

回到game.js,当初把sprite引入进来。

import {Sprite} from './codetyphon/index'

而后,new出一个player对象:

const player = new Sprite()

接着,把requestAnimationFrame改为:

const step = (timestamp) => {  context.clearRect(0, 0, windowWidth, windowHeight)  player.x += 1  if (player.x >= windowWidth) {    player.x = 0  }  player.draw(context)  window.requestAnimationFrame(step);}window.requestAnimationFrame(step);

这时,之前let的x,y什么的都能够删掉了。

当初 game.js 代码如下:

import {  Sprite} from './codetyphon/index'const canvas = wx.createCanvas()const context = canvas.getContext('2d')const {  windowWidth,  windowHeight} = wx.getSystemInfoSync()const player = new Sprite()const step = (timestamp) => {  context.clearRect(0, 0, windowWidth, windowHeight)  player.x += 1  if (player.x >= windowWidth) {    player.x = 0  }  player.draw(context)  window.requestAnimationFrame(step);}window.requestAnimationFrame(step);

同样,还是这个成果:

接下来持续革新,在sprite.js中减少一个update办法:

export default class Sprite {  constructor(x = 0, y = 0) {    this.x=x    this.y=y  }  update(){      }  draw(context){    context.fillStyle = '#1aad19'    context.fillRect(this.x, this.y, 50, 50)  }}

这里update是个空办法。

而后,建设一个player.js的文件:写一个Player类去继承Sprite类:

import Sprite from './codetyphon/sprite'const {  windowWidth,  windowHeight} = wx.getSystemInfoSync()export default class Player extends Sprite {  constructor(x=0,y=0) {    super(x,y)  }  update(){    this.x+=1    if (this.x >= windowWidth) {      this.x = 0    }  }}

接下来,引入Player

import Player from './player'

用Player去new一个player对象:

const player = new Player()

相应地,requestAnimationFrame局部则变为:

const step = (timestamp) => {  context.clearRect(0, 0, windowWidth, windowHeight)  player.update()  player.draw(context)  window.requestAnimationFrame(step);}window.requestAnimationFrame(step);

当初,整个game.js是这样的:

import Player from './player'const canvas = wx.createCanvas()const context = canvas.getContext('2d')const {  windowWidth,  windowHeight} = wx.getSystemInfoSync()const player = new Player()const step = (timestamp) => {  context.clearRect(0, 0, windowWidth, windowHeight)  player.update()  player.draw(context)  window.requestAnimationFrame(step);}window.requestAnimationFrame(step);

成果还是这样的:

尽管动的成果还是一样,然而代码曾经不一样了。当初,一个引擎最根本的货色曾经打造好了。