#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 — это то, что сама функция является конструктором. Я надеюсь, что это поможет.