2012-02-18 3 views
0

Я делаю свою первую игру в холсте/JS, и у меня возникает проблема с конструкторами функций. Мы пытаемся сделать так, чтобы объект Enemy случайным образом делал один из двух спрайтов при создании. Вот фрагмент нашего кода: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'? Может быть, все враги имеют один и тот же объект Image? – kayahr

+0

Как вы это называете? – Sarfraz

+1

Что такое 'this.sprite'? Где это объявлено? – satoshi

ответ

1

Если this.sprite находится вне объекта Enemy, вы, вероятно, переписываете его каждый раз. Значение, которое вы получаете, является последним.

После просмотра кода: Значения в прототипе разделяются всеми экземплярами. Вы должны поместить состояние, связанное с экземпляром, в самом экземпляре (функции).

В этом случае ставить

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

в Enemy() {...}

+0

Это; В предыдущем комментарии я вставлял [более полный источник] (http://pastebin.com/xEs8hzRW). Это кажется наиболее вероятной причиной - любая идея, что мы можем сделать, чтобы обойти это? – ark

+1

Почему вы не задали спрайт непосредственно в Enemy? – Ixx

+0

Похоже, что это решает - спасибо большое! – ark

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, и поэтому они используют одно и то же изображение спрайта. Инициализируйте this.sprite в конструкторе Enemy и он работает.

Смежные вопросы