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
Marcadores