很难获得您正在搜索的OOP的确切具体信息。 我尽量保持尽可能短的时间:
我目前正在开发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();
我现在这样做(第一个)对我来说似乎更合乎逻辑。 但是..在水平对象函数中,我必须检查游戏对象中的各种变量或调用其自身的函数。因此,我必须在Level对象函数内编写Game.level.funcName。但由于Game.level实际上并不存在于关卡对象声明点,因此感觉有点不对劲和肮脏。这是另一个例子:
Level.prototype.reset = function() {
this.load(Game.currentLevel);
};
Game.currentLevel是硬编码的,是不是有更好的方法可以检测当前处理游戏对象的变量,还是我完全按照我的方式进行操作?
所以基本的问题是,让对象互相交流的最佳方法是什么?
最后一个问题有点偏离主题,但是()();做? 我有时会看到它像这样使用:
(function() {
// Content
});
我希望您了解我的疑虑,感谢您的时间和答案。 :)
答案 0 :(得分:1)
我会推荐第一种方法,因为它更模块化
只需将Game
实例的引用传递给其他组件即可解决您的问题,以便他们了解游戏。
对象在javascript中具有循环结构并不罕见:
Game.level = new Level();
Game.level._game = Game;
//...
Level.prototype.reset = function() {
this.load(this._game.currentLevel);
};
当然,你可以通过在初始化时传递引用来做得更优雅,但我认为你明白我的观点。
答案 1 :(得分:0)
我已回答上一个问题
问题:()();做?我有时会看到它像这样使用:
(function() {
// Content
});
自动执行闭包。我将在这里提供最简单的解释。当我们编写java脚本函数时,需要调用它们来执行它们。
例如,
function alertMe(){
alert('alerted');
}
alertMe(); // We need to call intentionally for execution of function.
自动执行闭包不需要单独调用。
例如,
(function(){
alert('alerted');
})();
上面的javascript会在加载脚本时自动执行。 SO here已回答相同问题。
答案 2 :(得分:0)
我认为你做事的方式看起来很不错。关于问题的最后一部分,这称为立即函数。它是一个在声明后立即调用的函数。您可以在此处查看更多信息:http://javascriptmountain.com/2011/06/functions/immediate-functions-in-javascript-the-basics/
答案 3 :(得分:0)
从用户互动开始,向后工作。如果设计过于灵活或解决了太多问题,可能会过多地参与设计过程并提出复杂的设计。
基于我对游戏的有限知识,甚至游戏编程的较少,以及您向我们展示的内容,我相信您在这里有两个用户互动。
将当前级别存储为游戏对象的属性非常好。我可以想到处理这些交互所需的两种方法,这两种方法对Game
对象都有意义。
function setLevel(levelNumber) {
this.currentLevelNumber = levelNumber;
this.level = new Level(levelNumber);
}
function resetCurrentLevel() {
this.setLevel(this.currentLevelNumber);
}
我会断开从Level对象到Game对象的连接,并尽可能独立于游戏加载一个级别。所以不要这样做,
game.level = new Level();
game.level.load(game.currentLevel);
我要在Level构造函数本身上初始化一个级别的负担,如,
game.level = new Level(8);
甚至更好,让它成为Game对象的方法调用,如上例所示 - setLevel(n)
。该方法将负责确保当级别改变时游戏对象是一致的。
game.setLevel(8);
由于重置函数resetCurrentLevel
在内部使用此方法,因此无论是加载新级别还是重置当前级别,都将统一级别更改的处理。