Lua Wrapper

Übersicht BlitzBasic DLLs und Userlibs

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

Noobody

Betreff: Lua Wrapper

BeitragMi, März 04, 2009 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
In den letzten Wochen habe ich mich stark mit der offiziellen C - API für Lua auseinandergesetzt und einen Wrapper dafür geschrieben.
Dieser stellt einen Grossteil der Funktionen für Blitzbasic zur Verfügung und macht so die Einbindung von Lua - Scripts in BB möglich.
Ein Kernfeature der DLL ist dabei die Möglichkeit, von Lua aus Blitzbasic - Funktionen aufrufen zu können.

Was ist Lua?
Lua ist eine Scriptsprache, die heutzutage in vielen Spielen (World of Warcraft, Supreme Commander etc.) eingesetzt wird, um Spielinhalt extern festlegen zu können und so zum Beispiel auch das effektive Modden von Spielen möglich macht.
Eventuell hilft ein kleiner Ausflug auf den Wikipediaartikel

Die Benutzung der DLL in einem Projekt erfolgt folgendermassen:
- Kopieren der 'Lua Wrapper.decls' und 'Lua Wrapper.dll' in den Userlibs - Ordner der BB - Installation
- Einbinden der Lua - Include in den Hauptcode Wichtig: Die Include - Anweisung muss am Anfang des Codes stehen, da in der Include einige Zeilen ausführbaren Codes enthalten sind, die einmalig ausgeführt werden müssen.

Wenn man ein Lua - Script ausführen will, muss man mehrere Dinge beachten.
Jedes Lua - Script läuft in einem sogenannten 'Lua State'. Ein State ist so etwas wie ein Namensraum, in dem globale Variablen gespeichert werden und Scripts ausgeführt werden.
Erstellt man mehrere States, so sind diese unabhängig voneinander und teilen auch nicht ihre globalen Variablen.

Sobald der State per LuaL_NewState() erstellt ist, muss man einige Dinge initialisieren.
Die Standardlibs werden per LuaL_OpenLibs( State ) in einen Lua - State geladen. Diese Standardlibs enthalten Hilfsfunktionen, die später im Script genutzt werden können. Zu diesen Funktionen gehören beispielsweise Mathefunktionen, Stringfunktionen oder Funktionen zum lesen und schreiben von Dateien.
Auf diese Anweisung kann auch verzichtet werden, wenn man die Hilsfunktionen nicht braucht.
Zweiter Schritt sollte das Aufrufen der Funktion Lua_InitInterface sein.
Diese Funktion errichtet eine Schnittstelle zwischen Lua und Blitz und ermöglicht es so, dass Blitzbasic - Code vom Script aus aufgerufen werden kann.
Der erste Parameter ist der State, für den die Schnittstelle eingerichtet werden soll, der zweite Parameter ist der Name der Funktion, über den man Blitz - Code ansprechen kann.

Ein kleines Beispiel: Code: [AUSKLAPPEN]
L = LuaL_NewState()
LuaL_OpenLibs( L )
Lua_InitInterface( L, "CallFunction" )

In diesem Beispiel haben wir die Funktion 'CallFunction' genannt, zu dessen Verwendung komme ich später zurück.

Als nächstes sollte in der Hauptdatei eine Funktion namens 'Lua_UserFunction' erstellt werden.
Diese Funktion wird jedesmal aufgerufen, wenn im Lua - Script in unserem Beispiel 'CallFunction' aufgerufen wird.
Folgender Funktionsrumpf hat sich bisher bewährt und sollte beibehalten werden: Code: [AUSKLAPPEN]
Function Lua_UserFunction()
   L = Lua_GetCurrentState()
   
   FuncName$ = Lua_ToString( L, 1 )
   
   Select FuncName$
      Case "Print"
         Print Loa_ToString( L, 2 )
   End Select
End Function


