Script Engin (test)
Übersicht

MatheBetreff: Script Engin (test) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich wollt mal fragen ob das der richtige Ansatz für eine ScriptEngine ist? Es kann bis jetzt noch nicht viel aber ein bischen was kann es auch schon ![]() ScriptEngine: Code: [AUSKLAPPEN] Dim Script$(22)
;ScriptStart Befehl Script(0) = "StartScript/" ;Variablen Setzen Script(1) = ":INT=" Script(2) = ":FLOAT=" Script(3) = ":STRING=" ;Grafikbefehle Script(4) = "Graphics(" Script(5) = "SetBuffer BackBuffer()" Script(6) = "Flip" ;Ausgabe Befehle Script(7) = "Print(" Script(8) = "Locate(" Script(9) = "Text(" ;Bilder Befehle Script(10) = "LoadImage(" Script(11) = "DrawImage(" ;Rechen Befehle Script(12) = "+" Script(13) = "-" Script(14) = "*" Script(15) = "/" ;PauseBefehle Script(16) = "WaitKey" Script(17) = "WaitMouse" Script(18) = "Delay(" ;Schleifen & Abfragen Script(19) = "If" Script(20) = "Then" Script(21) = "End" ;ScriptEnd Befehl Script(22) = "EndScript/" Type VarINT Field inhalt% Field name$ End Type Type VarFLOAT Field inhalt# Field name$ End Type Type VarSTRING Field inhalt$ Field name$ End Type Type Image Field pfad$ Field image Field name$ End Type ;Script Daten Type Script Field zeile$ End Type ;--------Test ReadScript("Test.script") RunScript() ;----------- ;Löscht den Script Datenspeicher... Function DeleteScript() For scr.Script = Each Script Delete scr.Script Next End Function ;Liest den Script in den Datenspeicher ein... Function ReadScript(Pfad$) DeleteScript() ScriptStream = OpenFile(Pfad) Repeat scr.Script = New Script scr\zeile = ReadLine(ScriptStream) Until Eof(ScriptStream) = 1 CloseFile ScriptStream End Function ;Läuft den Script ab und führt Befehle aus... Function RunScript() StartScript$ = "nein" EndScript$ = "nein" For scr.Script = Each Script scrtext$ = scr\zeile ;StartScript If 1 = Instr(scrtext,script(0)) Then StartScript$ = "ja" If StartScript = "ja" Then ;------------------------- ;Variablen setzen ;INT-1 If 0 < Instr(scrtext,script(1)) Then VInt.VarINT = New VarINT nn% = Instr(scrtext,script(1)) VInt\name = Str(Mid(scrtext,1,nn-1)) VInt\inhalt = Int(Mid(scrtext,nn + Len(script(1)),-1)) ;FLOAT-2 ElseIf 0 < Instr(scrtext,script(2)) Then VFloat.VarFLOAT = New VarFLOAT nn% = Instr(scrtext,script(2)) VFloat\name = Str(Mid(scrtext,1,nn-1)) VFloat\inhalt = Int(Mid(scrtext,nn+Len(script(2)),-1)) ;STRING-3 ElseIf 0 < Instr(scrtext,script(3)) Then VString.VarSTRING = New VarSTRING nn% = Instr(scrtext,script(3)) VString\name = Str(Mid(scrtext,1,nn-1)) VString\inhalt = Str(Mid(scrtext,nn+Len(script(3)),-1)) EndIf ;Grafikbefehle ;Graphics (weite,höhe,farbtiefe,modus(1 Voll, 2 Win))-4 If 1 = Instr(scrtext,script(4)) Then Lens = Len(script(4)) kom1 = Instr(scrtext,",") kom2 = Instr(scrtext,",",kom1+1) kom3 = Instr(scrtext,",",kom2+1) klam = Instr(scrtext,")") weite = Int(Mid(scrtext,Lens+1,kom1-(Lens+1))) hoehe = Int(Mid(scrtext,kom1+1,kom2-(kom1+1))) farbtiefe = Int(Mid(scrtext,kom2+1,kom3-(kom2+1))) Modus = Int(Mid(scrtext,kom3+1,klam-(kom3+1))) Graphics weite,hoehe,farbtiefe,Modus ;SetBuffer Backbuffer()-5 ElseIf 1 = Instr(scrtext,script(5)) Then SetBuffer BackBuffer() ;Flip-6 ElseIf 1 = Instr(scrtext,script(6)) Then Flip EndIf ;Ausgabebefehle ;Print(text)-7 If 1 = Instr(scrtext,script(7)) Then Lens% = Len(script(7)) klam% = Instr(scrtext,")") xtext$ = Str(Mid(scrtext,Lens+1,klam-(Lens+1))) Print xtext ;Locate(x,y) ;Text(x,y,text,z_x,z_y) EndIf ;Pausebefehle ;Waitkey-16 If 1 = Instr(scrtext,script(16)) Then WaitKey EndIf ;------------------------- EndIf If 1 = Instr(scrtext,script(22)) Then End Next End Function ScriptText: Code: [AUSKLAPPEN] StartScript/
Graphics(640,480,32,2) SetBuffer Backbuffer() testvar:INT=1000 testvar:FLOAT=0.00023 testvar:STRING=TextTextText Print(Es geht hoffentlich) Print(und das geht auch wieder) Print(und das auch) Print(warte auf TastenDruck!) WaitKey EndScript/ Edit: ausgebessert ![]() mfg. |
||
- Zuletzt bearbeitet von Mathe am Fr, Apr 03, 2009 16:27, insgesamt 3-mal bearbeitet
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur eines: Engine | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin jetzt nur schnell drübergeflogen, aber da sind mir ein paar Sachen aufgefallen:
Also ich würde (an deiner Stelle) die Zeilen der Datei nicht in einem Type speichern, es ist zwar angenehm, aber auch langsam, besonders bei langen Codes. Das merkt man wahrscheinlich bei dir noch nicht, da du noch nicht viele Grafik-Befehle eingebaut hast. Meine erste Scriptsprache hatte auch noch das Prinzip mit dem ins-Type-Laden, aber ich habs aufgegeben, da bei mir ein kleines Grafikprogramm(das 600 Punkte zeichnete) 3 Minuten zum ausführen brauchte. Außerdem würde ich die Befehle Startscript und Endscript rausschneiden, weil das... ... nervt und ... auch noch Speicherplatz verschwendet Außerdem: Code: [AUSKLAPPEN] If 1 = Instr(scrtext,script(16)) Then
das ist nicht empfehlenswert, da du hier nur abfragst ob der Text aus script(16) an erster Stelle in scrtext steht. Schreib lieber <>0. Außerdem: Code: [AUSKLAPPEN] StartScript$ = "nein"
Das ist Speicherverschwendung. Wenn du "Ja" und "Nein" als mögliche Werte hast, solltest du Int-Variablen nehmen und sie entweder auf 1 oder auf 0 setzen. Ich hoffe das hilft ein bisschen. |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Thunder hat Folgendes geschrieben: Also ich würde (an deiner Stelle) die Zeilen der Datei nicht in einem Type speichern, es ist zwar angenehm, aber auch langsam, besonders bei langen Codes.
Dass Types primär langsamer sind als Arrays, stimmt zwar, jedoch sind sie garantiert nicht schuld an drei Minuten Ausführzeit ![]() Types sind sehr viel flexibler als Array, deswegen kann ich sie vor allem bei einer Scriptsprache empfehlen. Allerdigns würde ich vorschlagen, das Script vor dem Ausführen zu zerlegen - denn die ganzen Stringoperationen sind das, was bei Laufzeit zu Performanceschwierigkeiten führen. Dein Type enthielte dann nur noch das Feld Aktion, welches den Scriptbefehl kennzeichnet (beispielsweise 'Rufe Funktion auf' oder 'definiere lokale Variable' etc.). Das Feld ist dann ein Int, da Zahlen sehr viel schneller verarbeitet werden können als Zeichenketten (um die Übersicht mit den ganzen Zahlen zu behalten, ist Const ![]() Das ist nur ein Vorschlag, die Meinungen darüber gehen sicher auseinander, aber so würde ich es empfehlen ![]() Ansonsten ist deine Scriptsprache nicht schlecht für den Anfang - du hast ja immerhin schon verschiedene Datentypen und Funktionen drin. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
coolo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ich selber schon ein paar Erfahrungen in diesem Bereich habe, hätte ich da ein paar Mängel:
1. Speichere Zeilen nicht in einem Type, sondern in einem mehrdimensionalen Array, das hat zwar weniger flexibilität, ist aber nicht wirklich nötig, da ja die Wahrscheinlichkeit das während des Ausführens Zeiolen hinzukommen gering ist ![]() 2. Speichere Variablen in Arrays, und gebe deren einen Index, das hat einen enormen Speed Vorteil. (Das kann man auch anders sehen, aber meine Tests haben eindeutig für Arrays gestimmt) 3. Parse das Script vor, also das wichtige Informationen was die Zeile macht, und iwe sie es mach extern gespeichert werden (Wenn man ein Mehrdimensonales Array erwendet könnte man eine Dimension für die Zeile an sich verwenden und eine 2. für die Bank mit den Infos). Außerdem heißt das, dass die Schleifen in Gotos umgewandelt werden. 4. Verwende einen Stringrechner, wie du im Moment die Werte der Variablen ausrechnest ist mir unbekannt. 5. Baue auf jedenfall den " als String Operator ein, du wirst am Anfang noch glauben das sei unnötig, aber Wenn du Variablen voll implementiert hast, wirst du wissen warum. 6. WAS? Du verwendest keinen Stringzerteiler und machst alles per Hand? Extrem unflexibel! Just my 2 cents!!111elf |
||
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project! "Eigenzitate sind nur was für Deppen" -Eigenzitat |
Mathe |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Antworten...
zu Thunder: Ich weis nicht ob es so es bei zwei Variablen die miteinander 12 Byte bis 16 Byte brauchen so viel ausmacht... eigentlich bräucht ich die gar nicht hast eigentlich recht... <-- (StartScript, EndScript) zu Noobody: Was meinst du mit zerlegen? Durchlaufen lassen ob Fehler drin sind, oder wie meinst du das? zu coolo: 1. Also du meinst z.B. Dim VInt%(1000,1), VFloat#(1000,1),VString$(1000,1) [1,0 = Index(Name) ; 1,1 = Wert] hab ich dich so richtig verstanden? In BB ist es ja möglich eine Function zu schreiben die die Array erweitert wär das nicht besser, denn wenn ich eine Array vordefiniere braucht sie ja schon Speicher und das wären ja unnötige Ressourcen die da verschwenden würde. 2. Stringrechner ähm bis jetzt kann es noch gar nichts rechnen. Muss mir erst mal was überlegen wie ich das machen kann. 3. String Operator hmmm... okey muss ich mir mal überlegen wie ich das anstelle wird aber nicht so schwer sein (bin leider noch Anfänger). 4. Was meinst du mit Stringzerteiler? Neu-Start: So ich hab noch mal neu angefangen mit der ScriptEngine (dieses mal gleich richtig geschrieben ^^). Es gibt jetzt beim einlesen der Script-Datei zwei Möglichkeiten. 1. Der Script wird Zeile für Zeile in ein Type gespeichert! 2. Im Type werden nur die Vorhandenen Zeilen die auch die Befehle enthalten gespeichert. Hört sich komisch an ich meine ganz einfach, dass wenn in der Script-Datei z.B. steht: ;Aha Graphics(640,480,32,2) SetBuffer Backbuffer() ... Nur die Befehle Graphics und SetBuffer abgespeichert werden. Der Nachteil ist halt das es länger dauert bis ein Script eingelesen wurde. Bei einem kürzen Code macht es nichts aus, aber wenn sie länger werden sollten, dann wird man dies bestimmt merken. mfg. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group