Lua Anwendung in BMax

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

Wild-Storm

Betreff: Lua Anwendung in BMax

BeitragSa, Sep 16, 2006 13:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho, als wiedereinstieg in die Community poste ich erstmal ein kleines Tutorial, welches die Anwendung der lua-scriptengine in BMax behandelt. Die Module sind NICHT in PUB auffindbar, sondern in AXE!
also, viel Spaß beim Lernen^^

Als Erstes importieren wir die notwendigen Module

Code: [AUSKLAPPEN]

Import axe.luascript
Import axe.lua


Code: [AUSKLAPPEN]

Global scriptEnv:TLuaScriptEngine = New TLuaScriptEngine


Hiermit erstellen wir die Variable ScriptEnv (für Scriptengine Environment, also Scriptsprachen Umgebung xD)

Nun starten wir praktisch die Engine und setzen alles zurück, was wir möglicherweise davor schon der Variable scriptEnv "eingeflöst" haben

Code: [AUSKLAPPEN]

scriptEnv.Reset()


Cool, die Engine läuft also! Aber was jetzt? Wie wäre es mal mit "Hello World!"?
Also erstellen wir uns eine Textdatei mit dem Namen: "Test1.lua"
Der Inhalt der Datei soll

Code: [AUSKLAPPEN]

Print("Hello World!")


lauten.

Naja, jetzt müssen wir eigentlich die Datei nurnoch ausführen! Dies schaffen wir, indem wir

Code: [AUSKLAPPEN]

scriptEnv.RunScriptFile("test1.lua")


in Bmax schreiben.

Zu guter letzt wollen wir natürlich die Scriptengine wieder runterfahren, um z.B. Speicher freizugeben. Dies geschieht ganz einfach mit:

Code: [AUSKLAPPEN]

scriptEnv.ShutDown()


Ist doch recht easy oder?
Hier nochmal der ganze Code:

Code: [AUSKLAPPEN]

Superstrict 'Muss nicht sein

Import axe.luascript
Import axe.lua

Global scriptEnv:TLuaScriptEngine = New TLuaScriptEngine

scriptEnv.Reset()

scriptEnv.RunScriptFile("test1.lua")

scriptEnv.ShutDown()


Aber wir wollen jetzt auch eigene Funktionen in LUA integrieren. Schliesslich soll unsere Scriptsprache nicht nur was per "Print" auf den Bildschirm schreiben!
Also starten wir wieder unsere Scriptengine!

Code: [AUSKLAPPEN]

Superstrict 'Muss nicht sein

Import axe.luascript
Import axe.lua

Global scriptEnv:TLuaScriptEngine = New TLuaScriptEngine

scriptEnv.Reset()


Jetzt kommt der spannende Teil, wie kann ich meine eigene Funktion in LUA adden und Variablen lesen?
Als erstes schreiben wir uns schnell eine neue .lua Datei. z.B. test2.lua. Der Inhalt soll wie folgt lauten:

Code: [AUSKLAPPEN]

F_GreetTest1("Wild-Storm")
Print(F_GreetTest2("WS"))


und nun zum BMax Code! Fangen wir damit an, dass wir die Funktion "F_GreetTest1" zu lua hinzufügen wollen!
Dazu schreiben wir erstmal in BMax eine eigene Funktion, die einen Integerwert zurückgibt! Diese kann beliebig heißen! z.b. LUA_Greet1!
Also machen wir uns ans Werk

Code: [AUSKLAPPEN]

Function LUA_Greet1:Int( luaState:Byte Ptr )


Als nächstes wollen wir den Namen, den wir grüßen, wissen. In dem Fall ist es "Wild-Storm", da wir ja "F_GreetTest1("Wild-Storm")" geschrieben haben!
Dazu schreiben wir:

Code: [AUSKLAPPEN]

    Local name$=scriptEnv.CheckString(-1)


Was ist aber, wenn unsere Funktion mehr als ein Parameter hat? Naja ganz einfach, das 1. Parameter hat den Wert von -1, das 2. Parmeter hat den Wert von -2 usw. Hier ein Beispiel (NICHT in den Bmax COde integrieren, es dient nur zur Veranschaulichung!!)

Code: [AUSKLAPPEN]

    Local name1$=scriptEnv.CheckString(-1)
    Local greet$=scriptEnv.CheckString(-2)
    Local name2$=scriptEnv.CheckString(-3)


So, wir haben also unseren Namen. Jetzt schreiben wir das einfach auf den Bildschirm (in BMax)

Code: [AUSKLAPPEN]

     Print("Hello, "+name$+"!")


und zu guter letzt schliessen wir die gesamte Funktion.

Code: [AUSKLAPPEN]

     Return 1
End Function   


Jetzt gilt es nurnoch, die neu geschrieben Funktion LUA beizubringen...Das geht aber ganz einfach mit einem Befehl:

Code: [AUSKLAPPEN]

scriptEnv.AddFunction(LUA_Greet1,"F_GreetTest1")


Das erste Parameter trägt den Namen der BMax Funktion und das zweite steht für den Namen, den LUA dafür bekommt!
Ist doch recht easy, oder?

Insgesamt sieht das dann so aus:

Code: [AUSKLAPPEN]

SuperStrict
Import axe.luascript
Import axe.lua

Global scriptEnv:TLuaScriptEngine = New TLuaScriptEngine
scriptEnv.Reset()

