在范围之间共享数据的结构

时间:2017-02-14 11:27:14

标签: javascript html5-canvas code-structure

我只是在学习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");
    [...]

这种结构是否有任何意义?

1 个答案:

答案 0 :(得分:0)

问题

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专家,但对于那个应用程序,我找到了我的解决方案。我知道可以更好地解决,但这个解决方案对于我写的小游戏来说已经足够了。但如果有人有更好的,我会很高兴听到你的意见。