lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Yes.

Also, check out the __gc metamethod.  With it you can do the converse.
When a lua object is GC'd you can then delete the C object.

-Kevin

> 
> Kevin,
> That's very helpful, thanks.  If I call a functin that 
> deletes an object in my engine, can I then delete the table 
> (e.g.A123) by setting it to nil? Thanks again, Brett
> 
> ----- Original Message ----- 
> From: "Kevin Baca" <lualist@aidiastudios.com>
> To: "'Lua list'" <lua@bazar2.conectiva.com.br>
> Sent: Wednesday, October 15, 2003 10:09 AM
> Subject: RE: object handling
> 
> 
> > To pass the table A123 to a lua function from C:
> >
> > //Retrieve the lua function
> > lua_pushstring( L, "funcname" )
> > lua_gettable( L, LUA_GLOBALSINDEX );
> >
> > //Retrieve A123 (assuming it is a global)
> > lua_pushstring( L, "A123" )
> > lua_gettable( L, LUA_GLOBALSINDEX )
> >
> > lua_call( L, 1, 0 ) //call funcname() with 1 arg and 0 return vals
> >
> > Some other things to think about:
> >
> > You could have a lua function create the lua table and the C object 
> > simultaneously, then store a reference (userdata) to the C object in
> the
> > lua table.
> >
> > Conversely, create the lua table and the C object 
> simultaneously from
> C
> > and store a reference to the lua table in the C object 
> (perhaps using 
> > the lua_ref() macro).
> >
> > Or you can mix and match as you desire.
> >
> > Either way, once you have a way to create objects you might want to 
> > think about defining all object variables (C-side and 
> lua-side) in lua 
> > because lua provides such a nice syntax for that sort of thing.
> >
> > Example:
> >
> > -- This creates a new tank object that contains a reference
> > -- to a C object (as a userdata)
> >
> > function Tank( tankDef )
> >     local tank =
> >     {
> >         ammo = tankDef.ammo,
> >         health = tankDef.health
> >     }
> >
> >     -- Create the C object (a userdata) and store a ref to
> >     -- it in tank.__cobj__
> >     tank.__cobj__ = C_tankCreate( tankDef.actorData )
> >
> >     return tank
> > end
> >
> > -- The following will call Tank() and tank0 will
> > -- refer to the new tank
> >
> > tank0 = Tank
> > {
> >     ammo = 10,
> >     health = 100,
> >     actorData =
> >     {
> >         -- Internal C data
> >         followTerrain = true,
> >         collideable = true,
> >     }
> > }
> >
> > This way you can define lua-side data and C-side data in in the same
> lua
> > config table.
> >
> > Hope that makes sense.
> >
> > -Kevin
> >
> > > Newbie question....
> > >
> > > We're trying to come up with an efficient way to handle our game 
> > > objects from lua.  For a given game object, we define a complete 
> > > schema that includes the engine data and the game 
> extensions to that 
> > > data.  So for example, an Actor schema will have some 
> core internal 
> > > use variables and some additional game specific variables 
> (e.g. tank 
> > > might have armor, player might have health, etc.)  Currently, we 
> > > stuff the engine's internal variables into a C struct and the
> > > additional variables into a lua table, then use lua bindings
> > > to call engine functions that operate on the internal data
> > > and use lua directly to manipulate the lua tables. So far so good.
> > >
> > > At authoring time all of this is transparent to the 
> designer.  They 
> > > simply create instances of actors and add new variables 
> to them as 
> > > they need them.  When they export the game, we split the data and 
> > > generate a guid for each engine object and embed that in 
> the engine 
> > > data and then create a lua table with the same name as 
> the guid that 
> > > also contains elements to hold the additional variables.
> > >
> > > My questions are:
> > >
> > > 1.  Is this a lame way to do this?  What are the other 
> ways? (either 
> > > implicitly or explicitly) 2.  If I have a guid of A123 
> (stored as a 
> > > 4 byte int, not char) and I create a lua table as A123 = 
> {}, when I 
> > > call from the engine into lua, what do I need to pass lua (or 
> > > configure before calling) so that a lua funciton can receive the 
> > > correct table to operate on?  I tried several experiments 
> passing in 
> > > the A123 as a number and a string and it doesn't work.  
> Do I need to 
> > > pass the table itself?  How do I do that?
> > >
> > > Thanks for the help.
> > > Brett
> > >
>