0

我正在使用直接嵌入我的网站的 HTML5 和 JavaScript 创建一个网络 RPG。游戏将是与电脑对手的单人游戏……设计将是自上而下的 2D,塞尔达风格。这将是实时的,但与计算机玩家的对话将被编写脚本......他们会说些什么,并且会为您提供一些响应选项。

我正在考虑用 XML 编写对话框,但有人告诉我应该使用 JSON,因为使用 JavaScript 更容易解析。

我在 XML 中看到了Abstract Chaos 的答案......

<?xml version="1.0" encoding="UTF-8"?>
    <npcs>
      <npc name="Abstract">
        <dialogue>
          <text>Welcome #{PlayerName} to Stack Exchange, What would you like to know? </text>
          <options>
            <option action="dialogue5">Tell me about Stack Exchange?</option>
            <option action="quest1">Give me quest</option>
            <option action="object1">Give me object</option>
          </options>
        </dialogue>
        <dialogue id="5">
          <text>Stack Exchange is a fast-growing network of 87 question and answer sites on diverse topics</text>
          <text>We build libraries of high-quality questions and answers, focused on the most important topics in each area of expertise</text>
        </dialogue>
      </npc>
    </npcs>

并且想知道如何在 JSON 中实现相同的布局......

我的问题是:

  • 如何在 JSON 中布局 RPG 对话框脚本以供 JavaScript 解析?
  • 我可以举一个例子,说明在特定条件下如何使用 JavaScript 逻辑解析 JSON(例如:NPC 问问题:“你能帮帮我吗?”,JSON 应该有“是”和“否”选项,这可以基于如果玩家确实有该技能可以提供帮助)。
  • JSON对话框文本将存储在我的项目文件夹中的一个单独的“对话框”文件夹中......因此需要从外部访问

我发现的关于如何布局和解析 JSON 的唯一内容是:

        var json = '{"result":true,"count":1}',
            obj = JSON && JSON.parse(json) || $.parseJSON(json);

        alert(obj.result);

但它没有 XML 似乎具有的整洁因素。

任何帮助,将不胜感激...

谢谢!


尝试加载和警告外部 JSON 文本文件不起作用:

HTML:

<html>
    <head>
        <title>Working with JSON</title>
        <script src="jquery.js"></script>
        <script>
            (function() {

            var data = "/JSON_TEXT.txt";    

            var first_q = data.npcs[0].dialogs[0];
            alert(first_q.text);

            }());
        </script>

    </head>
    <body>
    </body>
</html>

JSON纯文本文件:JSON_TEXT.txt

'npcs': [
            {
                'name': 'Abstract',
                'dialogs': [
                    {
                        'text': 'Welcome',
                        'options': [
                            'df', 'f'
                        ]
                    }
                ]
            }
        ]
4

2 回答 2

2

如何在 JSON 中布局 RPG 对话框脚本?

您给我们的 XML 的等价物将是(没有注释):

// you might use a top wrapper object with a property "npcs" for this array
[
    {
        "name": "Abstract",
        "dialogues": {
// I recommend on object with dialogues by id instead of an array
             "start": {
                 "texts": [
                     "Welcome #{PlayerName} to Stack Exchange, What would you like to know?"
                 ],
                 "options": [
                     {
                         "action": "dialogue 5",
                         "text": "Tell me about Stack Exchange?"
                     }, {
                         "action": "quest 1",
                         "text": "Give me quest"
                     }, {
                         "action": "object 1",
                         "text": "Give me object"
                     }
                 ]
             },
             "5": {
                 "texts": [
                      "Stack Exchange is a fast-growing network of 87 question and answer sites on diverse topics",
                      "We build libraries of high-quality questions and answers, focused on the most important topics in each area of expertise"
                 ]
             }
         }
         // further properties of the NPC like objects and quests maybe
    },
    … // further NPCs
]

如何解析 JSON?

请参阅在 JavaScript 中解析 JSON?.

var json = {…};
var data = JSON && JSON.parse(json) || $.parseJSON(json);

哎哟,不!那不是 JSON,它只是 JavaScript 中的一个对象字面量。你可以像这样使用它

var data = {…};

并将data成为你的对象。仅当您将 JSON 作为字符串时才需要解析它,例如当您通过 ajax 加载文件时。

在特定条件下解析 JSON 的 JavaScript 逻辑

那是你的游戏逻辑,我们帮不了你。但是你不需要在那里解析 JSON,你只需要访问你已经解析过的数据。请参阅访问/处理(嵌套)对象、数组或 JSON

于 2013-07-31T17:08:32.050 回答
1

有些人发现 JSON 比 XML 更难阅读。我认为它更干净,更容易使用,特别是如果你想用 JS 解析它。

也就是说,我不太确定您的问题是什么——您已经拥有 XML 格式的数据,所以只需将其转换为 JSON。当您需要命名键时,您可以将数组 ( []) 用于列表和对象 ( ):{}

{
    'npcs': [
        {
            'name': 'Abstract',
            'dialogs': [
                {
                    'text': 'Welcome #{PlayerName} to Stack Exchange, What would you like to know?',
                    'options': [
                        //options here
                    ]
                },
                //next dialog object here
            ]
        },
        //next npc object here
    ]
}

所以,就像你说的,首先你需要解析 JSON 字符串:

var json; //contains the json string, perhaps retrieved from a URL via AJAX
data = JSON && JSON.parse(json) || $.parseJSON(json);

您还可以首先将 JSON 对象分配给 JS 变量(例如,在某个.js文件中),您根本不需要解析。只要确保不要污染全局范围。

解析后,data就是一个普通的JS对象。您可以像访问任何其他对象一样访问其属性。因此,要访问第一个 NPC 的第一个问题,请执行以下操作:

var first_question = data.npcs[0].dialogs[0];

让我们提醒问题本身:

alert(first_question.text);

您可以像这样访问它的选项:

first_question.options;

您询问了如何从外部文件加载 JSON 数据。通常的方法是通过 AJAX 加载文件的 URL。这是一个很好的使用 vanilla JavaScript 发出 AJAX 请求的教程:https ://developer.mozilla.org/en-US/docs/AJAX/Getting_Started

但是没有太多理由使用 vanilla JavaScript 手动编码 AJAX 请求。我推荐使用像jQuery这样的库,它有方便的 AJAX 函数,比如.ajax和速记函数.get。这是一个使用示例.get

var data;                          //will hold the parsed JSON object
var json_url = 'json.txt';         //URL of your JSON (just a plain text file)
$.get(json_url, function(json) {
    data = JSON && JSON.parse(json) || $.parseJSON(json);
});

//use data here
于 2013-07-31T16:34:22.023 回答