Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





problemas cogiendo el offset de un sprite

Iniciado por glglut, 08 de Diciembre de 2007, 12:44:36 AM

« anterior - próximo »

glglut

hola!

tengo una duda bastante tonta, me da hasta vergüenza.. :oops:

quiero coger el offset de un sprite con la función GetOffset(int*, int*), entonces hago esto:


int offX=0, offY=0;

miSprite->GetOffset(&offX, &offY);



haciendo esto no me guarda nada en las variables y eso que con el editorDPF el offset del sprite está bien puesto y no hay ningún otro tipo de problema...
alguna idea?

muchas gracias por adelantado :D

perrofeo307

hola
trata lo siguiente :P

int offX = 1000, offY = 1000;

miSprite->GetOffset( &offX, &offY);

y si tiene algo ese sprite.. pues debería cambiarte el valor inicial... si no es asi, supongo el problema no es ahí...

saludos...

TheAzazel

Haz la prueba que te dice perrofeo307 y observa si te cambia a 0 los offX y offY..

luego cuentanos y a ver que sucede :P

Saludos

glglut

hola!

gracias por responder a los dos. he hecho las pruebas e inicializando a 1000 las dos variables me las sigue sin modificar, después del getoffset se quedan con valor 1000...

TheAzazel

Ha llegado el momento de que me pases el ejemplo que no tira porque esa funcion mira lo simple que es:

//! Get X(width) and/or Y(height) size for each frame
/*! \param x pointer to an integer to store the width for each frame. NULL if you do not want to query it.
\param y pointer to an integer to store the height for each frame. NULL if you do not want to query it*/
void CRM32Pro_CSprite::GetOffset(int *x,int *y)
{  
  if(IInternal->SpriteExist == 0) return;
  if(x != NULL) *x = IInternal->TamX;
  if(y != NULL) *y = IInternal->TamY;
}

Vamos, que lo unico que puede pasar es que el sprite no exista y por eso hace eso..

Saludos!

glglut

wenas! pongo el código a ver:

esto primero es la definición de la clase:



class Cosa
{
protected:
CRM32Pro_CSprite* _sprite;
char* _nombreSprite;
char* _nombre;
int _x;
int _y;
int _ancho;
int _largo;

public:
Cosa(char* nombreSprite, char* nombre, int x, int y, int ancho, int largo);

CRM32Pro_CSprite* getSprite();

};


entonces el fallo viene en el constructor:




Cosa::Cosa(char* nombreSprite, char* nombre, int x, int y, int ancho, int largo)
{
_sprite = new CRM32Pro_CSprite();
_sprite->Load(GFX_RESOURCE, nombreSprite);
      _sprite->AutoRestore(0);
_sprite->SetPosition(x,y,1);

_nombre = (char*)malloc(sizeof(char)*(strlen(nombre)+1));
strcpy(_nombre, nombre);
_x = x;
_y = y;

       _ancho = largo = 1000;
_sprite->GetOffset(&_ancho,&_largo);

}


y la llamada es:




Cosa* c1 = new Cosa("Casa","edificio",100,100,30,60)


si hace falta más código lo subo, no hay problema, he puesto lo que mas creía que era importante.

muchas gracias por todo :D

perrofeo307

hola
mhm pues parece estar bien...
por cierto, porque no usas la estructura
SDL_Rect
tiene x,y, width, height

puedes dibujar el sprite?

obviamente creas el sprite después de iniciar CRM32Pro

porque probé el código que posteas, y me funciona perfectamente!, otra cosa que hay que tener en cuenta es que el nombre del sprite lo tienes que poner exactamente igual que en el editor dpf.. respetando mayúsculas y minúsculas...
mhm es muy extraño:?...
bueno suerte! :D

TheAzazel

uhmm... pregunta: el sprite que cargas de GFX_RESOURCE (nombreSprite) se supone que tiene ya algun offset dado?

Me da que tiene 0 y por eso tu en tu constructor pasas el ancho y largo, como para activarlo... pero claro, getoffset() te va a devolver 0 si ese sprite no tiene un offset asignado previamente... No querras hacer un SetTileSet()??

De todos modos hay algo que no veo claro, si se supone que tu en Cosa() le pasas la posicion y offset deseados...para que haces un getoffset() despues?

Si lo que quieres es en ancho y largo retornar el offset del sprite...esta mal, y tienes que pasarlos por referencia o fuera de tu constructor ancho y largo valdran lo que tuvieran antes de llamar al constructor...

