Bueno hasta ahora teniamos la animacion de Alucard y como crear un mapa es momento de fusionarlos y crear un juego de estilo plataforma, de los que no he visto en pulcore todavia, para esto le voy dar control a alucard mediante las flechas. Primero usaremos la clase mapa anteriormente creada
import pulpcore.Stage;
import pulpcore.animation.Fixed;
import pulpcore.image.CoreGraphics;
import pulpcore.image.CoreImage;
import pulpcore.sprite.Sprite;
/**
*
* @author Julio Cachay
*/
public class mapa extends Sprite {
private CoreImage[][] MapaTile;
private int TileWidth;
private int TileHeight;
private int numTilesLargo;
private int numTilesFilas;
public final Fixed vistaX = new Fixed(this);
public final Fixed vistaY = new Fixed(this);
public mapa(CoreImage[][] MapaTile, int Width, int Height) {
//lo colocamos a la izquierda y en la parte de abajo
super(0, Stage.getHeight() - Height, Stage.getWidth(), Stage.getHeight());
this.MapaTile = MapaTile;
this.TileWidth = Width;
this.TileHeight = Height;
numTilesLargo = MapaTile.length;
numTilesFilas = MapaTile[0].length;
// para manejo de posiciones exactas en píxeles.
pixelSnapping.set(true);
}
//El largo del mapa
public int getMapWidth() {
return TileWidth * numTilesLargo;
}
//El alto del mapa
public int getMapHeight() {
return TileHeight * numTilesFilas;
}
//Altura de la tierra
public int tierraFirme(){
return Stage.getHeight() - TileHeight;
}
//se mueve?
public boolean isScrolling() {
return vistaX.isAnimating() || vistaY.isAnimating();
}
@Override
public void update(int elapsedTime) {
super.update(elapsedTime);
vistaX.update(elapsedTime);
vistaY.update(elapsedTime);
}
//sobreescribimos la funcion drawSprite para dibujar el mapa
@Override
protected void drawSprite(CoreGraphics g) {
int y = vistaY.getAsIntFloor();
for (int j = 0; j < numTilesFilas; j++) {
int x = vistaX.getAsIntFloor();
for (int i = 0; i < numTilesLargo; i++) {
g.drawImage(MapaTile[i][j], x, y);
x += TileWidth;
}
y += TileHeight;
}
}
}
Ya tenemos listo el mapa ahora el escenario
import pulpcore.Input;
import pulpcore.Stage;
import pulpcore.animation.Easing;
import pulpcore.image.BlendMode;
import pulpcore.image.CoreImage;
import pulpcore.scene.Scene2D;
import pulpcore.sprite.FilledSprite;
import pulpcore.sprite.Group;
import pulpcore.sprite.ImageSprite;
import static pulpcore.image.Colors.*;
/**
*
* @author Julio Cachay
*/
public class mapaAnimado extends Scene2D {
CoreImage AlucardDer;
CoreImage AlucardIzq;
CoreImage AlucardPDer;
CoreImage AlucardPIzq;
ImageSprite jugador;
Group grupo;
boolean cargo = false;
int i;
int y;
double velocidadJugador = 5;
// Nombre de las fotos
String bloques[] = {"t01.png", "t02.png", "t03.png", "t04.png", "t05.png", "t06.png", "t07.png",
"t08.png", "t09.png", "t10.png", "t11.png", "t12.png", "t13.png", "t14.png", "t15.png", "t16.png",
"t17.png", "t18.png", "t19.png", "t20.png"};
//este sera la forma de llenar, es la relacion de imagenes
String mapa[] = {"t01t02t03t04t05t06t07t08t09t10t11t12t13t14t15t16t17t18t19t20" +
"t01t02t03t04t05t06t07t08t09t10t11t12t13t14t15t16t17t18t19t20"};
mapa mapaTile;
@Override
public void load() {
// agregamos un cielo azul
add(new FilledSprite(rgb(185, 209, 255)));
// creamos el mapa
mapaTile = crearMapa(bloques, mapa, 24, 72);
//adherimos el mapa
add(mapaTile);
// agregamos a Alucard
AlucardPDer = CoreImage.load("res/alucardfrenada.png");
AlucardPIzq = AlucardPDer.mirror();
AlucardDer = CoreImage.load("res/alucard.png");
AlucardIzq = AlucardDer.mirror();
jugador = new ImageSprite(AlucardDer, Stage.getWidth() / 2, mapaTile.tierraFirme());
//para que el jugador se conviene bien con el mapa, lean las tecnicas RGB que se usan en el API
jugador.setBlendMode(BlendMode.SrcOver());
grupo = new Group();
grupo.pixelSnapping.set(true);
grupo.add(jugador);
grupo.x.bindTo(mapaTile.vistaX);
grupo.y.bindTo(mapaTile.vistaY);
add(grupo);
}
@Override
public void update(int elapsedTime) {
//Presionan el boton izquierdo
if (Input.isDown(Input.KEY_LEFT)) {
if (velocidadJugador > 0) {
velocidadJugador = velocidadJugador * -1;
}
if (!cargo) {
cargar();
cargo = true;
}
jugador.setImage(AlucardIzq);
}
//Presionan el boton derecho
if (Input.isDown(Input.KEY_RIGHT)) {
if (velocidadJugador < 0) {
velocidadJugador = Math.abs(velocidadJugador);
}
if (!cargo) {
cargar();
cargo = true;
}
jugador.setImage(AlucardDer);
}
// no presionan nada
if (!Input.isDown(Input.KEY_LEFT) && !Input.isDown(Input.KEY_RIGHT)) {
if (velocidadJugador > 0) {
jugador.setImage(AlucardPDer);
} else {
jugador.setImage(AlucardPIzq);
}
cargo = false;
} else {
double x = jugador.x.get() + velocidadJugador;
jugador.x.set(x);
setDirtyRectanglesEnabled(!mapaTile.isScrolling());
double metaX = mapaTile.vistaX.get() + velocidadJugador * -1;
mapaTile.vistaX.animateTo(metaX, Math.abs((int) velocidadJugador), Easing.REGULAR_OUT);
}
}
void cargar() {
AlucardPDer = CoreImage.load("res/alucardfrenada.png");
AlucardPIzq = AlucardPDer.mirror();
}
private mapa crearMapa(String[] bloques, String[] mapa, int Tilewidth, int Tileheight) {
//cargar las imagenes de bloque
CoreImage[] ImagenesBloque = new CoreImage[bloques.length];
int i = 0;
while (i < ImagenesBloque.length) {
ImagenesBloque[i] = CoreImage.load("res/" + bloques[i]);
i++;
}
//Creamos un mapa con los bloques
i = 0;
int y = 0, m = 0;
int filMapa = mapa[0].length();
int colMapa = mapa.length;
CoreImage[][] mapaTile = new CoreImage[filMapa / 3][colMapa];
while (i < filMapa - 3) {
y = 0;
while (y < colMapa) {
//Comparamos las primeras letras del mapa con las del bloque
// ejem. t01 == t01, si lo es la imagen cargada se almacena en el mapa
String str = mapa[y].substring(i, i + 3);
int k = 0;
int index = 0;
while (k < bloques.length) {
if (bloques[k].substring(0, 3).contentEquals(str)) {
index = k;
break;
}
k++;
}
mapaTile[m][y] = ImagenesBloque[index];
y++;
}
m++;
i = i + 3;
}
return new mapa(mapaTile, Tilewidth, Tileheight);
}
}
Listo, terminado y finito, con eso solo hacer volar un poco la imaginacion, luego les hablare mas profundamente de colisiones, el codigo y para ver como quedo esta aqui

Saludos