Bueno hasta ahora teníamos la animación 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 todavía, para esto le voy a 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) { 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