使用requirejs用于模块化游戏引擎

时间:2013-04-12 09:08:51

标签: javascript requirejs game-engine

我是一名经验丰富的javascript程序员,我正试图从头开始编写自己的模块化游戏引擎。我之前没有使用过requirejs,但在阅读了一下之后,听起来它可能是管理引擎所有组件并将它们加载到一个连贯结构中的最佳方式。

我的主要问题是我不确定如何真正使用requirejs。我一直在查看他们的API文档,但我不确定如何将它与我设计项目的方式相结合。

目前,我的项目使用以下结构:

  
      
  • SRC   
        
    • engine.js //这包含常见的引擎内容,最值得注意的是引擎命名空间
    •   
    • 资源   
          
      • resource-module.js //这是模块构造函数,它处理不同之间的所有常见内容   子结构
      •   
      • sprites.js //这是一个包含精灵加载代码的子结构
      •   
    •   
    • 呈现
    •   
    • 等...
    •   
    • 第三方   
          
      • jquery的
      •   
      • requirejs
      •   
    •   
  •   

我希望能够彼此独立地加载模块。例如,应该可以从引擎中移除音频模块,它仍然可以工作。替换模块或添加新模块也应该很容易。

另外,我正在使用jQuery进行事件处理,因此需要在启动引擎之前加载它。

您可以在此处找到我当前的来源:https://github.com/superlinkx/lithium-engine

我知道当前的代码很乱,而且还没有很多内置,但我仍然在研究如何最好地构建它。任何帮助/建议都会受到赞赏,但我主要关注的是如何使用requirejs构建它,以便更容易编译成单个文件以供生产使用。

1 个答案:

答案 0 :(得分:4)

Require.js不会强制执行您文件的任何特定结构。您可以在require配置中指定完整路径,也可以只在require()或define()调用中使用完整路径。两者都可以工作,但是后者会为你节省一些打字,当你从很多不同的地方包含东西时,它会更容易移动:

var $ = require("third-party/jquery");

require.config({
    paths: {
        "jquery": "third-party/jquery"
    }
});
var $ = require("jquery");
  

我希望能够彼此独立地加载模块。例如,应该可以从引擎中移除音频模块,它仍然可以工作。替换模块或添加新模块也应该很容易。

这不是必需品。你做四件事。您可以决定何时何时不加载它,但您必须确保它不会破坏您的其余代码。

  

另外,我正在使用jQuery进行事件处理,因此需要在启动引擎之前加载它。

您可以通过多种不同方式完成此操作。

  • require()在你的main.js中,以便它总是被加载(你也可以使用require-jquery.js,它包含了jQuery)。
  • 将jQuery指定为引擎的依赖项

require.config({
    paths: {
        "jquery": "path.to.jquery",
        "engine": "path.to.engine"
    },
    shim: {
        "engine": {
            "deps": ["jquery"]
        }
    }
});
  • 将jQuery传递给模块中的define()调用(可能是最佳选择)

define(["jquery"], function ($) {
    // your engine code
}