绘制果实

创建 fruits.ts,果实是由海葵生成的,所有果实应该出现在海葵

import ane from "./anemones";
import { cvs_height, ctx_two } from "./init";

class Fruits{
  num: number = 30; // 绘画果实的数量
  alive: boolean[] =[];  // 判断果实是否存活
  x : number[]= []; // 果实的 x 坐标数组
  y :number[] = []; // 果实的 y 坐标数组
  orange = new Image(); // 黄色果实
  blue = new Image(); // 蓝色果实

  init(){
    for (let i = 0; i < this.num; ++i) {
      this.alive[i] = false;
      this.born(i);
    }
    this.orange.src = 'assets/img/fruit.png';
    this.blue.src = 'assets/img/blue.png';
  }

  // 绘制果实
  draw(){
    for (let i = 0; i < this.num; ++i) {
      // 把果实绘制出来,为了让果实居中,所以要减去图片高度一半,宽度一半
      // 就像实现水平居中一样 left: 50px; margin-left: -(图片宽度 / 2);
      ctx_two.drawImage(this.orange, this.x[i] - this.orange.width / 2, this.y[i] - this.orange.width / 2);
    }
  }

  // 初始化果实的坐标
  born(i){
    let aneId = Math.floor( Math.random() * ane.num ) // 随机拿到一个果实的 ID
    this.x[i] = ane.x[aneId]; // 设置果实的 x 坐标为海葵的 x 坐标
    this.y[i] = cvs_height - ane.height[aneId]; // 设置果实的 y 坐标,为海葵高度的顶点坐标
  }
}

let fruits = new Fruits()

export default fruits;

此时我们来重构一下我们的项目,我们发现,每一个绘制累都有一个 init,其实构造器就是一个 init,为什么我们还要多此一举去写一个 init 呢?

所以我们把 init 的内容提到 constructor 里面去,在全局 init 函数里面去 new,然后再导出。

所有需要初始化的,都应该从 init.ts 文件里面导出。

anemones.ts

fruits.ts

init.ts

game-loop.ts

重构搞定,这样看起来是不是并不复杂,假如全写在一个文件里面,我们绝对会头皮发麻。

Last updated