viernes, 19 de junio de 2009

Mejoramos el movimiento

Todas estas semanas atrás hemos estado programando el juego utilizando las funcionalidades de los Tiles que nos brinda PALib. Esto está muy bien para juegos tipo Tetris, de tablero, etc. Pero para el New Super Mario Bros, o para los Pokemon no es totalmente válido.

El programar con tiles permite dibujar la pantalla con 'azulejos' de 8x8 pixeles, por lo que el movimiento del fondo (necesario en este tipo de juegos) ha de ser de 8 en 8 pixeles y eso no puede ser. Necesitamos unas transiciones más suaves.

PALib permite crear tiles y mover el fondo como de si una imagen se tratara. Así que hemos realizado los siguientes cambios en nuestra librería y en el editor de mapas.

Con respecto a la nueva librería hemos creado nuevas funciones para tratar los fondos. Estas funciones estarán en ScreenManager:


/**
* Asigna una imagen de fondo
*
* @param background Cada pantalla de la consola permite cuatro niveles de
* fondos. Los valores posibles son: BACKGROUND_ZERO, BACKGROUND_ONE,
* BACKGROUND_TWO, BACKGROUND_THREE (de mayor a menor prioridad)
*/
void SetBackground(unsigned int background, int *info, void * pal, const unsigned char *tiles, u32 tiles_size, const unsigned short *mapa);

/**
* Devuelve la coordenada X única a todos los fondos.
*/
int GetBackgroundsX();

/**
* Devuelve la coordenada Y única a todos los fondos.
*/
int GetBackgroundsY();

/**
* Asigna la coordenada X única a todos los fondos.
* Se utiliza para mover todos los fondos a la vez
*
* @param y coordenada x
*/
void SetBackgroundsX(int x);

/**
* Asigna la coordenada Y única a todos los fondos.
* Se utiliza para mover todos los fondos a la vez
*
* @param y coordenada Y
*/
void SetBackgroundsY(int y);

/**
* Asigna las coordenadas X, Y única a todos los fondos.
* Se utiliza para mover todos los fondos a la vez
*
* @param y coordenada x
* @param y coordenada Y
*/
void SetBackgroundsXY(int x, int y);

/**
* Desplaza a la izquierda todos los fondos una cantidad dada
* Se utiliza para mover todos los fondos a la vez
*
* @param offset desplazamiento
* @return la nueva coordenada x
*/
int MoveBackgroundsLeft(int offset);

/**
* Desplaza a la derecha todos los fondos una cantidad dada
* Se utiliza para mover todos los fondos a la vez
*
* @param offset desplazamiento
* @return la nueva coordenada x
*/
int MoveBackgroundsRight(int offset);

/**
* Desplaza arriba todos los fondos una cantidad dada
* Se utiliza para mover todos los fondos a la vez
*
* @param offset desplazamiento
* @return la nueva coordenada y
*/
int MoveBackgroundsUp(int offset);

/**
* Desplaza abajo todos los fondos una cantidad dada
* Se utiliza para mover todos los fondos a la vez
*
* @param offset desplazamiento
* @return la nueva coordenada y
*/
int MoveBackgroundsBottom(int offset);


De esta forma podemos asignar una serie de imágenes a los distintos fondos y moverlos sin problema los pixeles que se desean. En nuestro caso los fondos se moverán de izquierda a derecha.

Las funciones utilizadas hasta hoy, CreateTileSet, y la clase TileSet se dejarán para los proyectos que lo necesiten.

En cuanto al programa de edición de mapas se han cambiado los ficheros de salida. Ahora genera un png con el dibujo que se ha editado. Este dibujo debe pasar por PAGfx para generar los ficheros de salida. A continuación publicamos las dos imágenes de salida del programa de edición:


Fondo cero


Fondo uno

El código en NSMB.cpp quedará así:


topScreen->SetBackground(BACKGROUND_ZERO, FONDO_CERO);
topScreen->SetBackground(BACKGROUND_ONE, FONDO_UNO);
topScreen->SetBackground(BACKGROUND_THREE, FONDO_TRES);
topScreen->SetCollisionMap8x8((void *)newImage_0_Map, newImage_0_Info[1] / 8, newImage_0_Info[2] / 8);


Esta semana no voy a publicar código. Son demasiados cambios de un solo golpe y no puedo mantener bien las versiones. Además de que el código estará lleno de errores.

Ahora mi objetivo es dejar el salto fino y coger las monedas.

Espero tener para la semana que viene cosas nuevas que ofrecer, aunque el verano me va a quitar tiempo.

Saludos

No hay comentarios: