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



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

相关内容

  • 没有找到相关文章

最新更新