Function LUA_Greet1:Int( luastate:Byte Ptr )   
     Local name$=scriptEnv.CheckString(-1)
     Print("Hello, "+name$+"!")
     Return 1
End Function   

scriptEnv.AddFunction(LUA_Greet1,"F_GreetTest1") 

scriptEnv.RunScriptFile("test2.lua")

scriptEnv.ShutDown()


Nunja, jetzt wollen wir noch ein Parameter an LUA zurückgeben, das geht relativ einfach..Dazu schreiben wir uns eine neue Funktion:

Code: [AUSKLAPPEN]

Function LUA_Greet2:Int( luastate:Byte Ptr ) 
     Local name$=scriptEnv.CheckString(-1)
     scriptEnv.ReturnStringToLua("Hello, "+name$+"!")
     Return 1
End Function


Na? Den neuen Befehl entdeckt? Wahrscheinlich schon, oder? ^^
Mit scriptEnv.ReturnStringToLua("Hello, "+name$+"!") geben wir der Funktion einen Returnwert. In diesem Fall: "Hello, WS!"

Und zuletzt übergeben wir die Funktion an LUA:

Code: [AUSKLAPPEN]

     scriptEnv.AddFunction(LUA_Greet2,"F_GreetTest2")


Alles recht easy, nich? ^^

So hier noch der komplette Code:

Code: [AUSKLAPPEN]

SuperStrict
Import axe.luascript
Import axe.lua

Global scriptEnv:TLuaScriptEngine = New TLuaScriptEngine
scriptEnv.Reset()

Function LUA_Greet1:Int( luastate:Byte Ptr )   
    Local name$=scriptEnv.CheckString(-1)                         
     Print("Hello, "+name$+"!")       
     Return 1
End Function   

Function LUA_Greet2:Int( luastate:Byte Ptr ) 
    Local name$=scriptEnv.CheckString(-1)
     scriptEnv.ReturnStringToLua("Hello, "+name$+"!")
     Return 1
End Function

scriptEnv.AddFunction(LUA_Greet1,"F_GreetTest1") 
scriptEnv.AddFunction(LUA_Greet2,"F_GreetTest2")

scriptEnv.RunScriptFile("test2.lua")

scriptEnv.ShutDown()


Wenn ihr Fehler finden solltet, meldet sie doch bitte! Auch Ergänzungen sind erwünscht.
Über sonstiges Lob oder Kritik würde ich mich freuen!

mfg

Wild-Storm


Getestet in BMax 1.22.
Das Tutorial basiert auf den englischen Versionen (siehe nächster Absatz), die allerdings mit der BMax Beta geschrieben wurden und deshalb leicht fehlerhaft sind!

http://www.blitzwiki.org/index.php/Lua_Tutorial
http://www.blitzwiki.org/index...ion_to_Lua
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

Firstdeathmaker

BeitragDo, Jul 24, 2008 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, das mit dem Printen funktioniert aber nicht, solange man nicht auch eine Print-Wrapper Funktion geschrieben und Lua übergeben hat:

Code: [AUSKLAPPEN]
Function Print2:Int(luastate:Byte Ptr)
   Print(scriptEnv.CheckString( - 1) )
   Return 1
End Function

scriptEnv.AddFunction(Print2,"Print")
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

#Reaper

Newsposter

BeitragDo, Jul 24, 2008 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, du musst aber im Script "print" kleinschreiben, dann geht es. (Soweit ich es in Erinnerung habe)

@Wild-Storm: Danke für das Tutorial Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

juse4pro

BeitragDo, Mai 27, 2010 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Can't find interface axe.luascript

auch nicht mit pub vorn... was nun?
Portfolio |LinkedIn |XING

mpmxyz

BeitragDo, Mai 27, 2010 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Der Thread ist alt.
2. Der Thread ist tot.
3. axe.lua und axe.luascript könnte man für tot erklären, da in BlitzMax zwei Lua-Module integriert wurden: pub.Lua und brl.MaxLua
Wenn du axe.luascript unbedingt nutzen möchtest, musst du es dir aus den Tiefen des Internets heraussuchen.
(Es ist aber wahrscheinlich, dass daran wegen dem offiziellen Modul nicht mehr weitergearbeitet wird.)
mfG
mpmxyz
Edit: Ja, lese dir einfach mal die Dokumentation durch und du wirst es finden!
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
  • Zuletzt bearbeitet von mpmxyz am Do, Mai 27, 2010 21:13, insgesamt 2-mal bearbeitet

juse4pro

BeitragDo, Mai 27, 2010 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
BRL.MAXLUA?
nochnie was von gehört, ist da bei der standart installation bei?
Portfolio |LinkedIn |XING

DaysShadow

BeitragDo, Mai 27, 2010 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
BRL.MaxLua wird das sein was du suchst, weiterhin gibt es Pub.Lua.

Edit: Zu spät... und ja, ist es.

MfG DaysShadow
Blessed is the mind too small for doubt

juse4pro

BeitragDo, Mai 27, 2010 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde es in den Doc's nicht, warum?
Portfolio |LinkedIn |XING

DaysShadow

BeitragDo, Mai 27, 2010 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, zu doof zum suchen? Wink

System -> Lua Scripting.
Blessed is the mind too small for doubt

juse4pro

BeitragDo, Mai 27, 2010 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
hppf... kann sein..
Das hatte ich wohl überlesen, weils mit "max" anfing, und nicht mit "lua"
Razz
Portfolio |LinkedIn |XING

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group