Single Tech Games

Pulpcore, alucard y su mapa

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
alucard
Saludos

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments