Hello friends,
I'm working on a game that requires intensive scripting (adventure game) and I experience some difficulties dealing with global properties.
It would be great if someone could help a fellow indie developer. Thanks.
Problem #1 (Solved - see below)
The problem is that in the example provided here: documentation link, we see that:
// Variables that should be accessible through the script.
CObject *g_object = 0;
// A function to register the global properties.
void RegisterProperties(asIScriptEngine *engine)
{
// Register variable where the script can store a handle to a CObject type.
// Assumes that the CObject type has been registered with the engine already as a reference type.
r = engine->RegisterGlobalProperty("CObject @g_object", &g_object); assert( r >= 0 );
}
However it doesn't seem to work for me . I do it like this:
int r = 0;
GraphicsObject* go = ((GraphicsObject*)GetEntity("mooseCloth"));
r = engine->RegisterGlobalProperty("GraphicsObject @mooseCloth", &go); SE_ASSERT( r >= 0 );
go = ((GraphicsObject*)GetEntity("topCloth"));
r = engine->RegisterGlobalProperty("GraphicsObject @topCloth", &go); SE_ASSERT( r >= 0 );
go = ((GraphicsObject*)GetEntity("mooseHead"));
r = engine->RegisterGlobalProperty("GraphicsObject @mooseHead", &go); SE_ASSERT( r >= 0 );
Everything compiles without errors, but when I access this objects from script all of them point to the latest declaration "mooseHead". So for example if I go
topCloth.DoStuff();
instead of accessing topCloth it interferes with mooseHead.
What am I doing wrong here?
One thing though, getting rid of this "@" for script variable declaration and "&" for passing the pointer to the object seems to solve that problem. But I'm not sure if it is a good way to go and if there any pitfall involved?
Problem #2 (Solved, see Andreas answer)
I want to declare a variable in a scope of module, so that when the game scene gets destroyed all the global variables are destroyed with it. However I didn't find a way to do that. There is a thing CompileGlobalVar() but it doesn't allow me to pass the pointer to an object and there is no other function to do so (as far as I see), so I'm confused at that point.
There is no ability to destroy/unregister a global variable in the asIScriptEngine as well.
Thanks.
Yaroslav.