我正在使用canvas / JS创建我的第一个游戏,而且我遇到了函数构造函数的问题。我们试图让它成为敌人对象在创作时随机选择两个精灵中的一个。这是我们代码的片段:
function Enemy() {
// Boilerplate stuff omitted. Relevant bit:
if (randomFromTo(1,50)%2 === 0) { // Assume this function works correctly
this.sprite.src = "images/scientist_1.png";
} else {
this.sprite.src = "images/scientist_2.png";
}
}
var enemy1 = new Enemy();
var enemy2 = new Enemy(); // etc
看起来很简单,但最终每个敌人对象都有相同的精灵。我不知道为什么会发生这种情况 - 如果我将控制台日志消息放在适当的位置,它会记录正确的选择,但是每个敌人最终都会使用相同的精灵。那么,假设这是可能的,最好的方法是什么呢?谢谢!
答案 0 :(得分:1)
如果this.sprite不在Enemy对象之外,那么每次都可能会覆盖它。你得到的价值就是最后一个。
查看代码后:原型中的值由所有实例共享。您应该将实例相关状态放在实例(函数)本身中。
在这种情况下把
// Sprite
this.sprite = new Image();
this.sprite.src = "";
in Enemy(){...}
答案 1 :(得分:1)
如果您直接在原型上初始化this.sprite
,则所有敌方对象共享相同的Image,因此每次调用构造函数都会覆盖所有敌人的图像源。这样做不工作:
function Enemy()
{
this.sprite.src = ...someRandomizedUrl...
}
Enemy.prototype.sprite = new Image();
你必须这样做:
function Enemy()
{
this.sprite = new Image();
this.sprite.src = ...someRandomizedUrl...
}
您的完整源代码与第一个代码块(错误的代码块)完全相同,因为所有敌人共享相同的GameObject
,因此它们共享相同的精灵图像。在this.sprite
的构造函数中初始化Enemy
,它可以正常工作。
答案 2 :(得分:0)