[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: RE: object handling
- From: "Kevin Baca" <lualist@...>
- Date: Tue, 14 Oct 2003 19:09:55 -0700
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
>