Im Lua - Script ruft man unsere Funktion also folgendermassen auf: Code: [AUSKLAPPEN]
CallFunction( "Print", "Hello World!" )


Was spielt sich also ab?
Lua erkennt unsere Funktion 'CallFunction', da die Wrapperfunktion 'InitInterface' eine Verlinkung dazu hergestellt hat.
Daraufhin ruft es die Blitz - Funktion auf und schiebt die Parameter nacheinander auf den Stack.

Was ist denn jetzt der Stack?
Damit wir mit Lua und Lua mit uns kommunizieren kann, gibt es den sogenannten Stack. Damit ist nicht etwa der Stack in Assembler gemeint, sondern ein von Lua erstellter virtueller Stack. Darunter kann man sich einen grossen Stapel vorstellen, auf dem Werte liegen, die man dann auslesen kann - selbstverständlich kann man auch neue Werte obendrauflegen.
Auf diesen Stack schiebt Lua Parameter, wenn es unsere Funktion aufruft und auf diesen können wir Werte schieben, wenn unsere Funktion etwas zurückgibt.
Da wir als erstes Argument bei 'CallFunction' "Print" angegeben haben, ist das erste Element auf dem Lua - Stack also "Print".
Dieses können wir per 'Lua_ToString( L, 1 )' auslesen. Als zweiten Parameter steht dort natürlich 1, weil wir das erste Element auf dem Stack auslesen wollen.
Dann folgt unsere Select - Case Anweisung, um herauszufinden, was wir denn jetzt eigentlich tun sollen.
Bis jetzt reagieren wir dort nur auf den Fall, das vom Script 'Print' aufgerufen wird - dort kann man dann selbstverständlich mehr Code hinzufügen, wenn es ein grösseres Projekt wird.
In unserem Fall von Print müssen wir noch auslesen, was wir denn genau ausgeben wollen.
Bei 'CallFunction' haben wir "Hello World!" angegeben, also müsste an zweiter Position im Stack unsere Nachricht stehen.
Darum lesen wir das per 'Lua_ToString( L, 2 )' aus und geben es aus - Tadaa! Es steht Hello World auf dem Bildschirm.

Das klingt jetzt alles ein wenig kompliziert, aber das ist alles Sache der Übung.
Obligatorisch für Neueinsteiger ist natürlich die Englische Dokumentation sowohl zur Lua - Syntax als auch zur API.
Die Dokumentation der API ist zwar für C gedacht, aber alle Funktionen sind im Wrapper 1:1 übernommen.

Ein paar Beispielcodes sind in einem Downloadpaket am Ende des Beitrags zu finden.

Die .decls: Code: [AUSKLAPPEN]
.lib "Lua_Wrapper.dll"

LuaL_NewState%():"_luaL_newstate@0"
LuaL_OpenLibs( L% ):"_luaL_openlibs@4"
Lua_Close( L% ):"_lua_close@4"

LuaL_LoadFile%( L%, Path$ ):"_luaL_loadfile@8"
LuaL_LoadString%( L%, Chunk$ ):"_luaL_loadstring@8"
LuaL_LoadBuffer%( L%, Buffer*, Size%, Name$ ):"_luaL_loadbuffer@16"

Lua_Call( L%, NArgs%, NResults% ):"_lua_pcall@16"
Lua_PCall%( L%, NArgs%, NResults%, Errfunc% ):"_lua_pcall@16"

Lua_GetTop%( L% ):"_lua_gettop@4"
Lua_SetTop( L%, S% ):"_lua_settop@8"
Lua_Remove( L%, Index% ):"_lua_remove@8"
Lua_Insert( L%, Index% ):"_lua_insert@8"
Lua_Replace( L%, Index% ):"_lua_replace@8"
Lua_CheckStack%( L%, Size% ):"_lua_checkstack@8"

Lua_IsNumber%( L%, Index% ):"_lua_isnumber@8"
Lua_IsString%( L%, Index% ):"_lua_isstring@8"
Lua_Type%( L%, Index% ):"_lua_type@8"
Lua_TypeName$( L%, Type% ):"_lua_typename@8"