glglut

wenas!

Citar
por cierto, porque no usas la estructura
SDL_Rect
tiene x,y, width, height

puedes dibujar el sprite?

obviamente creas el sprite después de iniciar CRM32Pro

lo de la estructura SDL_Rect no la conocía ya miraré a ver y el sprite sí que lo dibuja bien


Citaruhmm... pregunta: el sprite que cargas de GFX_RESOURCE (nombreSprite) se supone que tiene ya algun offset dado?

sí que tiene el offset correcto. en el editorDPF lo puedo ver.

CitarDe todos modos hay algo que no veo claro, si se supone que tu en Cosa() le pasas la posicion y offset deseados...para que haces un getoffset() despues?

el código lo fui haciendo casi sin saber todo lo que ofrecía la clase Sprite entonces por eso le iba pasando el ancho, el largo la x y la y...

entonces lo que quiero es que _ancho y _largo se inicialicen por los valores que tenga el sprite no por los parámetros del constructor, lo tengo que cambiar :P. en el editorDPF me sale correctamente el offset por eso que no entiendo pq ahí no los coge...

TheAzazel

si me pasas un ejemplo funcional y compilable que recoja tu problema(no hace ni mucho menos falta que sea todo el proyecto) me pongo a depurar y ver exactamente que falla vale?

glglut

hola! he hecho como me has dicho, es un ejemplo sencillo que usa elementos del archivo dpf de los ejemplos :D

el primer archivo:



#include "Cosa.h"


Cosa* c;
SDL_Surface *bg;


void RenderGraphics(int bLogicUpdate)
{
SDL_BlitSurface(bg, NULL, CRM32Pro.screen, NULL);
c->getSprite()->Draw();
}

int main(int argc,char *argv[])
{
SDL_Event   event;
Uint8 done = 0;

ILogSystem.Init("GUI.log",LOG_FILE,LOG_NORMAL,TITULO);

if(CRM32Pro.Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0)
ILogSystem.Msg(LOG_NORMAL," · [LOG] - Couldn´t initialize CRM32Pro: %s\n",SDL_GetError());

CRM32Pro.Config.VideoWidth = 640;
CRM32Pro.Config.VideoHeight = 480;
CRM32Pro.Config.Title = TITULO;
CRM32Pro.Config.Icon = IImage->Load(GFX_RESOURCE,"icono");

bg = IImage->Load(GFX_RESOURCE,"background2");
if(!CRM32Pro.SetVideoMode())
CRM32Pro.Quit();

ITimeSystem->Init();
ITimeSystem->SetRate(0,60);
CRM32Pro.SetRenderCallback(RenderGraphics);

c = new Cosa("rabbit","edificio",400,100,30,60);

while(!done)
{
while (CRM32Pro.Update(&event))
{
switch (event.type)
{
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE) done = 1;
break;

case SDL_QUIT:
done = 1;
break;

default:
break;
}
}
}
return 1;
}


la cabecera de la clase Cosa()


#ifndef COSA
#define COSA

#include "CRM32Pro.h"

#define GFX_RESOURCE "data/gfx.dpf"

#define ANCHO_PANTALLA 640
#define LARGO_PANTALLA 480
#define TITULO "V01"

class Cosa
{
protected:
CRM32Pro_CSprite* _sprite;
char* _nombreSprite;
char* _nombre;
int _x;
int _y;
int _ancho;
int _largo;

public:
Cosa(char* nombreSprite, char* nombre, int x, int y, int ancho, int largo);
CRM32Pro_CSprite* getSprite() { return _sprite; }
};

#endif


y el código de la clase Cosa()


#include "Cosa.h"


Cosa::Cosa(char* nombreSprite, char* nombre, int x, int y, int ancho, int largo)
{
_sprite = new CRM32Pro_CSprite();
_sprite->Load(GFX_RESOURCE, nombreSprite);
   _sprite->AutoRestore(0);
_sprite->SetPosition(x,y,1);

_nombre = (char*)malloc(sizeof(char)*(strlen(nombre)+1));
strcpy(_nombre, nombre);
_x = x;
_y = y;

_ancho = _largo = 1000;
_sprite->GetOffset(&_ancho,&_largo);
}


a mi me compila tal cual y me pinta el sprite correctamente, lo único que sigue sin coger el offset :(

MUCHAS GRACIAS POR LA AYUDA:D:D:D:D

TheAzazel

Ok, con eso me vale :) Mañana lo compilo y depuro y a ver que leches pasa que ahora no ando muy fino como para hacer nada jeje

