Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sistema de script para mi juego.

Iniciado por Oanime, 24 de Octubre de 2007, 01:12:47 PM

« anterior - próximo »

Oanime

Sobre lo primero que comentas, la segunda opcion no la entiendo. NO querrás haber querido decir tener en LUA por objeto un puntero al objeto de C++ o algo asi?.

Yo estaba llevando lo segundo que comentas 1 paso más allá y era crear un estado por ejemplar (o instancia). Según he estado leyendo se puede tener un estado maestro, donde residirian todos los generos (se cargarian todos en ese estado), y despues a la hora de crear un objeto, este se crearia en un subestado (creo que lo llaman coroutines) q puede acceder a ese estado maestro, pero su instancia vive en otro estado aparte. Así tienes la ventaja de tener una relación 1:1 entre el CActor en C++ y su instancia de datos en LUA. He de investigar algo más.


Muchas gracias por los apuntes,
HexDump.

gdl

No sabía lo de las corrutinas, pero es lo que te quería decir en la segunda parte de mi anterior post. Sobre la primera parte y el puntero díscolo, intentaré explicarte.

Este es el pseudocódigo de la función C++ que llama a Lua cuando atacan a un ejemplar.


void Instance::onHit(INSTANCE_ID attacker)
{
 Llamada_a_Lua("onHit", this->GetID(), attacker);
}


Y este el pseudocódigo de la función C++ que implementa la función "GetPos()" del Lua.


void implement_GetPos(Lua_loquesea estado)
{
 INSTANCE_ID id_instance=estado.get("id");//O como se haga en Lua
 estado.return( engine.GetInstance(id_instance)->GetPos() );
 //Vale, engine es una fea variable global con todos los ejemplares :-(
}


Esta es la forma explícita de hacerlo. Hemos de obtener de Lua el id del bicho.

La forma implícita es la siguiente.


void Instance::onHit(INSTANCE_ID attacker)
{
 engine.current_instance=this;
 Llamada_a_Lua("onHit", attacker);
 engine.current_instance=NULL;
}



void implement_GetPos(Lua_loquesea estado)
{
 //current_instance se inicializó antes de llamar siquiera al Lua
 estado.return( engine.current_instance->GetPos() );
}



Espero que veas la diferencia. Como siempre, tendrás los pros y los contras.

Oanime

Bueno, primero de todo perdón por mi anterior post porque vaya tela con mi expresión escrita :D, es que tenía mucha prisa y escribí muy rápido.

Tranquilo, te entiendo perfectamente. Y bueno, sobre eso no se, la sintaxis de acceso queda más limpia pero lo de tener que inicializar la variable esa cada vez como obligación no se si me gusta. De todas formas esto son cosas ya de implementación.

Esta noche intentaré leerme bien lo de las corutinas y ya por fin escribir el sistema entero, a ver que sale.

Un saludo,
HexDump

gdl

¡Suerte! A ver si das con la tecla  :wink:

Oanime

Pondré está semana mi solución final despues de que haya funcionado y visto que es un diseño decente/bueno.

Por otro lado, hay algo que me martillea la cabeza y es que si nuestra clase generia Actor en C++ tiene todos los eventos que cualquier genero puedo recibir, como hacer para que no se llamen a eventos que ese genero no soporta, porque no me veo usando reflexion en cada llamada de evento.

Un saludo,
HexDump.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.