LUA doesn't return changes of object values
BlitzMax Forums/BlitzMax Beginners Area/LUA doesn't return changes of object values
| ||
Hi there, Im just starting to learn how lua works with BMax, but now I encountered a question. I would like create for my ki lua-scripts to move and steer them. So I created a type (TEnemy) which is running a simple lua script. As super object I set the object itself, and in the script I want to "move" that object over the screen. But if I run that code, in BMax nothing happens. Just in the script the values are changed. How can I make that by lua-script changed var's are also changed in BMax? BMax Code superstrict ' Type TEnemy Field name:String = "Angry Enemy" Field luaclass:TLuaClass Field luaobject:TLuaObject Field x:float Field y:float Method setScript(scriptpath:String) Local f:TStream = ReadFile(scriptpath) Local source:String = f.ReadString(f.size() ) CloseFile f Self.luaclass = TLuaClass.Create(source) Self.luaobject = TLuaObject.Create(luaclass , Self) Assert luaobject,"TEnemy.setScript() luaobject not created" End Method Method process() luaobject.Invoke "process_ki" , Null render() End method Method render() DrawRect Self.x,Self.y,10,10 End method End Type Graphics 400,300 Local e:TEnemy = New TEnemy e.setScript("script1.lua") repeat cls e.process() flip Until KeyHit(KEY_ESCAPE) end LUA script1.lua function process_ki() self.x = self.x + 1 self.y = self.y + 1 print(self.x) if ( self.x>=400 ) then self.x = 0 end if ( self.y>=300 ) then self.y = 0 end print(self.name) print("process ki") end |
| ||
Hiya, You need to register the object "e" with lua like this: LuaRegisterObject e,"enemy" And then update your lua script to refer to the object 'enemy' rather than 'Self'. I've also reduced the amount of code in setscript by using loadstring() luascript1.bmx luascrip1.lua |
| ||
Yea, that works. But that means also, that I have to register the object every loop? Or do I missunderstand how I should use Lua?'superstrict ' Type TEnemy Global list:TList = New TList Method New() TEnemy.list.addlast(Self) End method Function Update() For Local e:TEnemy = EachIn list e.process() next End function Field name:String = "Angry Enemy" Field luaclass:TLuaClass Field luaobject:TLuaObject Field x:Float Field y:Float Method setScript(scriptpath:String) Local f:TStream = ReadFile(scriptpath) Local source:String = f.ReadString(f.size() ) CloseFile f Self.luaclass = TLuaClass.Create(source) Self.luaobject = TLuaObject.Create(luaclass , Self) Assert luaobject,"TEnemy.setScript() luaobject not created" End Method Method process() LuaRegisterObject(Self , "enemy") luaobject.Invoke "process_ki" , Null render() End Method Method render() DrawRect Self.x,Self.y,10,10 End Method End Type Graphics 800 , 600 For Local i:Int = 0 Until 100 Local e:TEnemy = New TEnemy e.setScript("script1.lua") e.x = Rand(0 , GraphicsWidth()) e.y = Rand(0,GraphicsHeight()) next Repeat Cls TEnemy.Update() Flip Until KeyHit(KEY_ESCAPE) End function process_ki() enemy.x = enemy.x + 1 enemy.y = enemy.y + 1 if ( enemy.x>=800 ) then enemy.x = 0 end if ( enemy.y>=600 ) then enemy.y = 0 end end |
| ||
you only need to register the object once |