将您的移动和绘制例程放入小行星对象的方法中:
// Define an Asteroid constructor
function Asteroid(width, height) {
this.width = width;
this.height = height;
this.x = width/2;
this.y = -6;
this.min = 1.6;
this.max = 2.2;
this.speed = 1.6;
}
// Move asteroid
Asteroid.prototype.move = function() {
if(this.y < this.height) {
this.y += this.speed;
} else {
this.y = -6;
this.x = Math.random()*(this.width-0)-0;
}
}
// Draw asteroid
Asteroid.prototype.draw = function() {
ctx.beginPath();
ctx.fillStyle = "#D9BA5F";
ctx.arc(this.x, this.y, 3, 0, 2*Math.PI, false);
ctx.closePath();
ctx.fill();
}
然后你可以创建多个小行星:
var asteroids = [];
// create 10 asteroids
for(var i = 0; i < 10; i++) {
asteroids.push(new Asteroid(Math.random()*10, Math.random()*10));
}
在你的主循环中,移动并绘制它们:
for(var i = 0; i < asteroids.length; i++) {
asteroids[i].move();
asteroids[i].draw();
}
正如@blunderboy 在评论中指出的那样,这仍然不会随机化您尚未随机化的任何东西。您可以使用 Powerslave 的参数化构造函数,其中所有随机化都应在实例化时进行,或者从构造函数中生成至少部分随机值。
此外,最好传递画布上下文对象而不是依赖闭包。