Javascript:构造函数中的随机精灵选择

时间:2012-02-18 17:52:33

标签: javascript html5 canvas

我正在使用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

看起来很简单,但最终每个敌人对象都有相同的精灵。我不知道为什么会发生这种情况 - 如果我将控制台日志消息放在适当的位置,它会记录正确的选择,但是每个敌人最终都会使用相同的精灵。那么,假设这是可能的,最好的方法是什么呢?谢谢!

3 个答案:

答案 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)