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:

int NSMB::avanzar() {
velocidad--;
if (velocidad == 0) {
velocidad = MOVIMIENTO_VELOCIDAD;
if (movimiento == MOVIMIENTO_DERECHA) {
if (koopa->GetX() < 128) {//128 = pixeles mitad pantalla
koopa->MoveRight(MOVIMIENTO_VELOCIDAD);
if (topScreen->IsCollision(koopa, mundo_plataformas->GetX(), mundo_plataformas->GetY()))
koopa->MoveLeft(MOVIMIENTO_VELOCIDAD);//deshacemos el avance
} else {
int x = mundo_plataformas->GetX() + 1;
if (x < COLUMNAS_MAPA - COLUMNAS_PANTALLA) {
if (!topScreen->IsCollision(koopa, x, mundo_plataformas->GetY())) {
mundo_plataformas->SetX(x);
mundo_plataformas->PrintMap8x8(MAPA_PLATAFORMAS);
}
} else if (koopa->GetX() < 256) {
koopa->MoveRight(MOVIMIENTO_VELOCIDAD);
if (topScreen->IsCollision(koopa, mundo_plataformas->GetX(), mundo_plataformas->GetY()))
koopa->MoveLeft(MOVIMIENTO_VELOCIDAD);//deshacemos el avance
}
}
} else {//MOVIMIENTO_IZQUIERDA
if (koopa->GetX() > 128) {//128 = pixeles mitad pantalla
koopa->MoveLeft(MOVIMIENTO_VELOCIDAD);
if (topScreen->IsCollision(koopa, mundo_plataformas->GetX(), mundo_plataformas->GetY()))
koopa->MoveRight(MOVIMIENTO_VELOCIDAD);//deshacemos el avance
} else if (mundo_plataformas->GetX() > 0) {
int x = mundo_plataformas->GetX() - 1;
if (!topScreen->IsCollision(koopa, x, mundo_plataformas->GetY())) {
mundo_plataformas->SetX(x);
mundo_plataformas->PrintMap8x8(MAPA_PLATAFORMAS);
}
} else if (koopa->GetX() > 0) {
koopa->MoveLeft(MOVIMIENTO_VELOCIDAD);
if (topScreen->IsCollision(koopa, mundo_plataformas->GetX(), mundo_plataformas->GetY()))
koopa->MoveRight(MOVIMIENTO_VELOCIDAD);//deshacemos el avance
}
}
}
return 1;
}


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