所以我一直在查看我下载过的游戏脚本。我不确定的是 Bullet(I)从未在脚本中实例化(即var x = new Bullet)。本教程将此称为构造函数。发生了什么事?
看起来Bullet构造函数正在获取参数并向其添加属性等。但是脚本中没有任何地方可以实例化Bullet - 所以它不可能?
var playerBullets = [];
function Bullet(I) {
I.active = true;
I.xVelocity = 0;
I.yVelocity = -I.speed;
I.width = 3;
I.height = 3;
I.color = "#000";
I.inBounds = function() {
return I.x >= 0 && I.x <= CANVAS_WIDTH &&
I.y >= 0 && I.y <= CANVAS_HEIGHT;
};
I.draw = function() {
canvas.fillStyle = this.color;
canvas.fillRect(this.x, this.y, this.width, this.height);
};
I.update = function() {
I.x += I.xVelocity;
I.y += I.yVelocity;
I.active = I.active && I.inBounds();
};
I.explode = function() {
this.active = false;
// Extra Credit: Add an explosion graphic
};
return I;
}
此代码稍后在脚本中使用,据我所知,这必须是使用Bullet(I)函数的脚本的相关部分?
playerBullets.forEach(function(bullet) {
bullet.update();
});
答案 0 :(得分:2)
我个人称之为通常意义上的构造函数,正如您所说的那样,您会像var myBullet = new Bullet()
一样使用它。
var myBullet = {}; // blank object
Bullet(myBullet);
// myBullet now has methods .draw, .active etc
我发现您下载的代码来自this tutorial,而Bullet
方法确实在index.html的第167行调用。它在玩家射击时配置子弹:
player.shoot = function() {
Sound.play("shoot");
var bulletPosition = this.midpoint();
playerBullets.push(Bullet({ //<-- here
speed: 5,
x: bulletPosition.x,
y: bulletPosition.y
}));
};
答案 1 :(得分:2)
似乎Bullet正在将一个(可能是空的)对象作为参数然后将其变成Bullet“class”的对象(是的,我知道javascript没有类,但你知道我的意思) 。我怀疑这样做的原因是确保对象被重用而不是被创建和销毁。这意味着更少的垃圾收集发生,因此游戏运行更顺畅
答案 2 :(得分:1)
看来,它需要一个可能的对象,即“我”作为输入,并将东西附加到它并返回它。无需实例化Bullet本身。您只需要适当的I(输入)对象。最好它应该被称为“构建函数”。