Foros - Stratos

Proyectos => CRM32Pro => Mensaje iniciado por: Harko en 12 de Diciembre de 2011, 05:10:12 PM

Título: Pequeño problema con IButton->SetFunction
Publicado por: Harko en 12 de Diciembre de 2011, 05:10:12 PM
Buenas Azazel, me he vuelto a poner a trastear con tu librería y tengo un pequeño problema con los botones. Estaba intentando asignarle una función a un botón pero no hay manera.

Estoy poniendo toda la parte gráfica (iniciación de la librería, carga de imágenes, redibujo, etc) en una clase aparte para poder manejarlo mejor y a la hora de asignar la función no lo admite.

Digamos que esta tal que asin:

void CRM32Inicializer::LoadButtons() {
IButton->SetLayer(0);
bPlay = IButton->Load(GFX_RESOURCE, "btnPlay");
IButton->SetPosition(bPlay, 480, 400);
IButton->SetFunction(bPlay,Play);
};


Y que la función Play es así:
void CRM32Inicializer::Play(void *iParam1, void *iParam2){
//Vacia por ahora
};

Le puse los dos valores porque parecen ser obligatorios.

La carga de imagen y la posición funciona sin problemas pero en el SetFunction me da error con la función diciendo:
Citarargument of type "void (CRM32Inicializer::*)(void *iParam1, void *iParam2)" is incompatible with parameter of type "void (*)(void *, void *)"

Cambiando Play por CRM32Inicializer::Play tampoco funciona, y this.Play igual.

He intentado solucionarlo usando un puntero a funciones, algo como:
void (*fptr)(void *,void *);
fptr = &CRM32Inicializer::Play;
IButton->SetFunction(bPlay,fptr);


SetFunction admite el puntero pero falla la segunda linea porque tampoco puede hacer la conversión. Trate de ponerle un (void *) pero me manda un poquito a la *****a y tal.

Ya no se que mas tocarle, al final pasare de todo y pondré que empiece pulsando una tecla --
Título: Re: Pequeño problema con IButton->SetFunction
Publicado por: Harko en 12 de Diciembre de 2011, 06:46:48 PM
Al final he puesto la asignación de la función en main y así de paso aprovecho par ir poniendo ahí los cambios de estado. Con esto puedo ir tirando sin problemas.

Pero que solo puedas asignarle una función desde aquí y no desde dentro de una clase es bastante puñetero
Título: Re: Pequeño problema con IButton->SetFunction
Publicado por: Warchief en 12 de Diciembre de 2011, 07:51:42 PM
Puedes asignarle la funcion desde donde quieras. El problema es que la funcion es de la forma:

void func(void*, void*);

y tu estas intentando asignarle un puntero a un miembro de una clase (metodo), en vez de una funcion global:

void TuClase::method(void*, void*);

La libreria no tiene una instancia de tu CRM32Inicializer sobre la que invocar el metodo, por lo que requiere una funcion global.

Esto deberia funcionar:

void Play(void *iParam1, void *iParam2){
//Vacia por ahora
};

void CRM32Inicializer::LoadButtons() {
IButton->SetLayer(0);
bPlay = IButton->Load(GFX_RESOURCE, "btnPlay");
IButton->SetPosition(bPlay, 480, 400);
IButton->SetFunction(bPlay,Play);
};


Título: Re: Pequeño problema con IButton->SetFunction
Publicado por: Harko en 12 de Diciembre de 2011, 08:41:28 PM
Correcto, me han comentado lo mismo hace un ratito.

La única diferencia seria añadir como primer parámetro un this para poder usar el resto de las funciones sin problemas.

Ale, una cosa menos de la que preocuparse :D
Título: Re: Pequeño problema con IButton->SetFunction
Publicado por: TheAzazel en 14 de Diciembre de 2011, 11:22:18 AM
Veo que te han respondido antes que yo :) y ademas otro que no sabia nada de el desde hace mil!!! warchief!!! que fue de aquel bomberman? xD

Bueno, al menos duda resuelta jeje
Título: Re: Pequeño problema con IButton->SetFunction
Publicado por: Warchief en 14 de Diciembre de 2011, 11:28:07 PM
Lols.
Uhm, bomberman? No recuerdo haber estado haciendo nunca un bomberman, pero hace bastante que no hago proyectos en casa porque ya curro bastante en el curro, como para currar tambien despues :D