在范围之间共享数据的结构
An strucure to share data between scopes
刚学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 专家,但对于那个应用程序,我找到了我的解决方案。我知道可以更好地解决这个问题,但这个解决方案对于我正在编写的小游戏来说已经足够好了。但如果有人有更好的,我会很高兴听到你的意见。
刚学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 专家,但对于那个应用程序,我找到了我的解决方案。我知道可以更好地解决这个问题,但这个解决方案对于我正在编写的小游戏来说已经足够好了。但如果有人有更好的,我会很高兴听到你的意见。