Javascript: случайный выбор спрайта в конструкторе - PullRequest
0 голосов
/ 18 февраля 2012

Я делаю свою первую игру на canvas / JS, и у меня возникла проблема с конструкторами функций. Мы пытаемся сделать так, чтобы объект Enemy случайно брал один из двух спрайтов при создании. Вот фрагмент нашего кода:

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 ]

1 голос
/ 18 февраля 2012

Если вы инициализируете 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, и он работает.

1 голос
/ 18 февраля 2012

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

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

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

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

в Enemy () {...}

0 голосов
/ 18 февраля 2012

Кто любит кошек?

http://jsfiddle.net/ZrPv8/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...