2014-05-08 123 views
2

我正在创建一个RPG。我想根据当前级别动态加载NPC对话框js文件。使用requireJS动态加载js文件

最初,我在做我的game.js文件顶部的<script type="text/javascript" src="js/npc_dialog_level_1.js"></script> ......但不想继续为每个npc_dialog.js文件做这件事。

我宁愿做这样的事情:

if (map == 1) { 
    require(js/npc_dialog_level_1.js); 
if (map == 2) { 
    require(js/npc_dialog_level_2.js); 

我下面requireJS的教程,但我不清楚在:

一)下载requireJS不包括在该示例中指定的辅助/ utils.js文件夹和文件:

project-directory/ 
    project.html 
    scripts/ 
     main.js 
     require.js 
     helper/ 
      util.js 

b)如何使用require函数:require(["helper/util"], function(util) { 在更改地图时,我只想将路径放到关联的npc_dialog_level.js文件中。我在哪里放置需求代码,以及如何传递它以加载正确的js文件?


每个npc_dialog_level文件都包含js对象。我使用的是在我的比赛阅读对话框

var dialog = { 

quests : { 
    Lee : { 
     "1 - Introductions" : 

更新:

我想:

//load NPC dialog given the map 
loadNpcDialog : function (dialogNumber) { 
    require("npc_dialog_level_" + dialogNumber + ".js", function(dialog) { 
    // log(dialog); 
    });  
}, 

给出:

Uncaught Error: Invalid require call 
http://requirejs.org/docs/errors.html#requireargs require.js:166 
+0

您能否再详述一下? npc_dialog_level_X文件包含什么内容?这听起来不像requirejs是这里的正确工具。你有没有考虑过使用普通的AJAX呢? – sahbeewah

+0

@sahbeewah我已更新 – Growler

回答

4

你当你打电话require,像这样用括号内为你的依赖列表:

//load NPC dialog given the map 
loadNpcDialog : function (dialogNumber) { 
    require(["npc_dialog_level_" + dialogNumber + ".js"], function(dialog) { 
    // log(dialog); 
    });  
}, 

如果不使用括号,然后你使用伪同步形式require,这将使用像这样:var dialog = require("npc_dialog_level_" + dialogNumber + ".js")。但是,这种伪同步形式不适用于你的情况。

如果最终想要将这些文件转换为JSON文件或XML,则可以使用text! plugin加载它们。

+0

Louis,这个作品,谢谢!将对话存储为JSON/XML与直接在JavaScript对象内部生成文本的好处是什么? – Growler

+1

在XML中,您可以使用模式来高度限制您的数据结构。我没有对JSON做过同样的事情,但我听说JSON也存在架构。所以你可以得到一些重要的支持来帮助那些不懂编程的人编辑这些文件,没有JavaScript编辑器可能提供的无关内容,并且可以提供模式可以提供的额外指导。但是,如果您不需要这种功能,那么您可以继续加载JavaScript文件。换句话说,我不会将它转换为JSON或XML。 – Louis

+0

谢谢你,路易。如果我使用JSON格式,我当前的js对象结构不会有太大变化,对吧?架构保持不变。我只是加载它作为一个文本文件,并用'$ .getJSON(“json_file.js”,函数(result){''然后用$ .each循环我的json字段(result,function(i,field ){'right? – Growler

2

IFF你的对话框的东西所有实际上是JavaScript,然后做一个后期加载g是相当容易的。

function runNpcDialog(number) { 
    require(["npc-dialog-" + number + ".js"], function(dialog) { 
     // Run your dialog here. 
    }); 
} 

否则,如果您的信息更是一个JSON/XML格式的,然后用ajax将是一个更好的选择。

编辑:固定的语法

+0

给出错误:未捕获错误:无效需要调用 http://requirejs.org/docs/errors.html#requireargs要求。js:166 – Growler

+0

对不起,语法稍微偏离了..需要的模块必须位于数组中。 –