我使用我制作了大约一年的基本引擎来创造文本冒险。
对于这个故事,我有一个对象数组(它被称为什么?),我通过各种故事数据来解析
我被告知以我的方式使用它是愚蠢的,因为它应该被用于其他东西,但我只使用它,因为我很容易学习如何解析数据,因为我是一个初学者
由于它已经很长时间,因此编写故事并为每个部分(创建背景等)做些事情变得乏味。
有什么方法可以让我更容易写故事吗?
这里是设置了单个部分的对象数组(带选项)
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)
}
}
}
答案 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()
一样,但我会更进一步。这不会使您的代码更有效,但它可能会使编写您的代码更有效率,这在我的书中是最重要的(直到它不是)。