entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Minimizar el código en Llibgdx

Hay alguna manera de minimizar el codigo y no repetir el mismo codigo todo el rato.
Si quiero poner un Sprite estatico, tengo que repetir el codigo todo el rato?

private void crearPiso() {

        BodyDef cuerpo = new BodyDef();
        cuerpo.type = BodyDef.BodyType.StaticBody;
        cuerpo.position.set(0,0);

        pisoCuerpo = this.game.mundo.createBody(cuerpo); 

        PolygonShape forma = new PolygonShape(); 

        forma.setAsBox(Gdx.graphics.getWidth(),20);

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = forma;
        fixtureDef.density = 1f;

        pisoCuerpo.createFixture(fixtureDef); 

        forma.dispose();

        }

        public void draw(SpriteBatch Batcher){

            piso.draw(Batcher);

1 Respuesta

0voto

white Puntos75880

tienes opciones, implementar una clase que herede ese código o crear una clase para administrar los cuerpos.

intenta creando una nueva clase:

public class BodyManager
{
    private final static float PX_TO_METERS = 80.f;
    public static BodyDef.BodyType DYNAMIC_BODY = BodyDef.BodyType.DynamicBody;
    public static BodyDef.BodyType STATIC_BODY = BodyDef.BodyType.StaticBody;

    public Body createBody(World world, BodyProperties properties)
    {
        BodyDef cuerpo = new BodyDef();
        cuerpo.type = BodyDef.BodyType.DynamicBody;
        cuerpo.position.set(properties.getPosition().x, properties.getPosition().y);
        cuerpo.fixedRotation = true;

        Body body = world.createBody(cuerpo);

        PolygonShape forma = new PolygonShape();
        forma.setAsBox(
        properties.getSize().y / 2 / PX_TO_METERS,
        properties.getSize().x / 2 / PX_TO_METERS);

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = forma;
        fixtureDef.density = 1f;

        body.createFixture(fixtureDef);

        forma.dispose();

        return body;
    }

    public static class BodyProperties{
        private BodyDef.BodyType type;
        private Vector2 position;
        private Vector2 size;

        public BodyProperties BodyProperties(Sprite sprite, BodyDef.BodyType type){

            setPosition(new Vector2(sprite.getX(), sprite.getY()));
            setSize(new Vector2(sprite.getWidth(), sprite.getHeight()));
            setType(type);

            return this;
        }

        public BodyProperties BodyProperties()
        {
            position = new Vector2(0, 0);
            size = new Vector2(0, 0);
            type = STATIC_BODY;

            return this;
        }

        public BodyProperties setType(BodyDef.BodyType type) { this.type = type; return this; }
        public BodyProperties setPosition(Vector2 position) { this.position = position; return this; }
        public BodyProperties setSize(Vector2 size) { this.size = size; return this; }

        public BodyDef.BodyType getType(){ return type; }
        public Vector2 getPosition(){ return position; }
        public Vector2 getSize(){ return size; }
    }
}

Con esta clase puedes crear nuevos cuerpos agregando sus propiedades.

// creamos el sprite
Sprite jugador = new Sprite(new Texture(Gdx.files.internal("jugador.png")));
jugador.setPosition(50, 50);

// creamos la instancia de BodyManager
BodyManager bodymanager = new BodyManager();

// creamos el cuerpo estatico en el mundo
Body cuerpoJugador = bodymanager.createBody(
    mundo,
    new BodyManager.BodyProperties()
            .BodyProperties(jugador, BodyManager.STATIC_BODY)
);

0voto

carla_Maria comentado

Y después para ponerlo en el render ¿como sería?

0voto

carla_Maria comentado

Y después para ponerlo en el render ¿ Como sería, si son varios Sprites en la misma clase?

0voto

white comentado

Te refieres a actualizar la posicion del sprite?
sería de esta forma:

jugador.setPosition(cuerpoJugador.getPosition().x,cuerpoJugador.getPosition().y);

0voto

carla_Maria comentado

No es así entonces

 public void draw(SpriteBatch Batcher){

            piso.draw(Batcher);

Metodo render:

public void render(float arg0) {

    Batcher.begin();
                escenario.draw(Batcher);
        jugador.draw(Batcher);
    Batcher.end();

0voto

carla_Maria comentado

No es así entonces

 public void draw(SpriteBatch Batcher){

            piso.draw(Batcher);

Metodo render:

public void render(float arg0) {

    Batcher.begin();
                escenario.draw(Batcher);
        jugador.draw(Batcher);
    Batcher.end();

0voto

white comentado

jugador es un sprite o una clase?

public void render(float arg0) {

    jugador.setPosition(
          cuerpoJugador.getPosition().x,
          cuerpoJugador.getPosition().y);

    Batcher.begin();
          escenario.draw(Batcher);
          jugador.draw(Batcher);
    Batcher.end();

0voto

carla_Maria comentado

es una clase jugador

0voto

white comentado

Que es exactamente lo que no entiendes?

Te explico la clase BodyManager tiene un metodo llamado createBody necesita 2 parametros ( mundo, propiedades del cuerpo ) este metodo crea un cuerpo y lo regresa, es decir que lo alojas en una variable.

para crear una clase de propiedades usamos BodyProperties esta clase estática toma 2 argumentos (sprite y tipo de cuerpo) o toma ningun parametro:

tipo de cuerpo puede ser:

BodyManager.STATIC_BODY o BodyManager.DYNAMIC_BODY

new BodyManager.BodyProperties()
                    .BodyProperties(sprite, BodyManager.STATIC_BODY)

clase Jugador:

public class Jugador {
    Body cuerpoJugador;
    Sprite sprite;

    Jugador(Juego game, float x, float y)
    {
          sprite = new Sprite(
                   new Texture(Gdx.files.internal("jugador.png")));
          sprite.setPosition(x, y);

          cuerpoJugador = bodymanager.createBody(
              game.mundo,
              new BodyManager.BodyProperties()
                    .BodyProperties(sprite, BodyManager.STATIC_BODY)
          );
    }
    public void draw(SpriteBatch batch)
    {
         jugador.setPosition(
             cuerpoJugador.getPosition().x,
             cuerpoJugador.getPosition().y);

         sprite.draw(batch);
    }

0voto

carla_Maria comentado

Y porque haces return? No lo entiendo si pudieras explicarmelo

0voto

carla_Maria comentado

Y porque haces return?No lo entiendo si pudieras explicarmelo

0voto

white comentado

Return indica que el metodo termino y puede devolver un valor.

en el caso del metodo createBody debe devolver un valor del tipo Body

        v─────────────────┐
public Body createBody(..)|
{                         |
    Body body;            │
    ...                   │
    return body; <────────┘
}

es decir que en:

cuerpoJugador = bodymanager.createBody(...

cuerpoJugador obtiene el cuerpo creado en el metodo createBody

como sugerencia reviza conceptos basicos en Java

http://puntocomnoesunlenguaje.blogspot.com/2012/04/metodos.html
http://javabasico.osmosislatina.com/curso/progbasico2/return.htm

0voto

carla_Maria comentado

¿Y donde pongo mis sprites exactamente?

en la clase BodyManager

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta