2012-02-18 51 views
0

我正在使用canvas/JS製作我的第一個遊戲,並且遇到了函數構造函數的問題。我們正在努力使敵人物體在創造時隨機接受兩個精靈之一。下面是我們的代碼片段:Javascript:構造函數中的隨機精靈選擇

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

如何初始化'this.sprite'?也許所有的敵人都共享相同的圖像對象? – kayahr 2012-02-18 17:54:52

+0

你打電話過得怎麼樣? – Sarfraz 2012-02-18 17:54:56

+1

什麼是'this.sprite'?它在哪裏宣佈? – satoshi 2012-02-18 17:55:31

回答

1

如果this.sprite不屬於Enemy對象,那麼您可能每次都會覆蓋它。你得到的價值是最後一個。

查看您的代碼後:原型中的值由所有實例共享。您應該將實例相關狀態置於實例(函數)本身中。

在這種情況下把

// Sprite 
    this.sprite = new Image(); 
    this.sprite.src = ""; 
在敵人(

){...}

+0

它是;我在上面的評論中粘貼了[更完整的源代碼](http://pastebin.com/xEs8hzRW)。這似乎是最可能的原因 - 任何想法我們可以做些什麼來解決它? – ark 2012-02-18 18:04:26

+1

爲什麼你不把精靈直接放入敵人? – Ixx 2012-02-18 18:06:56

+0

看起來像解決它 - 非常感謝! – ark 2012-02-18 18:12:21

1

如果您是在原型直接初始化this.sprite,那麼所有敵人的對象共享相同的圖像,每次調用構造函數會覆蓋的全部敵人的圖像源。因此這並工作:

function Enemy() 
{ 
    this.sprite.src = ...someRandomizedUrl... 
} 

Enemy.prototype.sprite = new Image(); 

你要做這樣的:

function Enemy() 
{ 
    this.sprite = new Image(); 
    this.sprite.src = ...someRandomizedUrl... 
} 

你完整的源代碼是完全一樣的第一個代碼塊(錯了),因爲所有敵人共享相同的GameObject,因此它們共享相同的精靈圖像。在Enemy的構造函數中初始化this.sprite,它可以工作。