Lua_PushNil( L% ):"_lua_pushnil@4"
Lua_PushNumber( L%, Number# ):"_lua_pushnumber@8"
Lua_PushInteger( L%, Int% ):"_lua_pushinteger@8"
Lua_PushLString( L%, String$, Length% ):"_lua_pushlstring@12"
Lua_PushString( L%, String$ ):"_lua_pushstring@8"
Lua_PushValue( L%, Index% ):"_lua_pushvalue@8"
Lua_PushBoolean( L%, Bool% ):"_lua_pushboolean@8"
Lua_PushLightUserdata( L%, Data* ):"_lua_pushlightuserdata@8"

Lua_ToNumber#( L%, Index% ):"_lua_tonumber@8"
Lua_ToInteger%( L%, Index% ):"_lua_tointeger@8"
Lua_ToBoolean%( L%, Index% ):"_lua_toboolean@8"
Lua_ToLString$( L%, Index%, Length% ):"_lua_tolstringWrap@12"

Lua_GetTable( L%, Index% ):"_lua_gettable@8"
Lua_GetField( L%, Index%, Key$ ):"_lua_getfield@12"
Lua_RawGet( L%, Index% ):"_lua_rawget@8"
Lua_RawGetI( L%, Index%, Key% ):"_lua_rawgeti@12"
Lua_CreateTable( L%, NArr%, NRec% ):"_lua_createtable@12"
Lua_GetMetaTable%( L%, ObjIndex% ):"_lua_getmetatable@8"
Lua_GetFEnv( L%, Index% ):"_lua_getfenv@8"

Lua_SetTable( L%, Index% ):"_lua_settable@8"
Lua_SetField( L%, Index%, Key$ ):"_lua_setfield@12"
Lua_RawSet( L%, Index% ):"_lua_rawset@8"
Lua_RawSetI( L%, Index%, Key% ):"_lua_rawseti@12"
Lua_SetMetaTable%( L%, ObjIndex% ):"_lua_setmetatable@8"
Lua_SetFEnv%( L%, Index% ):"_lua_setfenv@8"

Lua_InitInterface( L%, FuncName$ ):"_InitInterface@8"
Lua_SaveInstructionPointer%():"_SaveInstructionPointer@0"
Lua_GetCurrentState%():"_GetCurrentState@0"
Lua_SetResults( Args% ):"_SetResults@4"
Lua_GetStackPointer%():"_GetStackPointer@0"

.lib " "

Lua_Pop( L%, N% )
Lua_SetGlobal( L%, S$ )
Lua_GetGlobal( L%, S$ )
Lua_NewTable( L% )
Lua_ToString$( L%, N% )

Lua_IsFunction%( L%, N% )
Lua_IsTable%( L%, N% )
Lua_IsLightUserData%( L%, N% )
Lua_IsNil%( L%, N% )
Lua_IsBoolean%( L%, N% )


Die Include: Code: [AUSKLAPPEN]
Global Lua_FirstCall = True

Const LUA_REGISTRYINDEX      = -10000
Const LUA_ENVIRONINDEX      = -10001
Const LUA_GLOBALSINDEX      = -10002

Const LUA_TNONE            = -1
Const LUA_TNIL            =  0
Const LUA_TBOOLEAN         =  1
Const LUA_TLIGHTUSERDATA   =  2
Const LUA_TNUMBER         =  3
Const LUA_TSTRING         =  4
Const LUA_TTABLE         =  5
Const LUA_TFUNCTION         =  6
Const LUA_TUSERDATA         =  7
Const LUA_TTHREAD         =  8

Const LUA_MULRET          = -1

Const LUA_GCSTOP         =  0
Const LUA_GCRESTART         =  1
Const LUA_GCCOLLECT         =  2
Const LUA_GCCOUNT         =  3
Const LUA_GCCOUNTB         =  4
Const LUA_GCSTEP         =  5
Const LUA_GCSETPAUSE      =  6
Const LUA_GCSETSTEPMUL      =  7

Function Lua_Pop( L, N )
   Lua_SetTop( L, -(N)-1 )
End Function

Function Lua_SetGlobal( L, S$ )
   Lua_SetField( L, LUA_GLOBALSINDEX, S$ )
End Function

Function Lua_GetGlobal( L, S$ )
   Lua_GetField( L, LUA_GLOBALSINDEX, S$ )
End Function

Function Lua_NewTable( L )
   Lua_CreateTable( L, 0, 0 )
End Function

Function Lua_ToString$( L, N )
   Return Lua_ToLString( L, N, 0 )
End Function

Function Lua_IsFunction( L, N )
   Return ( Lua_Type( L, N ) = LUA_TFUNCTION )
End Function

Function Lua_IsTable( L, N )
   Return ( Lua_Type( L, N ) = LUA_TTABLE )
End Function

Function Lua_IsLightUserData( L, N )
   Return ( Lua_Type( L, N ) = LUA_TLIGHTUSERDATA )
End Function

Function Lua_IsNil( L, N )
   Return ( Lua_Type( L, N ) = LUA_TNIL )
End Function

Function Lua_IsBoolean( L, N )
   Return ( Lua_Type( L, N ) = LUA_TBOOLEAN )
End Function

.Lua_GetPointer
   Lua_SaveInstructionPointer()
   
   If Lua_FirstCall Then
      Lua_FirstCall = False
   Else
      Lua_UserFunction()
      Return
   EndIf


Die DLL einzeln: Download

Die .decls, die Include, die DLL und ein paar Beispiele mit Lua - Scripts stehen hier zur Verfügung (sehr empfohlen).

Für das Editieren und Erstellen von Lua - Scripts kann ich SciTE empfehlen: Downloadseite.
Alternativ genügt natürlich auch ein gewöhnlicher Texteditor.

Der Wrapper ist noch nicht ganz fertig, aber schon relativ gut verwendbar.
Bei Fragen und Anregungen stehe ich gerne zur Verfügung.
  • Zuletzt bearbeitet von Noobody am Mo, Dez 14, 2009 14:46, insgesamt 2-mal bearbeitet

Lord Stweccys

Betreff: Lua

BeitragMi, März 04, 2009 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Für mein jetziges Projekt brauch ich für die verschiedenen Levels auch Scripts. Meine Scriptsprache ist ziemlich unprofessionell. THX!

Edit: Funzt net: Userlib not found.
Dabei klappen sonst alle DLLs bei mir Sad Sad
Braucht man da noch eine 'Lua.dll' ?

Hab Vista, liegts daran???
 

BIG BUG

BeitragMi, März 04, 2009 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Geilomatiko, endlich mal wieder eine LUA-Einbindung für Blitz3D!

Bei mir hats funktioniert, hatte aber auch vorher "LUA for Windows" installiert. Wäre natürlich ganz interessant zu wissen, was man noch vom LUA-Zeug hinzufügen muss, damit es auch auf anderen Computern funktioniert.

Ich vermute der Flaschenhals wird die Auswertung der String-Funktionsnamen auf Blitz-Seite sein, wobei ich die Geschwindigkeit noch nicht untersucht habe.
Meinst Du, Du kriegst das direkte Callen einer Funktion, vielleicht auch mit vorheriger Initialisierung von Funktionsname und Parameter noch hin? Das wäre natürlich genial.

Werde das definitiv weiterverfolgen...
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Noobody

BeitragMi, März 04, 2009 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
BIG BUG hat Folgendes geschrieben:
Bei mir hats funktioniert, hatte aber auch vorher "LUA for Windows" installiert. Wäre natürlich ganz interessant zu wissen, was man noch vom LUA-Zeug hinzufügen muss, damit es auch auf anderen Computern funktioniert.

Überhaupt nichts Razz
Alle benötigten Funktionen und Libs stecken in der DLL.

BIG BUG hat Folgendes geschrieben:
Ich vermute der Flaschenhals wird die Auswertung der String-Funktionsnamen auf Blitz-Seite sein, wobei ich die Geschwindigkeit noch nicht untersucht habe.

Das sollte kein Problem sein. Ein einfaches Select - Case mit einem String wird kaum merklich Performance saufen, ausser natürlich, man ruft die Funktion ein paar hunderttausend Mal auf, aber da wäre Lua so oder so zu langsam.
Genauere Tests stehen noch aus, aber das wird wie gesagt kaum etwas ausmachen.


BIG BUG hat Folgendes geschrieben:
Meinst Du, Du kriegst das direkte Callen einer Funktion, vielleicht auch mit vorheriger Initialisierung von Funktionsname und Parameter noch hin? Das wäre natürlich genial.

Ich bin zwar nicht ganz sicher, was du mit "Initialisierung von Funktionsname" meinst, aber es ist so oder so unmöglich, ausser, Mark Sibly selbst schickt mir eine Dokumentation dazu, wie er Funktionsaufrufe in Assembler umsetzt Razz

Danke fürs Feedback!
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
 

BIG BUG

BeitragMi, März 04, 2009 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh ok, da Du ja nach diesen Funktionsaufrufen geforscht hattest, hatte ich gehofft dass Du eine Möglichkeit für den direkten Aufruf gefunden hast Smile
Und diese "CallFunction" funktioniert doch auch?
Mit Initialisieren meinte ich der DLL eine Liste bereitzustellen, welche die Funktionsbeschreibungen enthält.

Wenn Du die LUA-Routinen mit in Deine DLL gepackt hast, welche Lua-Version hast Du da verwendet?
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Noobody

BeitragMi, März 04, 2009 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
BIG BUG hat Folgendes geschrieben:
Und diese "CallFunction" funktioniert doch auch?

Die CallFunction geht den Zwischenschritt über eine Subroutine in der Lua - Include.
Diese müsste man für jede Funktion, die man hinzufügen will, neu erstellen und das ist eindeutig zuviel Aufwand beim gewonnenen Nutzen (ausserdem gibt es dann Probleme mit den übergebenen Parametern, was momentan durch eine unsichtbare Wrapperfunktion in der DLL abgefangen wird).

BIG BUG hat Folgendes geschrieben:
Wenn Du die LUA-Routinen mit in Deine DLL gepackt hast, welche Lua-Version hast Du da verwendet?

Die momentan aktuelle Version 5.1

Edit: Oh, sorry, habe erst jetzt den Edit von Lord Stweccys gesehen Razz
Wenn du die DLL direkt gezogen hast, heisst die DLL 'Lua_Wrapper', in der Decls wird aber 'Lua Wrapper' eingebunden.
Leider ein Problem mit meinem Webspace, der keine Leerzeichen im Dateinamen zulässt.
Einfach die DLL umbenennen, ich werde mal die neue .decls reineditieren.
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, März 04, 2009 23:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert anscheinend aber nur, wenn auch ''LUA for Windows'' installiert ist. Ansonsten erscheint ''Userlib not found'' und verweist auf ''Lua_SaveInstructionPointer()''.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragDo, März 05, 2009 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hat dann aber überhaupt nichts mit 'Lua for Windows' zu tun, denn Lua_SaveInstructionPointer ist eine von mir geschriebene Funktion, die garantiert nichts in der 'Lua for Windows' - Edition zu suchen hat Wink
Ganz sicher, dass die DLL im Userlibs - Verzeichnis steckt und den gleichen Namen hat wie in der .decls genannt?
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

Thorsten

BeitragDo, März 05, 2009 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert, auch ohne "LUA for Windows" Wink

Nette Sache, ich werds mal testweise demnächst verwenden, danke! =)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, März 05, 2009 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, generell gehören keine DLLs ins Userlibs-Verzeichnis. Ich weiß auch nicht, wer das Gerücht vor Jahren mal ins Forum geworfen hat. Benötigte DLLs gehören dahin, wo man sein Blitz-Projekt bearbeitet. Aber ich hab nun auch dein Ratschlag befolgt, ohne Auswirkung auf Besserung. Natürlich jedesmal die .decls neu eingelesen welches sich mit einem successfully meldete. Sogar die Standard-IDE habe ich mehrfach ausprobiert. Immer das gleiche Problem. Dann hab ich wieder meine ganzen API-.decls mit rein geworfen, in der Hoffnung, dass eventuell API-Aufrufe gemacht werden. Auch ohne Erfolg. Also entweder wird eine Lua-Installation benötigt, oder irgendwelche andere Sachen die es so gibt. Es wird aber keine sinnvolle Fehlermeldung ausgegeben, womit man was anfangen könnte.