Una cosa mas, que compilador usas? VisualC o GNU C/C+?

glglut

uso el visual C, aunque la idea es hacer que funcione tanto el linux como en windows :P

TheAzazel

Lo acabo de probar y tal y como me esperaba ha funcionado correctamente, solo he probado a meter una linea de log y queda asi:
Cosa::Cosa(char* nombreSprite, char* nombre, int x, int y, int ancho, int largo)
{
  _sprite = new CRM32Pro_CSprite();
  _sprite->Load(GFX_RESOURCE, nombreSprite);
   _sprite->AutoRestore(0);
  _sprite->SetPosition(x,y,1);

  _nombre = (char*)malloc(sizeof(char)*(strlen(nombre)+1));
  strcpy(_nombre, nombre);
  _x = x;
  _y = y;

  _ancho = _largo = 1000;
  _sprite->GetOffset(&_ancho,&_largo);
  ILogSystem.Msg(LOG_NORMAL,"Ancho %d - Largo %d\n",_ancho,_largo);
}


La salida que obtengo es:
Citar+----------------------------------------------------------+
¦         CRM32Pro SDK Win32 v4.99b (build 2821)           ¦
¦               MegaStorm Systems (c) 2007                 ¦
¦            http://www.megastormsystems.com               ¦
+----------------------------------------------------------+

· V01

· Executing at Thu Dec 13 12:13:36 2007
· Running on AMD processor - Athlon64 (3) - MMX - SSE
· Selected 'Athlon64' optimized code path.

· CRM32Pro successfully initiated.
Ancho 43 - Largo 73

Por otro lado, supongo que se te habra colado al copiarlo aqui pero necesitas agregar un destructor a la clase cosa para que libere a _nombre y a _sprite, y al salir de main.cpp tienes que llamar a CRM32Pro.Quit() para evitar dejar memoria sin liberar.


main.cpp

#include "Cosa.h"


Cosa* c;
SDL_Surface *bg;


void RenderGraphics(int bLogicUpdate)
{
  SDL_BlitSurface(bg, NULL, CRM32Pro.screen, NULL);
  c->getSprite()->Draw();
}

int main(int argc,char *argv[])
{
  SDL_Event   event;
  Uint8 done = 0;

  ILogSystem.Init("GUI.log",LOG_FILE,LOG_NORMAL,TITULO);

  if(CRM32Pro.Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0)
     ILogSystem.Msg(LOG_NORMAL," · [LOG] - Couldn´t initialize CRM32Pro: %s\n",SDL_GetError());

  CRM32Pro.Config.VideoWidth = 640;
  CRM32Pro.Config.VideoHeight = 480;
  CRM32Pro.Config.Title = TITULO;
  CRM32Pro.Config.Icon = IImage->Load(GFX_RESOURCE,"icono");

  bg = IImage->Load(GFX_RESOURCE,"background2");
  if(!CRM32Pro.SetVideoMode())
     CRM32Pro.Quit();

  ITimeSystem->Init();
  ITimeSystem->SetRate(0,60);
  CRM32Pro.SetRenderCallback(RenderGraphics);

  c = new Cosa("rabbit","edificio",400,100,30,60);

  while(!done)
  {
     while (CRM32Pro.Update(&event))
     {
        switch (event.type)
        {
           case SDL_KEYDOWN:
           if(event.key.keysym.sym == SDLK_ESCAPE) done = 1;
           break;

           case SDL_QUIT:
              done = 1;
           break;

           default:
           break;
        }
     }
  }
  // IMPORTANTE!!!
  SDL_FreeSurface(bg);
  delete c; // He creado un destructor
  CRM32Pro.Quit();
  ////////////////////
  return 1;
}


cosa.cpp
Cosa::~Cosa()
{
free(_nombre);
delete _sprite;
}


No se que te puede estar pasando porque la verdad, que es algo muy sencillo... prueba a ver agregando esa linea de log, a ver si tu lo comprobabas mal....

Saludos

glglut

he añadido la línea del log y me sale igual que a ti, pero luego con el debugger lo miro y da el valor de 1000 anterior, bueno si internamente se entera el programa por mi bien, ya seguiré probando

MUCHAS GRACIAS POR LAS MOLESTIAS :D:D:D:D:D






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.