Lua Wrapper

Übersicht BlitzBasic DLLs und Userlibs

Gehe zu Seite Zurück  1, 2, 3

Neue Antwort erstellen

Noobody

BeitragMi, Apr 28, 2010 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Prinzipiell nein. Lua erstellt keine Verbindung zwischen anderen Programmen, die auch Lua verwenden.

Du kannst aber Programme mit den ganz normalen B3D-Funktionen kommunizieren lassen, z.B. per UDP. Das wurde im Forum schon einige Male gefragt, mit der Forensuche findest du sicher was.
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
 

DJ_Mic

BeitragMi, Sep 22, 2010 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, das ich diesen Thread aus April ausgrabe, habe nur eine Frage.

Und zwar, ist es möglich ein Lua Script in Runtime zu laden? Also ich habe ein Netzwerkspiel vor, wo der Server die Lua Datei enthält. Und dann will ich vor dem Verbinden auf den Server das er sie runterlädt und benutzt.

Ist das möglich?

Noobody

BeitragMi, Sep 22, 2010 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das ist ohne weiteres möglich.
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

faeX

BeitragFr, Aug 05, 2011 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.

Ich habe mir in Lua eine function geschrieben und möchte diese mit Parametern aufrufen und die Rückgabewerte wieder irgendwie erfragen.

Ohne Parametern mache ich das einfach mit der Funktion Lua_GetGlobal.
Das Parameter und Rückgabeproblem löse ich derzeit unschön über Globale.
Geht das auch direkt?

mfG
faeX

Noobody

BeitragFr, Aug 05, 2011 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das geht, sogar mit mehreren Rückgabewerten.

Kommunikation zwischen Programm und Lua-Script erfolgt dabei über den Lua-Stack. Bei einem Funktionsaufruf schiebt man die Argumente zuerst auf den Stack, ruft die Funktion auf und holt sich dann deren Rückgabewerte wieder vom Stack. Die genaue Reihenfolge der einzelnen Werte auf dem Stack ist dabei natürlich sehr wichtig, daher würde ich mir die Dokumentation von lua_call und überhaupt die Dokumentation des Lua-Stacks zu Gemüte führen.

Ein kleines Beispiel, welches Lua-Funktionen mit Argumenten aufruft und Rückgabewerte abfragt BlitzBasic: [AUSKLAPPEN]
Include "Lua_Include.bb"

Local L = LuaL_NewState()
LuaL_OpenLibs(L)
Lua_InitInterface(L, "CallFunction")

Local Status = LuaL_LoadFile(L, "Beispiel.lua")
If Status Then RuntimeError("Error while loading script!" + Chr(10) + Lua_ToString(L, 1))

Status = Lua_PCall(L, 0, 0, 0) ;Wichtig: Script vor den Funktionsaufrufen mindestens einmal ausführen, damit die Funktionsnamen registriert werden
If Status Then RuntimeError("Error while executing script!" + Chr(10) + Lua_ToString(L, 1))


Lua_GetGlobal(L, "TestFunktion1") ;Funktion auf den Stack bringen
Lua_PushNumber(L, 42) ;Erstes Argument auf den Stack
Lua_PushNumber(L, 25) ;Zweites Argument auf den Stack

Lua_PCall(L, 2, 1, 0) ;Die erste Funktion mit zwei Argumenten aufrufen und nur einen Rückgabewert akzeptieren

Local ReturnValue = Lua_ToNumber(L, -1) ;Rückgabewert vom Stack holen

Print("TestFunktion1(42, 25): " + ReturnValue)

Lua_Pop(L, 1) ;Rückgabewert löschen und Stack in den Originalzustand zurückführen




Lua_GetGlobal(L, "TestFunktion2")
Lua_PCall(L, 0, LUA_MULRET, 0) ;Zweite Funktion ohne Argumente aufrufen und beliebig viele Rückgabewerte akzeptieren

;Rückgabewerte sind in "direct order" auf dem Stack, d.h. letzter Rückgabewert liegt zuoberst
Local ReturnValue3# = Lua_ToNumber(L, -1)
Local ReturnValue2$ = Lua_ToString(L, -2)
Local ReturnValue1 = Lua_ToNumber(L, -3)

Print("TestFunktion2(): " + ReturnValue1 + ", " + ReturnValue2 + ", " + ReturnValue3)

Lua_Pop(L, 3) ;Rückgabewerte löschen und Stack in den Originalzustand zurückführen

Lua_Close(L)
WaitKey()
End

Function Lua_UserFunction()
End Function


Dazugehöriges "Beispiel.lua": Code: [AUSKLAPPEN]
function TestFunktion1(A, B)
   return A + B
end

function TestFunktion2()
   return 1337, "Hello World!", 3.1415926
end
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

faeX

BeitragFr, Aug 05, 2011 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey cool danke. Smile

Eine Frage noch:
Ich lasse alles von einem Skript gesteuert ablaufen. Also wird auch eine Funktion "RunGame" im Hauptskript ausgeführt. Wenn nun in einem Luaskript, das irgendwann in der Hauptschleife aufgerufen wird ein Fehler auftritt, liefert der Lua-Fehler nur "RunGame". Ist zwar immer möglich den Fehler so zu finden. Aber eine genauere Fehlerbeschreibung wär schon geil. Kann man das auch irgendwie beheben?

Noobody

BeitragFr, Aug 05, 2011 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt ein dafür gedachtes Debug Interface, allerdings ist das nicht gewrappt.

Es bleibt einem also nichts anderes übrig als mit strategisch platzierten Prints die Fehlerstelle ausfindig zu machen Sad
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

faeX

BeitragSa, Aug 06, 2011 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, passt, vielen Dank!! Smile

Skabus

BeitragMo, Aug 08, 2011 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Mal eine Frage:

Gibts eigtl. eine Möglichkeit das auch für BlitzMax verfügbar zu machen?

Ich würds gerne verwenden, für BB bringt es mir nur leider nix Sad


Danke für die Hilfe^^

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

hazumu-kun

BeitragMo, Aug 08, 2011 7:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Blitzmax solltest du dich erstmal nach einem Modul umschauen, dass es schon gibt. die Wahrscheinlichkeit besteht jedenfalls.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

blackgecko

BeitragMo, Aug 08, 2011 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax hat sogar schon ein Lua-Modul eingebaut: pub.lua
Schau mal in der Seitenleiste der MaxIDE unter Help > Modules > Other > Lua Core (Doppelklick)
Wie gut das ist, weiß ich nicht, aber du kannst ja mal reinschauen.
EDIT: Hab den anderen Thread jetzt erst entdeckt.
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax
Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die.

Gehe zu Seite Zurück  1, 2, 3

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group