Problema con Threads en libreria SDL en C++

Iniciado por Guillermo575, 2 Abril 2011, 07:38 AM

0 Miembros y 1 Visitante están viendo este tema.

Guillermo575

Hola aqui volviendo a molestar abri este tema por que tengo una duda acerca de los Thread que vienen en la libreria sdl, el problema no es tanto por la sintaxis si no que cuando quiero hacer que un hilo llame el metodo de una clase no me deja compilar. aqui esta un ejemplo de como mas o menos quiero que sea:

#include <stdio.h>
#include <stdlib.h>;
#include <SDL/SDL.h>
using namespace std;

class clase{
public : clase(){
SDL_Thread *hilo;
//hilo=SDL_CreateThread(run,NULL);
}

public :int run(void *data){
while(1>0)metodo();
return 0;
}

public :void metodo(){}
};

int main(int argc, char *argv[]){}


Si se dan cuenta en donde dice run es lo que quiero que sea el hilo para que asi pueda acceder a los metodos de esa misma clase.

¿por que lo quiero asi?
Por que quiero hacer un juego y ese hilo corresponde al del personaje que voy a usar para los procesos de validacion/movimiento y repintado, por eso necesito llamar a metodos de una clase pero no me deja hacer eso,ni siquiera me deja que el metodo run este dentro de una clase, asi que necesito su ayuda por favor
Saludos

Tryptophan

Basandome en otros lenguajes, me parece que es por que estás creando el hilo con la llamada al método en el constructor.  En el instante de llamado al constructor, no se encuentra creado el objeto, por lo que cualquier invocación posible a sus métodos no es valida... Si no llega a ser esto, postea el error que lo vemos  ;D

Suerte!

Guillermo575

#2
argument of type `int (clase :: )(void*)' does not match `int (*)(void*)'

Este es el error que me aparece ya que ese metodo se encuentra dentro de una clase
EDIT: Cambio de perspectiva y ya olvidandome de los hilos ¿como le puedo hacer para hacer que se muevan varios personajes,enemigos y elementos al mismo tiempo ?
se me ocurre usar hacer un ciclo while y moverlos uno por uno  ordenadamente y para que sea polimorfico usar una clase abstracta
¿que les parece?

Tryptophan

Está bien que uses polimorfismo... No sé si estás al tanto de las técnicas utilizadas para juegos (bounding box, colisiones, arboles de busqueda, etc, etc), es por eso que por las dudas te dejo el link al sitio de una materia de mi facultad que te puede ser de ayuda. Son apuntes para darte una introducción, pero creo que te serán de ayuda..
http://sites.google.com/site/tgcutn/.

Mucha suerte con el proyecto y cualquier cosa preguntá...

Guillermo575

Cita de: Tryptophan en  6 Abril 2011, 16:12 PM
Está bien que uses polimorfismo... No sé si estás al tanto de las técnicas utilizadas para juegos (bounding box, colisiones, arboles de busqueda, etc, etc)

Bueno.... de hecho este proyecto lo he estado haciendo en java y usaba colisiones y listas enlazadas (para identificar enemigos y armar personajes con imagenes), el problema es que debido a que queria hacer un juego mas complicado y dicen que java no estan efectivo haciendo juegos, queria probar con el lenguaje c++ y la libreria sdl, pero el problema es que soy muy novato trabajando en c++ y queria usar la logica de mi juego en java a c++ pero no pude, y es asi como llegue aqui, aun asi no me haria daño leer un poco de la pagina que me enviaste
Saludos

PD: Ahorita tengo un problema usando  multi archivos  (#include"archivo.c" por ejemplo) y no puedo incluir mas de 2 a la vez, espero que me respondas

Tryptophan

¿Lo pusiste en el mismo directorio que el que estás compilando, no?. Me refiero al "archivo.c".

Foxy Rider

No podés pasar el método de una clase como un puntero a función (salvo que la declares como estática, pero no podrías actuar por-instancia, es decir no podrías interactuar con partes no estáticas), tenés que hacer algún "pegamento" entre el mundo de C (Procedural) y C++ (Orientado a objetos) ... tenés muchas formas, la más sencilla es tener una función intermedia que reciba la instancia de la clase como parámetro y que llame a X método ...

Saludos.

Guillermo575

Cita de: vertex@Symphony en  6 Abril 2011, 19:34 PM
No podés pasar el método de una clase como un puntero a función (salvo que la declares como estática, pero no podrías actuar por-instancia, es decir no podrías interactuar con partes no estáticas), tenés que hacer algún "pegamento" entre el mundo de C (Procedural) y C++ (Orientado a objetos) ... tenés muchas formas, la más sencilla es tener una función intermedia que reciba la instancia de la clase como parámetro y que llame a X método ...

Saludos.
¿Te estas refiriendo a los archivos "header"  cabecera? en ese caso ¿como puedo definir los metodos de una clase en ella?
Saludos

BlackZeroX

#8
.
@Guillermo575

Asi:

Header.h
Código (cpp) [Seleccionar]


class Header
{
public:
   static int run(void *data);

private:
   int funcion2();
};



CPP
Código (cpp) [Seleccionar]


#include "Header.h"

int Header::run(void *data){
   while(1>0) {
       metodo();
   }
   return 0;
}

int Header::funcion2() {
    return 1;
}



Dulces Lunas!¡.
The Dark Shadow is my passion.

Guillermo575

#9
Entonces en el header escribo los metodos o solo los defino? y si quiero ponerle contenido al metodo del header tiene que ser en el archivo .cpp?
Ahora bien si por ejemplo quiero hacer otro archivo que llame a esos metodos ¿cual debo incluir el .h o .cpp?

En pocas palabras mi objetivo es crear diferentes archivos, uno del personaje que controlo,enemigos,escenarios,etc y poderlos llamarlos todos desde el main() (si es que no entendieron mas o menos a donde quiero llegar)