Allerdings habe ich die Funktion Lua_SaveInstructionPointer() nirgens.

-

Also, ich lösch jetzt erstmal alles, und lade alles wieder neu.

Edit1: Nee, geht nicht. Da sind irgendwelche Dependencies drine. Und ohne zu wissen welche es sind, ergibt es auch keinen Sinn jetzt alles was so auf dem Markt besteht zu installieren.

Noobody

BeitragDo, März 05, 2009 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man DLLs in den Userlib - Ordner steckt, hat das den Vorteil, dass man die DLL nicht bei jedem Code in den gleichen Ordner stecken muss, wenn er eine Funktion dieser DLL verwendet.

Mal abgesehen davon - ich habe jetzt alle DLLs und .decls aus meinem Userlibs - Ordner entfernt und den Ordner, wo mein Code steckt, auch nochmals alles auf DLLs überprüft, und es funktioniert immer noch.
Die Funktion Lua_SaveInstructionPointer steckt in der DLL und nicht in der Include, daher findest du sie auch nicht Wink
Ich habe jetzt das Gesamtpaket neu gepackt und hochgeladen, vielleicht hilft das.
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, März 05, 2009 0:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Nee, geht immer noch nicht. Mit Dependencies meine ich auch nicht deine Zusammenstellung, sondern Software die bereits auf dem Rechner installiert sein muß. Das sind so Sachen wie .Net, JRE, DirectX, OpenGL... Alles Sachen die in der Windows-Grundinstallation nur zum Teil, ältere Versionen oder gar nicht installiert sind. Da ich aber nicht in Erfahrung bringen konnte, welche Anhängigkeiten Lua hat, will ich nun auch nicht alles mögliche installieren, in der Hoffnung, dass ich mal das richtige erwische. Ich könnte allerdings auch ''Lua for Windows'' installieren. Da werden die nötigen Sachen sicherlich installiert. Das Problem ist dann aber, wenn es bei mir funktioniert, funktionieren eventuell meine Programme dann wieder nicht auf anderen Rechner, da da dann das gleiche Problem wieder auftretten kann.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragDo, März 05, 2009 1:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, ich habs.
Das Problem hatte ich schon einmal, da war nämlich im Linker etwas falsches eingestellt - nämlich Multithreaded DLL.
Ich habe es jetzt umgeändert auf Multithreaded, was schon damals des Rätsels Lösung war.
Einfach die DLL nochmals herunterladen, dann sollte es klappen (übrigens hatte ich Lua for Windows gar nie installiert, also kann es nicht daran liegen Razz ).
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

