Foros - Stratos

Stratos => Principiantes => Mensaje iniciado por: Harko en 22 de Noviembre de 2006, 02:18:44 PM

Título: Ayuda con las clases
Publicado por: Harko en 22 de Noviembre de 2006, 02:18:44 PM
He de admitir que no tengo mucha practica con las clases de c++ y esas cositas.

Etaba intentando hacerme una clase para la nave del juego y he hecho una cabecera que tiene este codigo:

#include "CRM32Pro.h"

#define RESOURCES "gfx.dpf" //paquete de imagenes

//Inicio Clase nave
class nave1{
 private:
 int x,y;
 public:
 CRM32Pro_CSprite *snave;
 nave1();
 nave1(int px, int py);
 ~nave1(){delete snave;}
 void DrawNave();
 void DrawNave(int px, int py);
 void SetPosicion(int px, int py);
 int PosicionX();
 int PosicionY();
}minave1;

nave1::nave1(){
 x=0;
 y=0;
 snave = new CRM32Pro_CSprite();
 snave->Load(RESOURCES,"Nave");
 snave->AutoRestore(0);
}

nave1::nave1(int px, int py){
 snave = new CRM32Pro_CSprite();
 snave->Load(RESOURCES,"Nave");
 snave->AutoRestore(0);
 SetPosicion(px,py);
}

int nave1::PosicionX(){
 return x;
}

int nave1::PosicionY(){
 return y;
}

void nave1::SetPosicion(int px, int py){
 if(x==0 && y==0){
   snave->SetPosition(px,py);
 }
 x=px;
 y=py;
}

void nave1::DrawNave(){
 snave->MoveTo(x,y);
 snave->Draw();
}

void nave1::DrawNave(int px, int py){
 x=px;
 y=py;
 snave->MoveTo(x,y);
 snave->Draw();
}
// Fin Clase nave


La cosa es que con solamente incluirla en el codigo del juego al ejecutarlo me da un error de esos de que hay que cerrar el programa. Alguien sabe donde estoy metiendo la pata esta vez :? ?

Harko.

Edit: Me parece que el error deve de estar por el constructor nave1(). Si es asi, el otro estara tambien mal seguro :roll:
Título: Ayuda con las clases
Publicado por: Shaitan en 22 de Noviembre de 2006, 02:43:46 PM
quita el "minave1" del final de la dec de la clase (esto no es un struct)

