绘制果实
创建 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