Lord Stweccys

Betreff: Lua

BeitragDo, März 05, 2009 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle Hilfe!
Klappt super! Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy
 

FWeinb

ehemals "ich"

BeitragMi, Apr 08, 2009 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schöne Dll verwende sie in meinem nächsten Projekt, dass Problem was ich noch habe ist das wenn in dem Script eine Funktion aufgerufen wird, welche nicht in der Lua_UserFunction() Definiert ist das ganze Einfach ohne Fehlermeldung abstürtzt.
Würde es Möglich sein dort eine Fehlermeldung außzugeben?

Troßdem eine sehr schöne Leistung das ganze zu Wrappen.

mfg

ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Noobody

BeitragMi, Apr 08, 2009 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Es stürzt ohne Fehlermeldung ab? Das ist natürlich seltsam, das funktioniert bei mir ohne Probleme.

Probier mal folgendes: Code: [AUSKLAPPEN]
Function Lua_UserFunction()
   L = Lua_GetCurrentState()
   
   FuncName$ = Lua_ToString( L, 1 )
   
   Select FuncName$
      Case "TolleFunktion"
         DoStuff()
      Default
         DebugLog "Function not found: " + FuncName$
         Lua_SetResults( 0 )
   End Select
End Function


Es kann nämlich sein, dass, wenn vorher noch nie Lua_SetResults aufgerufen wurde, in der Variable mit der Anzahl Rückgabewerte Müll enthalten ist (C initialisiert Variablen ja nicht automatisch) und Lua deswegen abstürzt. Ein Lua_SetResults( 0 ) sollte daher Abhilfe schaffen.
Wenn es immer noch nicht geht, kannst du mir ja eine PM mit dem Code schicken, dann schaue ich es mir mal an.

