Wie Frase schon angesprochen hat, arbeite ich momentan an einer Scriptlösung für X-Dream.
Der Sinn ist folgender.
Da bei größeren Projekten nicht nur Programmierer sitzen sondern, vieleicht auch Grafiker oder Modeler.
Kann dieser ohne Programmierkentnisse und ohne das wissen der X-Dream Strukturen trotzdem ein Menü oder ähnliches bauen und ausprobieren.
Da Scriptsprache sehr simpel in der Handhabung sind,kann man diese in wenigen minuten lernen.
Lua schätze ich für jemanden der sowas nicht kennt so bei 15-20min ein und er kann mit Hilfe der X-Dream Script Doku Scripte schreiben.
Personen mit Programmiererfahrungen werden in 5min alles nötige Wissen was man braucht.
Ein weiter Vorteil ist, dass man nicht neucompilieren muss um etwas zu testen und man viele Dinge realisieren kann ohne einmal richtigen code zu schreiben. Momentan probiere ich mich noch aus und suche ein effektiven weg, zur implementierung aller wichtigen Befehle in Lua.
Hier mal ein aktuelles Beispiel.
Code: function MBtnDown() Exit() return 0 end; function create_gui() Window=GUI.AddWindow() GUI.ChangeWindowTitle(Window,'blupp') GUI.ChangeWidgetPosition(Window,10,10) ProgessBar=GUI.AddProgressBar(Window) GUI.ChangeWidgetPosition(ProgessBar,10,5) CheckBox=GUI.AddCheckBox(Window) GUI.ChangeWidgetPosition(CheckBox,10,40) StatusBar=GUI.AddStatusBar(Window) Label=GUI.AddLabel(Window) GUI.ChangeWidgetPosition(Label,10,80) Button=GUI.AddButton(Window) GUI.ChangeButtonTitle(Button,'exit') GUI.ChangeWidgetPosition(Button,128,64) GUI.AddMDownEvent(Button,'MBtnDown'); form1={} form1[Window]=Window form1[ProgessBar]=ProgessBar form1[CheckBox]=CheckBox form1[StatusBar]=StatusBar form1[Label]=Label form1[Button]=Button return 0 end; function draw() i=i+5*GetFrameTime() if i>100 then i=0 end GUI.ChangeProgressBarValue(form1[ProgessBar],i) return 0 end; function main() create_gui() FontManAddStyleColor(255,255,255) FontManAddStyleColor(255,0,0) GUI.ChangeWidgetPosition(form1[Window],50,50) i=0 DrawScript("draw") return 0 end;
Raus kommt dann folgendes.
Wichtig ist hier nur das das script beim start einmal interpretiert wird und dann main aufruft.
In Main hab ich dann eine funktion Draw als zeichenroutine angegeben.
Wenn also nun ein Renderdurchgang fast beendet ist wird diese funktion aufgerufen und ändert jeden Frame den Wert der ProgressBar.
Beim erstellen der GUI Elemente hab ich noch ein Event OnMouseBtnDown mit MbtnDown zugewiesen und dies wird dann aufgerufen wenn der ExitBtn gedrückt wird. In der Funktion wird wiederum die Exit Funktion aufgerufen die das Programm anweist sich zu beenden.
Geplant ist noch das Laden der GUIdaten aus einer XML file, so das viel Zeit gespart wird und der Code kleiner wird.
Ich will mich auch nochmal mit RTTI beschäftigen um zu ermöglichen, dass automatisch alle published funktionen und variablen aus dem Freepascal/Delphi Code in Lua gebunden werden.
Momentan verbrate ich recht viele Zeilen(5-36Zeilen pro funktion) um die momentanen funktionen zur verfügung zu stellen und es kostet einiges an Zeit.
Wer jetzt überlegt wie es mit der Performance aussieht kann ich nur sagen, Siedler,Painkiller,Farcry und Unreal3 lösen es auch so nur das Unreal3 ne eigene Scriptsprache statt Lua nutzt. Im Bereich GUI nutzten Homeworld2 und World of Warcraft ebenfalls Lua, um somit dem user ein sehr flexible Bedieneroberfläche zu geben.
|