Single Tech Games

PulpCore – 2

Les contaba en mis post anterior que seria interesante hacer que una pelota rebotara en la pared, ahora que estoy en un proceso de mudanza y no he tenido mucho tiempo, pero igual lo hize, en este pequeño programa hago que una pelota rebote en las paredes, pero el truquito es que es al azar, osea no sigue un patron determinado.
Es un codigo que podria servir para darle animacion a un Sprite para que se mueva en un cierto cuadrado de forma que no parezca siempre igual por ejemplo un pequeño vendedor atrayendo gente, tiene que ser mejorado porque siempre va hacia el centro, pero por ahi vamos, primero les doy el codigo que carga la escena:

import pulpcore.Stage;
import pulpcore.scene.Scene2D;
import pulpcore.sprite.FilledSprite;
import pulpcore.sprite.ImageSprite;
import pulpcore.sprite.Label;
import static pulpcore.image.Colors.WHITE;
/**
 *
 * @author Julio Cesar Cachay Perez
 */
public class pelotapared extends Scene2D {
    private ImageSprite pelota;
    private double velocidad = 5;
    private nuevaruta NRPelota;
    Label infoText;
    Label tema;
    Label velo;
    @Override
    public void load() {
        add(new FilledSprite(WHITE));// primero agregamos el background
        NRPelota = new nuevaruta(Stage.getWidth(), Stage.getHeight(), velocidad);
        pelota = new ImageSprite("res/pelota.png", 140, 240);//cargamos la pelota
        NRPelota.setAnchoSprite(pelota.width.get());
        NRPelota.setLargoSprite(pelota.height.get());
        NRPelota.almedio();
        pelota.x.set(NRPelota.getX());//lo ponemos al centro
        pelota.y.set(NRPelota.getY());
        add(pelota);//ahora la pelota
        tema = new Label(String.valueOf(Stage.getWidth()) + " , " + String.valueOf(Stage.getHeight()), 320, 20);
        velo = new Label("", 20, 320);
        infoText = new Label("", Stage.getWidth() / 4, Stage.getHeight() / 2);
        add(velo);
        add(tema);
        add(infoText);
    }
    @Override
    public void update(int elapsedTime) {
        mover();
    }
    private void mover() {
        NRPelota.nuevaruta();
        pelota.x.set(NRPelota.getX());
        pelota.y.set(NRPelota.getY());
        String ex = String.valueOf(pelota.x.get());
        String ey = String.valueOf(pelota.y.get());
        infoText.setText(ex + " , " + ey);
        velo.setText(String.valueOf(NRPelota.velocidadX)+" , "+ String.valueOf(NRPelota.velocidadY));
    }
}


Veran que ademas imprimo los valores de X y Y, la velocidad y el tamaño del applet, eso lo hago porque necesito ver donde aparecen mis errores, ahora la clase que hace todo el manejo de rutas es:

import java.util.Random;
/**
 *
 * @author Julio Cesar Cachay Perez
 */