asegurate de que snave != NULL, igual no se ha creado bien (aunque no te daria error al incluirla si no al ejecutarla...
Título: Ayuda con las clases
Publicado por: TheAzazel en 22 de Noviembre de 2006, 03:08:47 PM
Tampoco compruebas que la carga del sprite fue correcta...

quizas por ahi van los tiros...
Título: Ayuda con las clases
Publicado por: tamat en 22 de Noviembre de 2006, 03:13:30 PM
y ya puestos a criticar in extremis, no es muy coherente tener una clase cuyo nombre acabe en numero, conceptualmente hablando, salvo que el numero describa una propiedad (vector3, matrix44).

En tu caso prueba de tener una clase Nave y que las diferentes naves sean simplemente variaciones de esa nave (ya sea porque los atributos de la instancia son diferentes o porque has heredado de esa clase Nave para crear NaveJugador).
Título: Ayuda con las clases
Publicado por: shephiroth en 22 de Noviembre de 2006, 03:14:17 PM
Coincido, el problema es el minave.

El manejo seria:

class nave
{
//variables y funciones
};
nave * minave;
void main(...)
{
minave = new nave(...);
}


Demomento el error que te da es de compilacion, pero como te han dicho tal cual esta te daría problemas de ejecucion ^^

SALUDOS ^^
Título: Ayuda con las clases
Publicado por: marcode en 22 de Noviembre de 2006, 03:41:26 PM
Yo también creo que es porque estás creando un objeto de ese tipo al inicio del programa (debido a que la pones al final de la clase), y al llamarse al constructor todavía no se ha iniciado el CRM32Pro y peta. Aunque yo creo que esto debería de estar previsto en la librería y enviar algún mensaje, si es que se debe a eso.

Otra cosa, lo de poner el número al final, entiendo que tendrás pensado hacer  nave1, nave2, etc. Tendrás que empezar a usar la herencia, y hacer una clase base nave con todo lo básico y despues las diferentes naves con sus particularidades como clases derivadas.


class nave
{
  propiedades y metodos comunes (ej: posicion, estado, dibujo)
};

class caza : public nave
{
  propiedades y metodos específicos del caza (ej: disparos, escudos, etc..)
};

class transportador : public nave
{
  propiedades y metodos específicos del transportador (ej: capacidad de carga)
};


En realidad como además de naves habrá otros objetos, lo ideal será que hagas una clase base llamada Objeto o Entidad, que contenga todo lo compartido por cualquier objeto o personaje de esta forma te ahorraras mucho trabajo al no tener que repetir lo mismo para cada clase, de manera que quedaría así:


class entidad
{
  propiedades y metodos comunes de todos
};

class nave : public entidad
{
  propiedades y metodos comunes solo de las naves
};

class disparo : public entidad
{
  propiedades y metodos comunes de los disparos
};

class laser : public disparo
{
  ...
};

Título: Ayuda con las clases
Publicado por: Harko en 22 de Noviembre de 2006, 04:07:02 PM
Lo de nave1 lo puse porque estaba probando al principio a colocarlo en el codigo principal y ahi ya tengo la estructura nave que es con lo que estoy haciendola funcionar.

Como copie directamente del codigo se habia quedado lo de minave1, ya lo he quitado. Ahora lo que me suelta es un error en el constructor nave1::nave1(){ (linea 21) que dice "error: new types may not be defined in a return type" y "error: return type specification for constructor invalid".

La nave deberia de cargarla bien, es la misma instruccion que he estado utilizando en el codigo, no veo porque deberia de dar fallo, pero le colocare algo ahi, a ver que pasa. Menos mal que ya tenia inicializado el log :P.

EDIT: Vale, hoy estoy un poco espeso. Se me habia olvidado poner el punto y coma al final despues de quitar lo de minave :P :lol:

Harko.
Título: Ayuda con las clases
Publicado por: Harko en 22 de Noviembre de 2006, 04:14:49 PM
Vale, ahora se ejecuta pero me vuelve a dar el mismo error raro de cerrar programa.

Me parece que el error esta en el Load(RESOURCES,"Nave") porque cuando comento ese trozo sigue funcionando normalmente. Y ya le coloque la comprobacion de errores, pero me parece que nisiquiera llega ahi.

El codigo:nave1::nave1(){
 x=0;
 y=0;
 snave = new CRM32Pro_CSprite();
 if(snave->Load(RESOURCES,"Nave")==0){
   ILogSystem.Msg(LOG_NORMAL," · [LOG] - No se pudo cargar sprite nave: %s\n",SDL_GetError());
 }
 snave->AutoRestore(0);
}


Todo apunta a que es en el if donde falla.

Harko.
Título: Ayuda con las clases
Publicado por: TheAzazel en 22 de Noviembre de 2006, 07:09:50 PM
Ya sabia yo que el error podria estar por ahi.
En ese caso, en el log te tira algo seguro.

Pero, si lo creas en modo estatico... la clase de log aun no lo habras iniciado y hay puede venir el problema...

Luego..prueba a crearlo en tiempo de ejecucion, con el new, y antes de hacer nada en tu main, lo primero que tienes que hacer es iniciar el ILogSystem.Init()...

Podria agregar codigo para detectar estos errores pero me parece sobrecargar demasiado la lib con mil comprobaciones, ademas, eso es algo que aunque maneje y evite tu pete..es incorrecto porque tu sprite no se habra cargado, por no decir que no me gusta nada crear objetos de esa manera...con lo bonito que es el new :P

Recuerda, para cargar sprites debe estar iniciado como minimo, el sistema de log, despues para que funcionen, debes haber iniciado la lib y para que el volcado a video sea el ideal...cargarlos despues de activar el modo grafico.

Ya diras como fue la cosa
Título: Ayuda con las clases
Publicado por: Harko en 22 de Noviembre de 2006, 08:49:22 PM
Si quitando del constructor esas instrucciones funciona, pero la idea era hacerlo independiente del codigo. Quiero decir, tener una funcion Iniciar que me cargue el grafico en vez de tener que hacerlo por fuera de la clase.

Otra cosa que tampoco funciona, supongo que sera por lo mismo, es el destructor.
~nave1(){delete snave;}
No es que me de error o algo, esque simplemente no lo borra. Me gustaria tener las funciones de creacion y destruccion del sprite dentro de la clase para tenerlo todo juntito.

Harko.
Título: Ayuda con las clases
Publicado por: shephiroth en 22 de Noviembre de 2006, 10:06:14 PM

class comosea
{
private:
//variables
int x,y;
private bool initMyClass();
private bool initLib();
private void programError();
public:
comosea()
{
x=10;
y=2;
if (!initLib() || !initMyClass())
programError();
}
comosea(int uno, int dos)
{
x=uno;
y=dos;
if (!initLib() || !initMyClass())
programError();
}
};


Algo asi serviría ^_^
Título: Ayuda con las clases
Publicado por: TheAzazel en 23 de Noviembre de 2006, 12:14:23 AM
Cita de: "Harko"Si quitando del constructor esas instrucciones funciona, pero la idea era hacerlo independiente del codigo. Quiero decir, tener una funcion Iniciar que me cargue el grafico en vez de tener que hacerlo por fuera de la clase.

Otra cosa que tampoco funciona, supongo que sera por lo mismo, es el destructor.
~nave1(){delete snave;}
No es que me de error o algo, esque simplemente no lo borra. Me gustaria tener las funciones de creacion y destruccion del sprite dentro de la clase para tenerlo todo juntito.

Harko.
Y puedes hacer todo eso, pero en vez de poner despues de la clase el "minave1" que lo que hace es crear un objeto de forma estatica.. y peta! define la clase con sus constructores y demas, y cuando vayas a tirar de ese objeto...lo creas con un new, y cuando termines, lo eliminas.
Con eso, te valdria. De todos modos y aunque estoy mas petao que nunca, si me pasas codigo te lo adapto, miro mas en profundidad y demas sin problemas.

Saludos
Título: Ayuda con las clases
Publicado por: marcode en 23 de Noviembre de 2006, 12:41:57 PM
¿Y porqué no haces una función LoadSprite dentro de la clase?, así puedes crear la nave de forma estática. Aunque seguramente tengas que hacer otra de tipo Release donde liberes lo que has creado.

Si no vas a usar new para crear el objeto nave mejor no metas nada en el constructor ni en el destructor que no sea exclusivo de la propia clase.
Título: Ayuda con las clases
Publicado por: Harko en 23 de Noviembre de 2006, 12:57:33 PM
Cita de: "TheAzazel"
Y puedes hacer todo eso, pero en vez de poner despues de la clase el "minave1" que lo que hace es crear un objeto de forma estatica.. y peta! define la clase con sus constructores y demas, y cuando vayas a tirar de ese objeto...lo creas con un new, y cuando termines, lo eliminas.
Con eso, te valdria. De todos modos y aunque estoy mas petao que nunca, si me pasas codigo te lo adapto, miro mas en profundidad y demas sin problemas.

Saludos

Te refieres a algo como "nave1 minave1= new nave1();" ? He probado algo asi, dejando el constructor como estaba al principio, y me sigue haciendo lo mismo. Creo que le pondre la carga aparte a ver que tal.

Cita de: "marcode"¿Y porqué no haces una función LoadSprite dentro de la clase?, así puedes crear la nave de forma estática. Aunque seguramente tengas que hacer otra de tipo Release donde liberes lo que has creado.

Si no vas a usar new para crear el objeto nave mejor no metas nada en el constructor ni en el destructor que no sea exclusivo de la propia clase.

Ya lo habia pensado, de echo es lo que iva a probar. Por un lado la inicializo y por otro cago la imagen.

A ver que tal.

Harko.
PD: He recuperado el blog con todos sus posts milagrosamente :D
Título: Ayuda con las clases
Publicado por: shephiroth en 23 de Noviembre de 2006, 05:22:09 PM
Por lo que estas diciendo parece que en algun momento uno de tus punteros esta perdiendo la referencia. Seria interesante si debugearas un poco y mirases en que momento da el error y que lo crea.

SUERTE ^^
Título: Ayuda con las clases
Publicado por: Ionicboy en 24 de Noviembre de 2006, 12:40:55 AM
Cuando he leido 'ayuda con las clases', creia que se referia a las clases de wings3d o algo asi XDDD

Esto que es? de alguno de los grupos de iniciacion :P
Título: Ayuda con las clases
Publicado por: Harko en 24 de Noviembre de 2006, 09:41:31 AM
:?  :?

El echo de que este en el foro de grupos de iniciacion no te dice nada? Si has leido un poco algo de esta seccion ultimamente te habrias dado cuenta de que lo que estoy preguntando es para el proyecto del grupo de los miercoles. :evil:

Harko.