Script-Wie gehe ich vor [Der 2. versuch in Deutsch]
Übersicht

![]() |
GeeeckoBetreff: Script-Wie gehe ich vor [Der 2. versuch in Deutsch] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, ich möchte mir eine Script-Engine programmieren.
Doch ich stehe vor einem Problem, wie gehe ich nun vor? WAS sollte alles drinn sein WO sollte es stehen WIE würdet ihr das programmieren mfg gaia (sind ncoh Rechtschreibfeheler da?) ![]() EDIT: (sind noch Rechtschreibfeheler da?) ![]() |
||
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Script-Engine
Was sollte alles drinn sein Möglichkeit 1: - ein P-Code Compiler - ein P-Code Interpreter - eine Schnittstelle die die Script-Funktionen zuverfügung stellt Möglichkeit 2: - ein Interpreter - eine Schnittstelle die die Script-Funktionen zuverfügung stellt Hier das ist der Code einer Stackmaschine. Bestandteile Der Stackmaschine sind. Code: [AUSKLAPPEN] VM Speicher Codesegment Datensegment Stack Returnstack Name CS DS SS RS Zeiger IP - SP RP Befehlsübersicht Code: [AUSKLAPPEN] Push Pop Dbl Swap Mul Div Sub Add Neg Incr Decr And Not Or Xor Call Ret Jmp Jle AStor ALoad Stor Load Int Edit: Version 1.0 Code: [AUSKLAPPEN] Const MaxCode =4096 Const MaxData =4096 Const MaxStack =1024 Const MaxReturnStack=1024 Const cPush = 1 Const cPop = 2 Const cDbl = 3 Const cSwap = 4 Const cMul = 5 Const cDiv = 6 Const cSub = 7 Const cAdd = 8 Const cNeg = 9 Const cIncr =10 Const cDecr =11 Const cAnd =12 Const cNot =13 Const cOr =14 Const cXor =15 Const cCall =16 Const cRet =17 Const cJmp =18 Const cJle =19 Const cAStor =20 Const cALoad =21 Const cStor =22 Const cLoad =23 Const cInt =24 Global PCodeName$[24] PCodeName[cPush] = "Push " PCodeName[cPop] = "Pop " PCodeName[cDbl] = "Dbl " PCodeName[cSwap] = "Swap " PCodeName[cMul] = "Mul " PCodeName[cDiv] = "Div " PCodeName[cSub] = "Sub " PCodeName[cAdd] = "Add " PCodeName[cNeg] = "Neg " PCodeName[cIncr] = "Incr " PCodeName[cDecr] = "Decr " PCodeName[cAnd] = "And " PCodeName[cNot] = "Not " PCodeName[cOr] = "Or " PCodeName[cXor] = "Xor " PCodeName[cCall] = "Call " PCodeName[cRet] = "Ret " PCodeName[cJmp] = "Jmp " PCodeName[cJle] = "Jle " PCodeName[cAStor] = "AStor" PCodeName[cALoad] = "ALoad" PCodeName[cStor] = "Stor " PCodeName[cLoad] = "Load " PCodeName[cInt] = "Int " Type TVM Field CS[MaxCode ] Field DS[MaxData ] Field SS[MaxStack ] Field RS[MaxReturnStack] Field IP Field SP Field RP End Type Global VM.TVM VM=New TVM ;Push ;Int ;Incr ;Decr ;Mul ;Add ;div ;sub ;Not ;and ;Or ;Xor VM\CS[0]=cPush VM\CS[1]=100 VM\CS[2]=CPush VM\CS[3]=20 VM\CS[4]=cAStor VM\CS[5]=1 VM\CS[6]=cincr VM\CS[7]=CPush VM\CS[8]=1000 VM\CS[9]=cALoad VM\CS[10]=1 VM\CS[11]=CInt VM\CS[12]=1 VM\CS[13]=CInt VM\CS[14]=2 Run_VM Function Load_VM(Dateiname$) FileNr=ReadFile(DateiName$) If FileNr=0 Then Return False WMaxCode=ReadInt(FileNr) WMaxData=ReadInt(FileNr) WMaxStack=ReadInt(FileNr) WMaxReturnStack=ReadFile(FileNr) IP=ReadInt(FileNr) SP=ReadInt(FileNr) RP=ReadInt(FileNr) VM=New TVM For Zeiger=0 To WMaxCode VM\CS[Zeiger]=ReadInt(FileNr) Next For Zeiger=0 To WMaxData VM\DS[Zeiger]=ReadInt(FileNr) Next For Zeiger=0 To WMaxStack VM\SS[Zeiger]=ReadInt(FileNr) Next For Zeiger=0 To WMaxReturnStack VM\RS[Zeiger]=ReadInt(FileNr) Next CloseFile FileNr Return True End Function Function Save_VM(Dateiname$) FileNr=WriteFile(Dateiname$) If FileNr=0 Then Return False WriteInt FileNr,MaxCode WriteInt FileNr,MaxData WriteInt FileNr,MaxStack WriteInt FileNr,MaxReturnStack WriteInt FileNr,VM\IP WriteInt FileNr,VM\SP WriteInt FileNr,VM\RP For Zeiger=0 To MaxCode WriteInt FileNr,VM\CS[Zeiger] Next For Zeiger=0 To MaxData WriteInt FileNr,VM\DS[Zeiger] Next For Zeiger=0 To MaxStack WriteInt FileNr,VM\SS[Zeiger] Next For Zeiger=0 To MaxReturnStack WriteInt FileNr,VM\RS[Zeiger] Next CloseFile FileNr Return True End Function Function Run_VM() Repeat IP=VM\IP Select VM\CS[VM\IP] Case cPush VM\SS[VM\SP]=VM\CS[VM\IP+1] VM\SP=VM\SP+1 VM\IP=VM\IP+2 Case cPop VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cDbl VM\DS[VM\SP]=VM\DS[VM\SP-1] VM\SP=VM\SP+1 VM\IP=VM\IP+1 Case cSwap VM\DS[VM\SP-1]=VM\DS[VM\SP-1]+VM\DS[VM\SP-2] VM\DS[VM\SP-2]=VM\DS[VM\SP-1]-VM\DS[VM\SP-2] VM\DS[VM\SP-1]=VM\DS[VM\SP-1]-VM\DS[VM\SP-2] VM\IP=VM\IP+1 Case cMul VM\DS[VM\SP-2]=VM\DS[VM\SP-1]*VM\DS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cDiv VM\DS[VM\SP-2]=VM\DS[VM\SP-1]/VM\DS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cSub VM\DS[VM\SP-2]=VM\DS[VM\SP-1]-VM\DS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cAdd VM\DS[VM\SP-2]=VM\DS[VM\SP-1]+VM\DS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cNeg VM\DS[VM\SP-1]=-VM\DS[VM\SP-1] VM\IP=VM\IP+1 Case cIncr VM\DS[VM\SP-1]=VM\DS[VM\SP-1]+1 VM\IP=VM\IP+1 Case cNot VM\DS[VM\SP-1]=Not VM\DS[VM\SP-1] VM\IP=VM\IP+1 Case cDecr VM\DS[VM\SP-1]=VM\DS[VM\SP-1]-1 VM\IP=VM\IP+1 Case cAnd VM\DS[VM\SP-2]=VM\DS[VM\SP-1] And VM\DS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cOr VM\DS[VM\SP-2]=VM\DS[VM\SP-1] Or VM\DS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cXor VM\DS[VM\SP-2]=VM\DS[VM\SP-1] Xor VM\DS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cCall VM\RS[VM\RP]=VM\IP+2 VM\IP=VM\CS[VM\IP+1] VM\RP=VM\RP+1 Case cRet VM\IP=VM\RS[VM\RP] VM\RP=VM\RP-1 Case cJmp VM\IP=VM\CS[VM\IP+1] Case cJle If VM\DS[VM\SP-1]=<0 Then VM\IP=VM\CS[VM\IP+1] Else VM\IP=VM\IP+2 EndIf Case cAStor VM\SP=VM\SP-1 VM\DS[VM\CS[VM\IP+1]]=VM\SS[VM\SP] VM\IP=VM\IP+2 Case cALoad VM\SS[VM\SP]=VM\DS[VM\CS[VM\IP+1]] VM\SP=VM\SP+1 VM\IP=VM\IP+2 Case cStor VM\DS[VM\SS[SP-1]]=VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cLoad VM\SS[SP-1]=VM\DS[VM\SS[VM\SP-1]] VM\IP=VM\IP+1 Case cInt Schnittstelle VM\CS[VM\IP+1] VM\IP=VM\IP+2 Default End Select Print PCodeName[VM\CS[IP]]+" SP: "+Str(VM\SP)+" Stack: "+VM\SS[VM\SP-1] Delay 200 Forever End Function Function Schnittstelle(Nr) Select Nr Case 1 Print Pop() Case 2 WaitKey End End Select End Function Function Push(Wert) VM\SS[VM\SP]=Wert VM\SP=VM\SP+1 End Function Function Pop() VM\SP=VM\SP-1 Return VM\SS[VM\SP] End Function Function PopString$() Wert=Pop() While Wert<>0 S$=Chr$(Wert)+S$ Wert=Pop() Wend Return S$ End Function Function PushString(S$) Slen=Len(S$) Push 0 For P=1 To SLEN Push Asc(Mid$(S$,P,1)) Next End Function |
||
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0 |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich habe mir auch was überlegt ![]() Es gibt z.b. sowas wie eine Funktion im script die On_Collision() heist. Wenn man dann OnCollision(1) macht: 1=Explodieren 3=Weglaufen 1+3= 4=Explodierent weglaufen (^^) 5=schwimmern 6=Explodierent wegschwimmen 8=geht schlecht ![]() ![]() Edit: Habe deins net richtig verstanden ;( |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du additive Flags willst (also kombiniertes verhalten), dann musst du für die werte 2er Potenzen nehmen. Sonst geht das nicht. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also 2laufen 4=rennen 6=hüfen oder wie?
Aber dann komme ich ja mit 2+4 auf 6 (hüpfen) |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
2er Potenzen heisst: 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,... | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
... ![]() ![]() |
||
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gibt es irgednwo so ein TUT für script-engine sachen oder so? | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
~GESCHLOSSEN~ er benutze den Editbutton. Ich werde keine weitere Threadpusherei dulden. |
||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group