Javascript объект взаимодействия (ООП) - PullRequest
0 голосов
/ 18 января 2012

Трудно получить точную конкретную информацию о ООП, которую вы ищете.Я старался сделать его как можно более коротким:

В настоящее время я разрабатываю переходный этап в HTML5.У меня нет реального опыта разработки игр.Но я знаю, как должны работать основы.Я просто хочу знать, правильно ли я делаю.

У меня есть игра, игрок и объект уровня.

В настоящее время я делаю следующее:

Game.player = new Player();
Game.level = new Level();

Game.level.load(Game.currentLevel);
...
Game.run();

Это лучший способ или я должен назвать их всех самостоятельно, например:

var Player = new Player();
var Level = new Level();
Level.load(Game.currentLevel);
...
Game.run();

То, как я это делаю прямо сейчас (первый), кажется мне более логичным.Но .. в функциях объектов уровня я должен проверить различные переменные из игрового объекта или вызвать саму функцию.Таким образом, я должен написать Game.level.funcName внутри функций объектов Level.Но поскольку Game.level на самом деле не существует в точке объявления объектов уровня, он выглядит как-то неправильно и грязно.Вот еще один пример:

Level.prototype.reset = function() {
    this.load(Game.currentLevel);
};

Game.currentLevel жестко запрограммирован, нет лучшего способа определить, какая переменная в данный момент обрабатывает игровой объект, или это полностью нормально, как я это делаю?

Итак, основной вопрос в том, как лучше всего позволить объектам взаимодействовать друг с другом?

И еще один последний вопрос, который является своего рода оффтопом, но что делает () ();делать?Иногда я вижу, как его используют так:

(function() {
    // Content
});

Я надеюсь, что вы понимаете мои проблемы, спасибо за ваше время и ответы.:)

Ответы [ 4 ]

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

Я бы порекомендовал первый подход, потому что он более модульный.
Ваша проблема может быть решена путем простой передачи ссылки на экземпляр Game другим компонентам, чтобы они знали об игре.
Нередко объекты имеют циклическую структуру в javascript:

Game.level = new Level();
Game.level._game = Game;
//...
Level.prototype.reset = function() {
    this.load(this._game.currentLevel);
};

Конечно, вы можете сделать это немного более элегантно, передав ссылку при инициализации, но я думаю, вы поняли мою точку зрения.

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

Начните с взаимодействия с пользователем и работайте задом наперед. Можно слишком сильно участвовать в процессе проектирования и придумывать замысловатые проекты, если этот дизайн слишком гибкий или решает слишком много проблем.

Основываясь на моих ограниченных знаниях об играх и даже меньших знаниях игрового программирования, а также на том, что вы нам показали, я считаю, что здесь есть два взаимодействия с пользователем.

  1. Пользователь выбирает определенный игровой уровень для игры
  2. Пользователь сбрасывает этот игровой уровень

Сохранение текущего уровня как свойства игрового объекта совершенно нормально. Я могу вспомнить два метода, которые понадобятся для обработки этих взаимодействий, оба из которых имеют смысл для Game объекта.

function setLevel(levelNumber) {
   this.currentLevelNumber = levelNumber;
   this.level = new Level(levelNumber);
}

function resetCurrentLevel() {
   this.setLevel(this.currentLevelNumber);
}

Я бы разорвал связь между объектом уровня и объектом игры и загрузил бы уровень независимо от игры в максимально возможной степени. Так что вместо того, чтобы делать,

game.level = new Level();
game.level.load(game.currentLevel);

Я бы наложил бремя инициализации уровня на самого конструктора уровня, как в,

game.level = new Level(8);

или, что еще лучше, вызовите метод для объекта Game, как в моем примере выше - setLevel(n). Метод будет отвечать за обеспечение согласованности игрового объекта при изменении уровня.

game.setLevel(8);

Поскольку функция сброса resetCurrentLevel внутренне использует этот метод, обработка изменений уровня будет унифицирована независимо от загрузки нового уровня или сброса текущего уровня.

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

Я думаю, что вы делаете вещи выглядят довольно хорошо.Что касается последней части вашего вопроса, это называется немедленной функцией.Это функция, которая вызывается сразу после объявления.Вы можете увидеть больше информации здесь: http://javascriptmountain.com/2011/06/functions/immediate-functions-in-javascript-the-basics/

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

У меня есть ответ на последний вопрос

Вопрос: что делает () ();делать?Иногда я вижу, как это используется следующим образом:

(function() {
    // Content
});

Это самоисполняющееся замыкание .Я приведу самое простое объяснение здесь.Когда мы пишем функцию java-скрипта, их нужно вызывать для их выполнения.

Например,

function alertMe(){
 alert('alerted');
}

alertMe(); // We need to call intentionally for execution of function.

Самоиспользуемое замыкание не требует вызова отдельно.

ДляНапример,

(function(){
 alert('alerted');
})();

Выше javascript выполняется автоматически, когда скрипт загружается.Ответ на тот же вопрос на SO здесь .

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