(Gelöst) Lua Methoden beibringen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Horst der Biber

Betreff: (Gelöst) Lua Methoden beibringen

BeitragSa, Nov 24, 2007 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich habe vor allgemeine Scripts für das Verhalten von z. B. Gegnern in meinem Spiel zu schreiben. Dazu habe ich jetzt jedem gescripteten Spielobjekt eine Scriptengine gegeben, die in jedem Durchlauf das Verhaltensscript ausführt. Jedoch benötige ich dazu Methoden, damit ich nicht in jedem Script angeben muss, welches Spielobjekt sich so verhalten soll.

Code: [AUSKLAPPEN]
Type TScriptedEntity Extends TEntity
   Field ScriptEnv:TLuaScriptEngine = New TLuaScriptEngine
   Field Scripts:TMap = New TMap
   Field Sprite:TImage
   Field Frame:Int
   
   Method New()
      ScriptEnv.Reset()
      ScriptEnv.AddFunction(LuaSetPosition, "SetPosition")
   End Method
   
   Method AddScript(name:String, text:String)
      Scripts.Insert(name, TScript.Create(text))
   End Method
   
   Method AddConditionForScript(script:String, condition:String, initstate:Byte)
      TScript(Scripts.ValueForKey(script)).AddCondition(condition, initstate)
   End Method
   
   Method Update()
      Local script:TScript
      
      For script = EachIn Scripts.Values()
         script.Run(ScriptEnv)
      Next
   End Method
   
   Method Render(scrollx:Float, scrolly:Float)
      'If Sprite = Null Then Return
      
      'DrawImage Sprite, Pos.X - scrollx, Pos.Y - scrolly, Frame
      
      SetColor 200, 80, 60
      DrawRect Pos.X - scrollx, Pos.Y - scrolly, 32, 32
      SetColor 255, 255, 255
   End Method
   
   Method LuaSetPosition(luastate:Byte Ptr)
      Pos = TPoint.Create(ScriptEnv.CheckNumber(-2), ScriptEnv.CheckNumber(-1))
   End Method
End Type


Daher meine Frage:
Ist es irgendwie möglich Lua Methoden bei zu bringen? Oder kennt jemand eine andere Möglichkeit allgemeine Verhaltensscripts zu verwenden?
  • Zuletzt bearbeitet von Horst der Biber am So, Nov 25, 2007 15:12, insgesamt einmal bearbeitet
 

Dreamora

BeitragSa, Nov 24, 2007 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Erm man gibt nicht jedem Objekt eine VM, dass ist dir bewusst oder?
Weil der sinn der VM ist es dass sie virtuelles Multithreading erlaubt, das geht nur wenn sie auch in einer VM sind.

Normalerweise splittet man höchstens wirklich getrennte Dinge in verschiedene VMs wie AI und Worldhandling und dergleichen. Dinge die halt effektiv nicht "in einer welt sein müssen"


Deine Frage ist allerdings leicht unpräzise gestellt.
Was willst du genau machen? LUA Funktionen von BM aufrufen oder BM Funktionen von LUA aus aufrufen?

Und nein, methoden kannst du glaub nicht aufrufen. Da musst du eine Funktion im Type schreiben die eine ID annimmt (die ID stellt einen Int Handle für die Objektinstanz dar) und auf dem Objekt mit dieser ID die entsprechende Methode aufruft.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Horst der Biber

BeitragSo, Nov 25, 2007 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ich habe mich wirklich unpräzise ausgedrückt. Ich wollte von Lua aus BlitzMax Methoden aufrufen.

Ich habe jetzt einen Umweg gefunden, indem ich nur noch eine "VM" verwende, der ich alle möglichen Funktionen wie SetPos, CreateEntity usw. beigebracht habe. Das mit den Methoden habe ich so gelöst, dass im Script statt der ID (bei mir ein String) des allgemeinen Objekts einfach "self" steht. Bevor jedes Script ausgeführt wird, wird der Name des Objekts gespeichert und wenn "self" im Script auftaucht, durch diesen Namen ersetzt.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group