User Tag List

Resultados 1 al 4 de 4

Tema: c++ problema con vector: std9Exception

  1. #1

    Fecha de ingreso
    Dec 2005
    Ubicación
    Hospi Talet (BCN)
    Mensajes
    1,479
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    5

    c++ problema con vector: std9Exception

    Aunque realmente ya no tengo muy claro que sea por el vector, pero al menos, peta en ese punto.

    Recopilando un poco, tengo una clase Sprite que tiene un atributo que es un vector de punteros a otra clase llamada Animacion.

    La clase Sprite tiene un método dibujar cuya idea es, a partir de la información que hay en una de las animaciones del vector de Animaciones recortar la imagen para mostrar el frame que toca.

    Para llenar el vector de animaciones tengo un método en Sprite que dado un puntero a Animacion hace un push_back en el vector.


    Mi sorpresa ha llegado cuando he definido todo y cuando compilo, compila, pero cuando arranca revienta con la excepción std9Exception en cuanto intenta leer el contenido de alguna posición del vector de animaciones.

    He estado repasando y parece que están todos los new necesarios y los delete en los destructores de los objetos. Es más, tengo por otro lado otro vector de Sprites que funciona igual que el vector de animaciones de un Sprite que funciona correctamente (mientras comente las líneas de la animación que hace petar todo, se entiende).

    No se que puede ser, a ver si alguien me ayuda a encontrar el error porque es flipante xD

    Os dejo algunos trozos de código para que veáis el proceso:

    Esto es donde creo el Sprite en concreto, creo la animación que tendrá y por último lo meto en parcela, que tiene un atributo de tipo Sprite que es el último parámetro de su constructor. Esce es un array de 2 dimensiones de punteros a parcela.
    Código:
    gcn::Image* iCaja = gcn::Image::load("bola.png");
    T2XSprite* caja = new T2XSprite(0,0,iCaja,32,32);
    T2XAnimacion* aCaja = new T2XAnimacion(0,0,1);	
    caja->pushAnimacion(aCaja);
    aCaja = new T2XAnimacion(1,3,3);
    caja->pushAnimacion(aCaja);
    	
    esce[1][1] = new T2XParcela(5,0,caja);
    Por otro lado, este es el constructor de Parcela, por si ayuda:
    Código:
    T2XParcela::T2XParcela(int altura, int tipo, T2XSprite* decorado)
    {
    	mAltura = altura;
    	mTipo = tipo;
    	mDecorado = decorado;
    }
    La definición de Sprite:
    Código:
    #ifndef __T2XSPRITE
    #define __T2XSPRITE
    
    #include <guichan.hpp>
    #include "T2XAnimacion.hpp"
    
    class T2XSprite
    {
    public:
    	T2XSprite();
    	T2XSprite(int x, int y, gcn::Image* imagen, char anchoFrame,char altoFrame);
    	T2XSprite(int x, int y, gcn::Image* imagen, char anchoFrame,char altoFrame, T2XAnimacion* animacion);
    	~T2XSprite();
    	
    	void setImagen(gcn::Image* imagen);
    	gcn::Image* getImagen();
    	
    	void setX(int x);
    	int getX();
    	
    	void setY(int y);
    	int getY();
    
    	void setAnchoFrame(char anchoFrame);
    	char getAnchoFrame();
    	
    	void setAltoFrame(char altoFrame);
    	char getAltoFrame();
    	
    	void pushAnimacion(T2XAnimacion* animacion);
    	
    	void dibujar(gcn::Graphics* graphics);
    	void dibujar(gcn::Graphics* graphics, int x, int y);
    
    private:
            int                               mX;
            int                               mY;
            gcn::Image*                       mImagen;
            char                              mAnimacionActual;
            char                              mAnchoFrame;
            char                              mAltoFrame;
            char                              mFramesPorFila;
            std::vector<T2XAnimacion*>        mAnimaciones;
    };
    
    #endif
    Os pongo solo el constructor, el dibujar y el pushAnimacion:
    Código:
    T2XSprite::T2XSprite()
    {
        mAnchoFrame = 0;
        mAltoFrame = 0;
        mX = 0;
        mY = 0;
    }
    
    T2XSprite::T2XSprite(int x,int y, gcn::Image* imagen, char anchoFrame,char altoFrame)
    {
        mX = x;
        mY = y;
        mImagen = imagen;
        mAnchoFrame = anchoFrame;
        mAltoFrame = altoFrame;
        mFramesPorFila = imagen->getWidth()/anchoFrame;
        mAnimacionActual = 0;
    }
    
    T2XSprite::T2XSprite(int x,int y, gcn::Image* imagen, char anchoFrame,char altoFrame, T2XAnimacion* animacion)
    {
        T2XSprite(x,y,imagen,anchoFrame,altoFrame);
        pushAnimacion(animacion);
    }
    void T2XSprite::dibujar(gcn::Graphics* graphics)
    {
         this->dibujar(graphics,mX,mY);
    }
    
    void T2XSprite::dibujar(gcn::Graphics* graphics, int x, int y)
    {
    //   T2XAnimacion* aTemp = mAnimaciones[mAnimacionActual];
         int frame = 0;//mAnimaciones.at(mAnimacionActual)->getFrameActual();
         int u, v;
         u = 0;
         v = 0;
    //     graphics->drawImage(mImagen,x,y,u,v,mAnchoFrame,mAltoFrame);
         graphics->drawImage(mImagen,x,y);
    }
    
    void T2XSprite::pushAnimacion(T2XAnimacion* animacion)
    {
         mAnimaciones.push_back(animacion);
    }
    Y lo mismo con Animación:
    Código:
    #ifndef __T2XANIMACION
    #define __T2XANIMACION
    
    #include <guichan.hpp>
    
    class T2XAnimacion
    {
    public:
    	T2XAnimacion();
    	T2XAnimacion(int frameInicial, int frameFinal, int fps);
    	~T2XAnimacion();
    	
    	void setFrames(int frameInicial, int frameFinal);
    	int getFrameInicial();
    	int getFrameFinal();
    	int getFrameActual();
    	
    private:
        int mTiempoFrameActual;
        int mTiempoFrame;
        int mFrameInicial;
        int mFrameFinal;
        int mFrameActual;
    };
    
    #endif
    Implementación:
    Código:
    #include "T2XAnimacion.hpp"
    
    T2XAnimacion::T2XAnimacion()
    {
        mTiempoFrameActual=0;
        mFrameActual = 0;
    }
    
    T2XAnimacion::T2XAnimacion(int frameInicial, int frameFinal, int fps)
    {
        mTiempoFrameActual = 0;
        mTiempoFrame = 1000/fps;
        mFrameInicial = frameInicial;
        mFrameFinal = frameFinal;
        mFrameActual = 0;
    }
    
    T2XAnimacion::~T2XAnimacion()
    {
    
    }
    
    void T2XAnimacion::setFrames(int frameInicial, int frameFinal)
    {
        mFrameInicial = frameInicial;
        mFrameFinal = frameFinal;
    }
    
    int T2XAnimacion::getFrameInicial()
    {   
        return mFrameInicial;
    }
    
    int T2XAnimacion::getFrameFinal()
    {   
        return mFrameFinal;
    }
    
    int T2XAnimacion::getFrameActual()
    {   
        return mFrameActual;
    }
    No quiero darle a enviar, la parrafada que presumo xD

  2. #2

    Fecha de ingreso
    Jan 2008
    Ubicación
    Madrid
    Mensajes
    4,465
    Mencionado
    14 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    88
    Agradecer Thanks Received 
    171
    Thanked in
    Agradecido 100 veces en [ARG:2 UNDEFINED] posts
    Que pedasso de pregunta... Por lo que he entendido te falla al dibujar el sprite al acceder al vector de animaciones.
    La clase animación está bien, como es una clase sencillita yo la metería directamente en el vector de animaciones, en vez de punteros. Así evitarías el problema de los punteros a las animaciones.

    No he visto nada que esté mal en el código que has puesto. Chequea que la imagen se carga bien en gcn::Imagen y que tiene el tamaño correcto. También puedes mirar el tamaño y elementos del vector de animaciones. No tienes nada para cambiar el frame actual de la animación, supongo que estará a medias.

    Prueba a hacer un mAnimaciones.clear() en los constructores de Sprite, lo mismo algunas implementaciones no borran el vector en std::vector(). Algo pasa con ese vector.

    Depura todo esto y a ver si entre todos vemos algo.
    Última edición por hardyx; 26/09/2008 a las 20:12

  3. #3

    Fecha de ingreso
    Dec 2005
    Ubicación
    Hospi Talet (BCN)
    Mensajes
    1,479
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    5
    Ya lo encontré, el problema está aquí:
    Código:
    T2XSprite::T2XSprite(int x,int y, gcn::Image* imagen, char anchoFrame,char altoFrame, T2XAnimacion* animacion)
    {
        T2XSprite(x,y,imagen,anchoFrame,altoFrame);
        pushAnimacion(animacion);
    }
    No se porque recordaba que se podía llamar a un constructor desde un constructor, cosa que no se puede por lo que veo o no se hacer, se debería hacer un 3er método al que ambos constructores llamaran, pero como eran tan simple al final el copy paste de un constructor dentro del otro (que solo añadía el meter la animación) ha sido suficiente.

    Muchas gracias de todas formas, ahora ya tengo todo el tema de animaciones funcionando ^^-

  4. #4

    Fecha de ingreso
    Jan 2008
    Ubicación
    Madrid
    Mensajes
    4,465
    Mencionado
    14 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    88
    Agradecer Thanks Received 
    171
    Thanked in
    Agradecido 100 veces en [ARG:2 UNDEFINED] posts
    Pues es verdad, al llamar a un constructor desde otro se crea un objeto temporal que no puedes usar. Puedes definir un método privado init() compatido, o puedes usar sólo un constructor con parámetros por defecto. De esta manera:

    Código:
    T2XSprite::T2XSprite(int x,int y, gcn::Image* imagen, char anchoFrame,char altoFrame, T2XAnimacion* animacion=NULL)
    {
        mX = x;
        mY = y;
        mImagen = imagen;
        mAnchoFrame = anchoFrame;
        mAltoFrame = altoFrame;
        mFramesPorFila = imagen->getWidth()/anchoFrame;
        mAnimacionActual = 0;
        if (animacion) 
          pushAnimacion(animacion);
    }
    De esta forma puedes hacer esto:
    T2XSprite sprite1(0,0,image,32,32);
    T2XSprite sprite2(0,0,image2,32,32,anim);

    Saludos
    Última edición por hardyx; 30/09/2008 a las 14:24

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •