我只是在学习JS并尝试编写一个简单的游戏。所以我做了一个基本的结构女巫应该看起来像这样(伪C 代码):
if (!game.game-stage)
game.ResetGame(); // initialize game objects
if (player1.score > MAX_SCORE || player2.score > MAX_SCORE)
game.end-round(); stop(1000);
else
game.Update();
game.Render();
然后我尝试在JS中写下它:
function main() {
if (gamest != true) {
resetgame();
gamest = true;
}
/* UPDATE SECTION */
if (score1 > 9 || score2 > 9) {
endround();
setTimeOut(update, 1000);
}
else {
update();
}
/* RENDER SECTION */
draw();
}
main()
中的其他功能现在确实可以访问resetgame()
函数初始化的对象。另一个问题是,当我将所有对象都放在全局测试范围时,setTimeOut(update, 1000)
不起作用。
resetgame()
过程看起来很像:
function resetgame() {
var paddle1 = new GameObject(20, 80, "LEFT");
[...]
该结构是否会产生任何感官?
问题
function main() {
if (gamest != true) {
resetgame();
gamest = true;
}
resetgame()
功能在if
范围内绑定。它导致该范围内部初始化的对象在程序离开该范围后被破坏。
闭合解决方案
要使用闭合概念,我们需要:
- 变量
- 逻辑的主体,变量绑定到
- 在关闭实例化期间保存的环境,这是在评估闭合变量时被绑定的自由变量。
因此,在此示例中,我们需要function main()
主体内部的一堆免费对象来保存由resetgame()
评估的数据。一个选项是通过参数将所有这些对象传递给resetgame()
并将其重写以将所有参数初始化为其内部对象。
简单的OOP解决方案
在游戏中,我们通常有很多对象,因此封闭概念将变得复杂和记忆消耗。更好的解决方案是将所有主要功能封装到一个对象中,以便我们可以轻松地交换数据并传递我们需要的对象。这让我们创建了一个易于管理的结构,例如:
var App = {
Load: function() {
this.frame = new Frame();
},
// UPDATE
Update: function() {
this.frame.updatePosition();
},
// RENDER
Render: function() {
this.frame.draw();
}
};
function Main() {
var app = App;
app.Load();
setInterval(MainLoop(app), 1000/60);
}
function MainLoop(app) {
// main application render
app.Render();
// main application update
app.Update();
}
有人只是提醒我这样的问题。我还不是JS专家,但是对于该应用程序,我找到了解决方案。我知道这可以更好地解决,但是对于我一直在写的小游戏来说,该解决方案已经足够好了。但是,如果有人有更好的一个,我很高兴听到您的意见。