viernes, 15 de mayo de 2009

El movimiento

Otra característica del Mario Bros es que Mario no está siempre en el centro de la pantalla. Si no que cuando se acaban las plataformas, tanto a un lado como a otro, llega hasta el borde de la pantalla.

Esta característica hay que programarla dentro del juego y no de las librerías, es decir, lo pondremos en NSMB.cpp.

El código fuente de la función avanzar será el siguiente:
  1. int NSMB::avanzar() {  
  2.  velocidad--;  
  3.  if (velocidad == 0) {  
  4.   velocidad = MOVIMIENTO_VELOCIDAD;  
  5.   if (movimiento == MOVIMIENTO_DERECHA) {  
  6.    if (koopa->GetX() < 128) {//128 = pixeles mitad pantalla  
  7.     koopa->MoveRight(MOVIMIENTO_VELOCIDAD);  
  8.     if (topScreen->IsCollision(koopa, mundo_plataformas->GetX(), mundo_plataformas->GetY()))  
  9.      koopa->MoveLeft(MOVIMIENTO_VELOCIDAD);//deshacemos el avance  
  10.    } else {  
  11.     int x = mundo_plataformas->GetX() + 1;  
  12.     if (x < COLUMNAS_MAPA - COLUMNAS_PANTALLA) {  
  13.      if (!topScreen->IsCollision(koopa, x, mundo_plataformas->GetY())) {  
  14.       mundo_plataformas->SetX(x);  
  15.       mundo_plataformas->PrintMap8x8(MAPA_PLATAFORMAS);  
  16.      }  
  17.     } else if (koopa->GetX() < 256) {  
  18.      koopa->MoveRight(MOVIMIENTO_VELOCIDAD);  
  19.      if (topScreen->IsCollision(koopa, mundo_plataformas->GetX(), mundo_plataformas->GetY()))  
  20.       koopa->MoveLeft(MOVIMIENTO_VELOCIDAD);//deshacemos el avance  
  21.     }  
  22.    }  
  23.   } else {//MOVIMIENTO_IZQUIERDA  
  24.    if (koopa->GetX() > 128) {//128 = pixeles mitad pantalla  
  25.     koopa->MoveLeft(MOVIMIENTO_VELOCIDAD);  
  26.     if (topScreen->IsCollision(koopa, mundo_plataformas->GetX(), mundo_plataformas->GetY()))  
  27.      koopa->MoveRight(MOVIMIENTO_VELOCIDAD);//deshacemos el avance  
  28.    } else if (mundo_plataformas->GetX() > 0) {  
  29.     int x = mundo_plataformas->GetX() - 1;  
  30.     if (!topScreen->IsCollision(koopa, x, mundo_plataformas->GetY())) {  
  31.      mundo_plataformas->SetX(x);  
  32.      mundo_plataformas->PrintMap8x8(MAPA_PLATAFORMAS);  
  33.     }  
  34.    } else if (koopa->GetX() > 0) {  
  35.     koopa->MoveLeft(MOVIMIENTO_VELOCIDAD);  
  36.     if (topScreen->IsCollision(koopa, mundo_plataformas->GetX(), mundo_plataformas->GetY()))  
  37.      koopa->MoveRight(MOVIMIENTO_VELOCIDAD);//deshacemos el avance  
  38.    }  
  39.   }  
  40.  }  
  41.  return 1;  
  42. }  


Hoy no voy a poner una versión del código porque está cambiando bastante por lo que lo dejaré para futuros post. Sólo os puedo decir que las funciones Print de ScreenManager están ahora a nivel de TileSet. La clase Sprite está cambiando y mantener varias versiones no me es posible.

Saludos

2 comentarios:

David Martínez Martínez dijo...

Madre mía vaya currazo llevas. Y mejor así, así no pasa como pasaba hasta ahora de que se ven cosas raras si te vas para un lado.

¡Sigue así!

Inigo dijo...

Buenas David

En estos momentos puedo sacar algo de tiempo y he avanzado bastante el proyecto. Incluso tengo ya escrito el post de la semana que viene.

Esto empieza a tener forma, saludos