Moin,
Ich bin mit meiner neugeschriebenen RPG-Engine wieder auf dem Stand der Urversion, die ich hier mal vorgestellt hatte. Wie auch bei der letzten Version schon, möchte ich (wieder) eine Scriptsprache implementieren, mit der NPCs gesteuert, Textboxen ausgegeben, am besten auch Fallunterscheidungen getätigt werden können. Mein letzter Versuch sah so aus:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
NPC.Goto(15 10)
NPC.WaitForInput
Script.LockUserInput
NPC.LookAtPlayer
Script.AddToTextbuffer(Moin!)
Script.AddToTextbuffer(Ich bin ein NPC und ich kann jetzt)
Script.AddToTextbuffer(endlich sprechen!)
Script.ShowTextbox
Script.WaitForTextbox
NPC.Goto(15 4)
NPC.Goto(12 4)
NPC.Goto(12 6)
NPC.Goto(15 6)
Script.UnlockUserInput
Script.Wait(2500)
NPC.Direction(3)
Script.Wait(2500)
NPC.Direction(1)
Script.Wait(2500)
NPC.Direction(0)
Script.Wait(2500)
NPC.Direction(2)
Script.Loop(13)
|
Mit diesem Code ging der NPC zur Position X=15 und Y=10, hat dann darauf gewartet, dass der Spieler ihn anspricht, hat den Spieler angesehen, ein wenig geredet, ist dann "weggelaufen" und stand danach die ganze Zeit auf der Stelle und hat sich gedreht. An sich hat das schon ganz gut funktioniert, nur war die Verarbeitung im Programm eine Qual und es gab weder Fallunterscheidungen noch frei belegbare Variablen. Ich hab die Datei in einem separaten Thread Zeile für Zeile ausgelesen und mit InStr abgefragt, ob sich in dieser Zeile ein Keyword befindet. Hier mal ein Beispiel (Achtung, VB-Code):
|
Quellcode
|
1
2
3
4
5
6
7
|
ElseIf InStr(Temp_String, "Script.AddToTextbuffer(") Then
Startindex = InStr(Temp_String, "(")
Endindex = InStr(Temp_String, ")") - 1
Dim Temp_TextbufferLine As String = Temp_String.Substring(Startindex, (Endindex - Startindex))
Rendering.Textbuffer.Lines.Add(Temp_TextbufferLine)
|
War das Konzept am Ende doch gar nicht mal so blöd? Ein alternatives Konzept wäre folgendes:
Es gibt jeweils 50 Variablen der Typen Integer, String und Boolean, welche sich in der Klasse "Variables" befinden.
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
static class Variables
{
public int[] i = new int[50];
public string[] s = new string[50];
public Boolean[] b = new Boolean[50];
public Boolean ShowTextBox = false;
}
|
Auf diese Variablen kann man nun aus dem Script zugreifen.
|
Quellcode
|
1
|
assign i_5 25
|
Hier wird i_5, also i[5] der Wert 25 zugewiesen. NPC Befehle könnten dann später so aussehen:
|
Quellcode
|
1
|
move npc_0 10 15
|
Dann sollte sich z.B. der NPC mit dem Index 0 zum Punkt X=10, Y=15 bewegen.
In C# sieht das ganze so aus:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
foreach (string line in script)
{
if (line.Contains("assign") == true)
{
int startindex = line.IndexOf("\t") + 1;
int stopindex = line.IndexOf("\t", startindex);
string var = line.Substring(startindex, stopindex - startindex);
int varindex;
if (var.Contains("i_") == true)
{
varindex = Convert.ToInt32(var.Substring(var.IndexOf("i_") + 2));
startindex = stopindex + 1;
string value = line.Substring(startindex);
i[varindex] = Convert.ToInt32(value);
}
}
}
|
Allerdings weiß ich auch hier nicht, wie ich If-Abfragen umsetzen sollte. Darüber kann ich mir aber immer noch Gedanken machen, wenn die Scripts überhaupt erstmal arbeiten. Was haltet ihr von den einzelnen Ansätzen? Welchen würdet ihr bevorzugen oder würdet ihr gar einen komplett anderen Weg wählen?
Grüße,
LeBusch