viernes, 4 de diciembre de 2009

Cargamos las monedas (II)

Hemos encontrado un problema a la hora de cargar las monedas. La función de clonar tiene la peculiaridad de que clona incluso el comportamiento del Sprite, en este caso la animación.

Eso nos venía muy bien hasta ahora, porque todas la monedas se ponían a girar alegremente. Pero ahora, al coger las monedas, las borramos y las paramos (si no se hace esto aparecen efectos raros en la pantalla).

Al parar la primera moneda (la de más arriba), de la que hemos clonado todas, se paraban todas. Así que hemos modificado la función de clonar añadiendo nuevos parámetros (opcionales):

//en ScreenManager.h
void LoadBackgroundSprites(Sprite *sprite, int *map, int map_columns, int map_rows, unsigned int firstframe = 0, unsigned int lastframe = 0, unsigned int speed = 0);

//en ScreenManager.cpp
void ScreenManager::LoadBackgroundSprites(Sprite *sprite, int *map, int map_columns, int map_rows, unsigned int firstframe, unsigned int lastframe, unsigned int speed) {
 unsigned int i;
 unsigned int length = map_columns * map_rows;
 bool primero = true;
 for (i = 0; i < length; i++)
  if (map[i] > 0) {
   int y = i / map_columns;
   int x = i - (y * map_columns);
   if (primero) {
    sprite->SetXY(x * 16, y * 16);
    primero = false;
   } else {
    Sprite *newSprite = CloneBackgroundSprite(sprite, x * 16, y * 16);
    if (speed > 0) {
     newSprite->SetAnim(firstframe, lastframe, speed);
     newSprite->StartAnim();
    }
   }
  }
}

Lo nuevo de la función está al final:

Si la velocidad de la animación es mayor de cero entonces preparamos el sprite para animarlo y comenzamos la animación. De esta forma cada sprite es animado de forma independiente y no depende del primer sprite.

Ya se pode descargar el editor de mapas.

Saludos

P.D: Es importante parar el Sprite a la hora de borrarlo, por lo que estas dos líneas deben ir juntas, si no darán problemas el resto de sprites. En el destructor de la clase Sprite hemos escrito el siguiente código:
Sprite::~Sprite() {
 PA_StopSpriteAnim(m_screen, m_index_sprite);
 PA_DeleteSprite(m_screen, m_index_sprite);
}

y se invoca de esta forma:
delete sprite;

Borra el objeto sprite, y de esta forma se ejecuta el destructor de la clase Sprite.

Aún así el tema no va bien. Si creas y destruyes muchos Sprites al final el sistema no permite crear más o aunque los cree no se ven correctamente, parece un problema de PAlib.

Saludos

1 comentario:

Geze dijo...

Hola,compañero!

Exelente, espero pueda contactar contigo en alguna ocación ;)
mi correo es mygeze[arroba]hotmail.com

Un saludo, Bye Byte.