javascript, создающий объект для моей игровой ООП

#javascript #oop

#javascript #ооп

Вопрос:

Я ищу несколько примеров или сэмплов кода для правильной организации моего кода для моей игры.

У меня есть игра:

 var gameStructure = function () {
  this.playerLife = 100;
}
  

Как мне создать новые экземпляры игры (поскольку будет продолжаться несколько игр?)

 var gameInstance = new gameStructure();
  

И как мне отформатировать код для игровых действий?

 var attackPlayer = function (damage) {
    this.playerLife = this.playerLife - damage;
}

gameInstance.attackPlayer(50);
  

Это ненастоящий код, я уверен, что все это неправильно и совсем не так, как вы должны делать javascript-код. Одна вещь, в которой я запутался, — это как создать несколько gameInstances. Я не знаю, как установить переменные в качестве переменных.

Я имею в виду, что мне нужно:

 var gameInstance1
gameInstance2
  

и т.д., в зависимости от того, в скольких играх участвуют игроки.

Прямо сейчас я фактически сохраняю экземпляры игры в массиве.

Итак, у меня есть:

 var gameInstances = [], gameid

var createNewGame = function () {
  gameInstances.push(gameInstanceName);
  gameid = gameInstances.indexOf(gameInstanceName); 
}
  

и затем я ссылаюсь на свой объект экземпляра игры с помощью gameInstances[gameid].

Можно ли это сделать или это нецелесообразно, и я должен использовать ООП с созданием экземпляра с ключевым словом new.

Спасибо и, пожалуйста, посоветуйте!

Ответ №1:

Эквивалентом ООП в JavaScript было бы прикрепить attackPlayer функцию к gameStructure prototype :

 gameStructure.prototype.attackPlayer = function (damage) {
    this.playerLife = this.playerLife - damage;
};
  

Все экземпляры gameStructure унаследуют attackPlayer функцию и this будут корректно ссылаться на экземпляр.

Ваша createNewGame функция может просто вызвать new gameStructure() и поместить результат в массив. gameid — это просто индекс в массиве, и его можно вернуть из функции:

 var gameInstances = [];

var createNewGame = function () {
    gameInstaces.push(new gameStructure());
    return gameInstances.length - 1;
};
  

Приведенный выше код используется следующим образом:

 var gameId = createNewGame();
gameInstances[gameId].attackPlayer(100);
  

Комментарии:

1. можете ли вы расширить свой ответ? Как бы я использовал функцию attackPlayer? Спасибо.

2. @FriiSource, я добавил пример к своему ответу.

Ответ №2:

В Javascript вы можете использовать функции, подобные объектам:

 function Vector2(x, y) // Constructor
{
    // Member variable
    this.x = x;
    this.y = y;

    Vector2.count  ;

    // Member function
    this.length = function ()
    {
        return Math.sqrt(this.x*this.x   this.y*this.y);
    }
}
// Static members
Vector2.count = 0;

// Static Functions
Vector2.add = function (a, b)
{
    // Instantiation
    return new Vector2(a.x   b.x, a.y   b.y);
}


function Point(x, y)
{
    this.x = x;
    this.y = y;
}

// Single Inheritance
Point.prototype = new Vector2();

Point.distanceBetween = function (a, b)
{
    var diff = new Vector2(b.x - a.x, b.y - a.y);
    return diff.length();
}
  

Самое странное в ООП-материалах Javascript — это то, что сама функция является конструктором. Я надеюсь, что это поможет.