public class nuevaruta {
    private double x = 0;
    private double y = 0;
    private int width;
    private int height;
    private double velocidad;
    public double velocidadX;
    public double velocidadY;
    private double anchoSprite = 0;
    private double largoSprite = 0;
    public nuevaruta(int width, int height, double velocidad) {
        this.width = width;
        this.height = height;
        this.velocidad = velocidad;
        velocidadX = velocidad;
        velocidadY = velocidad;
    }
    public double Xmedio() {
        //calculamos la posicion x media, a partir del ancho del objeto a poner en ese lugar
        return ((width / 2) - (anchoSprite / 2));
    }
    public double Ymedio() {
        //calculamos la posicion y media, a partir del largo del objeto a poner en ese lugar
        return ((height / 2) - (largoSprite / 2));
    }
    private void RutaX() {
        setX(getX() + velocidadX);
    }
    private void RutaY() {
        setY(getY() + velocidadY);
    }
    private boolean chocaX() {
        if (getX() = width) {
            return true;
        } else {
            return false;
        }
    }
    private boolean chocaY() {
        if (getY() + largoSprite >= height | getY() <= 0) {
            return true;
        } else {
            return false;
        }
    }
    public void almedio() {
        x = Xmedio();
        y = Ymedio();
    }
    public void nuevaruta() {
        if (chocaX() & chocaY()) {
            if (x <= 0 & y <= 0) {
                x = Math.abs(velocidadX) * new Random().nextDouble();
                y = Math.abs(velocidadY) * new Random().nextDouble();
                velocidadX = Math.abs(velocidadX);
                velocidadY = Math.abs(velocidadY);
            }
            if (x = height) {
                x = Math.abs(velocidadX) * new Random().nextDouble();
                velocidadX = Math.abs(velocidadX);
                if (velocidadY > 0) {
                    y = velocidadY * new Random().nextDouble();
                } else {
                    y = Math.abs(velocidadY) * new Random().nextDouble();
                    velocidadY = Math.abs(velocidadY);
                }
            }
            if (x + anchoSprite >= width & y  0) {
                    x = velocidadX * new Random().nextDouble();
                } else {
                    x = Math.abs(velocidadX) * new Random().nextDouble();
                    velocidadX = Math.abs(velocidadX);
                }
            }
            if (x + anchoSprite >= width & y + largoSprite >= height) {
                if (velocidadY > 0) {
                    y = -1 * velocidadY * new Random().nextDouble();
                    velocidadY = velocidadY * -1;
                } else {
                    y = velocidadY * new Random().nextDouble();
                }
                if (velocidadX > 0) {
                    x = -1 * velocidadX * new Random().nextDouble();
                    velocidadX = velocidadX * -1;
                } else {
                    x = velocidadX * new Random().nextDouble();
                }
            }
        } else {
            if (chocaX()) {
                nuevarutaX();
            } else {
                if (chocaY()) {
                    nuevarutaY();
                } else {
                    RutaX();
                    RutaY();
                }
            }
        }
    }
    private void nuevarutaX() {
        velocidadX = velocidadX * -1;
        RutaX();
        alazarY();
        RutaY();
        if (chocaY()) {
            velocidadY = velocidadY * -1;
            RutaY();
        }
    }
    private void nuevarutaY() {
        velocidadY = velocidadY * -1;
        RutaY();
        alazarX();
        RutaX();
        if (chocaX()) {
            velocidadX = velocidadX * -1;
            RutaX();
        }
    }
    private void alazarY() {
        Random random = new Random();
        if (random.nextDouble() > 0.5) {
            velocidadY = velocidadY * -1;
            y = y + velocidadY * random.nextDouble();
        } else {
            y = y + velocidadY * random.nextDouble();
        }
    }
    private void alazarX() {
        Random random = new Random();
        if (random.nextDouble() > 0.5) {
            velocidadX = velocidadX * -1;
            x = x + velocidadX * random.nextDouble();
        } else {
            x = x + velocidadX * random.nextDouble();
        }
    }
    /**
     * @param x the x to set
     */
    public void setX(double x) {
        this.x = x;
    }
    /**
     * @param y the y to set
     */
    public void setY(double y) {
        this.y = y;
    }
    /**
     * @param anchoSprite the anchoSprite to set
     */
    public void setAnchoSprite(double anchoSprite) {
        this.anchoSprite = anchoSprite;
    }
    /**
     * @param largoSprite the largoSprite to set
     */
    public void setLargoSprite(double largoSprite) {
        this.largoSprite = largoSprite;
    }
    /**
     * @return the x
     */
    public double getX() {
        return x;
    }
    /**
     * @return the y
     */
    public double getY() {
        return y;
    }
}


Como les decia falta arreglaro y pulirlo, pero por ahora hace lo que se le manda, veran que hago un chequeo por si choca en las 4 esquinas de la pantalla, eso lo hago porque mucho se me colgaba el applet o se quedaba parado cuando llegaba a chocar en esos lugares, simepre tratando de hacerlo lo mas reutilizable posible, uds saben, buenas practicas :p bueno nos vemos
Pueden ver el ejemplo o descargar el codigo aqui
C’ ya

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