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)
endLUA 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 |