Ich plane, vielleicht noch ein Tutorial zur Benutzung von Lua zu machen - auch wenn die Scriptsprache schon 'fixfertig' auf dem Teller ist, ist die Benutzung der API doch nicht ganz einfach.
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
 

FWeinb

ehemals "ich"

BeitragMi, Apr 08, 2009 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle Hilfe, jetzt geht es.

mfg

ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Xaymar

ehemals "Cgamer"

BeitragSa, Dez 05, 2009 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich da nochmal zwei fragen.

Wie kann ich aus Blitz heraus eine LUA Datei so starten lassen das nur die Funktion läuft die ich haben möchte? Meine LUA Files haben alle keine Main schleife sondern sind auf Funktionen aufgeteilt.

Wie kann ich, wenn ich eine LUA datei starte, zusätzliche LUA Dateien mit einbinden um Benutzern CallFunction zu ersparen?

Mfg
CGamer
Projekte: AMD AMF Encoder (OBS Studio), Stream Effects (OBS Studio), BlitzLLVM (Blitz auf LLVM), Streamlabs OBS
Blog | Twitter | YouTube | Twitch | Patreon

Noobody

BeitragSa, Dez 05, 2009 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Um Funktionen aufzurufen, musst du zuerst das Script wie gewohnt laden und dann folgendes tun BlitzBasic: [AUSKLAPPEN]
lua_getglobal( L, "DeineFunktion" )
lua_pushstring( L, "ErsterParameter" )
lua_pushinteger( L, 123456 ) ;Zweiter Parameter
lua_call( L, 2, 0 )

Für eine genauere Beschreibung von lua_call siehe hier.

2. Wenn du mit einbinden Include meinst, so ist wohl dofile das, was du suchst.
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

Xaymar

ehemals "Cgamer"

BeitragSa, Dez 05, 2009 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab zwei lua dateien.
Die erste:
Code: [AUSKLAPPEN]
DrawImage(img, 0,0)

und die zweite:
Code: [AUSKLAPPEN]
function DrawImage( Image, dX, dY )
CallFunction( "DrawImage", Image, dX, dY )
end


wenn ich nun die erste ausführe, kann ich dann die zweite direkt mit dofile() einbinden/includen? Also so als wären Lua2.lua und Lua1.lua eine Datei.
Projekte: AMD AMF Encoder (OBS Studio), Stream Effects (OBS Studio), BlitzLLVM (Blitz auf LLVM), Streamlabs OBS
Blog | Twitter | YouTube | Twitch | Patreon

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group