我只是在学习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");
[...]
这种结构是否有任何意义?
答案 0 :(得分:0)
function main() {
if (gamest != true) {
resetgame();
gamest = true;
}
resetgame()
函数绑定在if
范围内。它导致在该范围内初始化的对象在程序离开该范围后被销毁。
要使用闭包概念,我们需要:
所以在这个例子中,我们需要function main()
体内的一堆自由对象来保存resetgame()
评估的数据。一个选项是通过参数将所有这些对象传递给resetgame()
并重写它以初始化其内部对象的所有参数。
在游戏中我们通常会有很多对象,因此闭包概念会变得复杂且耗费内存。更好的解决方案是将所有主要功能封装到一个对象中,这样我们就可以轻松地交换数据并将对象传递到我们需要的地方。这让我们创建了一个易于管理的结构,例如:
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专家,但对于那个应用程序,我找到了我的解决方案。我知道可以更好地解决,但这个解决方案对于我写的小游戏来说已经足够了。但如果有人有更好的,我会很高兴听到你的意见。