存储文本冒险AS3的故事数据

时间:2016-10-10 18:27:59

标签: arrays actionscript-3 text

我使用我制作了大约一年的基本引擎来创造文本冒险。

对于这个故事,我有一个对象数组(它被称为什么?),我通过各种故事数据来解析

我被告知以我的方式使用它是愚蠢的,因为它应该被用于其他东西,但我只使用它,因为我很容易学习如何解析数据,因为我是一个初学者

由于它已经很长时间,因此编写故事并为每个部分(创建背景等)做些事情变得乏味。

有什么方法可以让我更容易写故事吗?

这里是设置了单个部分的对象数组(带选项)

public static var parts:Object = 
{

    "0":
        {
            "text":"Text here",
            "choices":
                {
                    "response1":
                        {
                            "text":"Response1",
                            "nextPart":"1"
                        },
                    "response2":
                        {
                            "text":"Response2",
                            "nextPart":"2"
                        }

                },
                "background": Assets.AssetClass.Background1,
                "BGM":"bg1"
        },
}

以下是我的引擎如何处理零件并进行更改的示例:

我有一个输入检查器,用于检查何时按下输入,然后根据屏幕上的内容执行操作

    public function onEnter(button:KeyboardEvent):void
    {
        if (button.keyCode == 32 && !Won)
        {
            if (Dead && textFinished && !choosing) // pressing enter while dead and the text is still writing
            {
                curPart = parts[curPart]["lastPart"] // lastPart will only be stored in parts that have the player die
                textFinished = false
                Dead = false;
                myTextField.text = ""
                counter = 0;
                sInt = setInterval(addCharackter, textSpeed)
                if (stage.getChildByName("cText"))
                {
                    stage.removeChild(continueText)
                }
                if (parts[curPart].hasOwnProperty("background")) //check if the background needs to change.
                {
                    if (stage.getChildByName("img"))
                    {
                        stage.removeChild(background)
                    }
                    background = new Background(parts[curPart], 800, 600)
                    stage.addChildAt(background, 0)
                }
            }
            if (!textFinished && !choosing)// pressing enter when there's no choices on the screen and the text isn't finished and the text is still writing
            {
                this.myTextField.text = this.parts[this.curPart]["text"];
                clearInterval(this.sInt);
                this.textFinished = true;

                if (parts[curPart].hasOwnProperty("choices"))
                {

                    choosing = true
                    createOptions(); // function for parsing through the responses bit of that part and displaying them
                }
                else
                {
                    stage.addChildAt(continueText, 2)
                }
                if (parts[curPart].hasOwnProperty("lastPart"))
                {
                    Dead = true;
                    dead()
                }
            }
            else if (textFinished && !choosing && !Dead) // pressing enter if there's no choices on the screen and there's no choices (it'll take you to the next part)
            {
                trace("Text finished!!")
                curPart = parts[curPart]["nextPart"]
                myTextField.text = ""
                counter = 0;
                sInt = setInterval(addCharackter, textSpeed)
                textFinished = false;
                if (parts[curPart].hasOwnProperty("background"))
                {
                    if (stage.getChildByName("img"))
                    {
                        trace("Removed!")
                        stage.removeChild(background)
                    }
                    background = new Background(parts[curPart], 800, 600)
                    stage.addChildAt(background, 0)
                }
                if (parts[curPart].hasOwnProperty("BGM")) // does the current part have a new background music?
                {
                    trace("Music!!!!")
                    sndBGMusic = musicArray[parts[curPart]["BGM"]]
                    sndBGMusicChannel.stop()
                    sndBGMusicChannel = sndBGMusic.play(0, 9999999999)
                    stage.addChildAt(background, 0)
                }
                stage.removeChild(continueText)
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

这里有几个想法。这些只是我做的事情,而不是你做的事情。我不保证他们在任何方面都更好,但看看你的想法。

我会为_curPart设置一个全局变量。我会有一个名为Part的自定义类。该类将具有_BGM_bgImage等属性。它也可以具有_choicesArray作为属性。我还有其他全局变量,如_hasCandle。或者您可以将项目存储在数组中,如果需要蜡烛,只需检查数组中是否有candle。这些全局变量将从一个部分持续到下一个部分。

然后,您可以通过_curPart._bgImage访问您所在部分的属性。对我来说,这看起来和感觉更清洁。

要创建一个新部件,它可能看起来像(不完整):

var p15:Part = new Part();
p15._bgImage = image15;
p15._BGM = song10;
//...

我建议的最后一件事就是尽可能地重构。例如,你有//pressing enter if there's no choic...用一个或几个函数调用替换该括号中的所有代码(无论什么是最有意义的,并允许你重用代码)。我想,它只是让我们更容易看到发生了什么。因此,不是所有这些if块,只需要像nextPart();这样的函数,然后该函数将包含所有if块。合理?个人偏好,但当事情变得复杂时,重构有助于我清除蜘蛛网。就像使用dead()createOptions()一样,但我会更进一步。这不会使您的代码更有效,但它可能会使编写您的代码更有效率,这在我的书中是最重要的(直到它不是)。