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

2votos

Donde poner métodos en Libgdx

Lo pongo en una clase el setSprite?

¿O donde lo pongo?

private void setSpriteBody() {

    // creamos el cuerpo
    BodyDef bodyDef = new BodyDef();

    // definimos el tipo de cuerpo y su posicion en el mundo
    bodyDef.type = BodyDef.BodyType.DynamicBody;
    bodyDef.position.set(player.getX(), player.getY());

    // agregamos el cuerpo al mundo
    spriteBody = world.createBody(bodyDef);

    // creamos un poligono en forma de caja con medidas de
    // acuerdo al sprite
    PolygonShape shape = new PolygonShape();
    shape.setAsBox(player.getWidth()/2 / PX_TO_METERS, player.getHeight() /2 / PX_TO_METERS);

    // definimos las propiedades del cuerpo
    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = shape;
    fixtureDef.density = 1f;

    // agregamos las propiedades al cuerpo
    Fixture fixture = spriteBody.createFixture(fixtureDef);

    // la forma del cuerpo no servira mas de ahora en adelante
    shape.dispose();
}

¿Y este tambien?

 private void setFloorBody()
{
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyDef.BodyType.StaticBody;
    bodyDef.position.set(0, 0);

    floorBody = world.createBody(bodyDef);

    PolygonShape shape = new PolygonShape();
    shape.setAsBox(Gdx.graphics.getWidth(), 0);

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

    Fixture fixture = floorBody.createFixture(fixtureDef);

    shape.dispose();
}

0voto

white comentado

En que linea o archivo definiste bordes? y en que linea te dio error? podrías agregar esa linea?.

1 Respuesta

1voto

white Puntos75880

Hola @Carla_maría, los metodos que mencionas crean cuerpos el el mundo definido, puedes agregarlos a alguna clase que actue como actor en tu juego, pero debes pasar la variable world como referencia o definir el mundo en tu clase principal y pasar la clase principal de tu juego como referencia.

supongamos que tu clase principal se llama MyGame y tienes en tu clase esto:

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.*;

public class MyGame extends ApplicationAdapter {
    SpriteBatch batch;
    World world;
    Body pisoCuerpo;
    final float PX_TO_METERS = 80f;
    Jugador jugador;

    @Override
    public void create () {

        // definimos el batch
        batch = new SpriteBatch();

        // definimos el nuevo mundo con gravedad (-98f es la gravedad, cambiar si es necesario)
        world = new World(new Vector2(0, -98f), true);

        // definimos el jugador le pasamos => (esta clase, posicion x, posicion y)
        jugador = new Jugador(this, 250, 250);

        // agregamos un cuerpo rectangular al mundo que actuara como piso
        crearPisoCuerpo();
    }

    @Override
    public void render()
    {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        world.step(1f/60f, 6, 2);

        jugador.update();

        batch.begin();
        jugador.draw(batch);
        batch.end();
    }

    private void crearPisoCuerpo()
    {
        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyDef.BodyType.StaticBody;
        bodyDef.position.set(0, 0); // posicion del piso (x, y)

        pisoCuerpo = world.createBody(bodyDef);

        PolygonShape shape = new PolygonShape();

        // tamaño del piso (ancho, alto) => (ancho del juego, 0)
        shape.setAsBox(Gdx.graphics.getWidth(), 0);

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

        pisoCuerpo.createFixture(fixtureDef);

        shape.dispose();
    }
}

y que tienes una clase llamada Jugador

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.physics.box2d.*;

public class Jugador {
    private MyGame game;
    private Body body;
    private Texture texture;
    private Sprite sprite;

    Player(MyGame game, float x, float y)
    {
        // agregamos la clase principal del juego
        this.game = game;

        // definimos la textura
        texture = new Texture(Gdx.files.internal("player.png"));

        // definimos el sprite
        sprite = new Sprite(texture);

        // definimos su posicion
        sprite.setPosition(x, y);

        // configuramos y agregamos el cuerpo al mundo
        setBody();
    }

    private void setBody()
    {
        // creamos el cuerpo
        BodyDef bodyDef = new BodyDef();

        // definimos el tipo de cuerpo y su posicion en el mundo
        bodyDef.type = BodyDef.BodyType.DynamicBody;
        bodyDef.position.set(sprite.getX(), sprite.getY());

        // agregamos el cuerpo al mundo
        body = this.game.world.createBody(bodyDef);

        // creamos un poligono en forma de caja con medidas de
        // acuerdo al sprite
        PolygonShape shape = new PolygonShape();
        shape.setAsBox(
            sprite.getWidth() / 2 / this.game.PX_TO_METERS,
            sprite.getHeight() /2 / this.game.PX_TO_METERS
        );

        // definimos las propiedades del cuerpo
        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = shape;
        fixtureDef.density = 1f;

        // agregamos las propiedades al cuerpo
        body.createFixture(fixtureDef);

        // la forma del cuerpo no servira mas de ahora en adelante
        shape.dispose();
    }

    public void draw(SpriteBatch batch)
    {
        sprite.draw(batch);
    }

    public void update()
    {
        // actualizamos la posicion del sprite de acuerdo
        // a la posicion del cuerpo en el mundo
        sprite.setPosition(body.getPosition().x, body.getPosition().y);
    }
}

Te explico los campos de la clase:

private MyGame game; => Esta variable va a tener la clase de tu juego principal
private Body body; => Esta variable es el cuerpo del jugador
private Texture texture; => la textura del jugador
private Sprite sprite; => el sprite del jugador

como ves en la clase al llamar al metodo setBody dentro de este metodo esta esto:

body = this.game.world.createBody(bodyDef);

esto agrega y define el cuerpo al mundo.
this.game.world es el mundo definido en la clase principal de tu juego.

ya que el mundo con fisicas y el mundo 2d estan "separados" entonces el cuerpo esta moviendose en el mundo con fisicas pero el sprite no se mueve a menos de que definamos su posicion con la posicion del cuerpo, estamos por decirlo de alguna manera "enganchandolos".

sprite.setPosition(body.getPosition().x, body.getPosition().y);

En conclusion, los metodos que pones y que preguntas donde van, pueden ir donde tu quieras, estos tienen código con el fin de agregar un nuevo cuerpo al mundo, tu te encargas de que ese cuerpo se enganche a un sprite, textura, imagen, etc.

saludos!

0voto

carla_Maria comentado

¿Es igual el movimiento si quiero que se mueva,con un boolean ?
¿if,else?
Para que tenga movimiento a la izquierda o derecha.

0voto

white comentado

nope, el movimiento se hace aplicando una fuerza lineal al cuerpo o modificando el transform del cuerpo.

public void update()
{
    if(Gdx.input.isKeyPressed(Keys.RIGHT))
    {
        body.applyLinearImpulse(
            new Vector2(1, 0),
            body.getLocalCenter(),
            true
        );
    }
    else if(Gdx.input.isKeyPressed(Keys.LEFT))
    {
        body.applyLinearImpulse(
            new Vector2(-1, 0),
            body.getLocalCenter(),
            true
        );
    }

    // actualizamos la rotacion actual del cuerpo en el sprite
    sprite.setRotation(body.getTransform().getRotation());

    // actualizamos la posicion del sprite de acuerdo
    // a la posicion del cuerpo en el mundo
    sprite.setPosition(body.getPosition().x, body.getPosition().y);
}

En ocasiones la rotación del cuerpo es indeseada en juegos de plataforma 2d, en cambio en otros juegos es necesaria ( ejemplo: angry birds )

para deshabilitar la rotación, se define como true el metodo fixedRotation de bodyDef.

bodyDef.fixedRotation = true;

0voto

carla_Maria comentado

Y sirve para android (keys.RIGHT)?

0voto

white comentado

si.

if (Gdx.input.isTouched())
{
    if(Gdx.input.getX() > sprite.getX()) {
            body.applyLinearImpulse(
                new Vector2(1, 0),
                body.getLocalCenter(),
                true
            );
    }
    else if(Gdx.input.getX() < sprite.getX()){
            body.applyLinearImpulse(
                new Vector2(-1, 0),
                body.getLocalCenter(),
                true
            );
    }
}

0voto

carla_Maria comentado

¿Lo que no entiendo es si yo quiero agregar una plataforma mía creada como la pongo?

0voto

white comentado

Solo crea un sprite que represente el piso, el cuerpo ya esta.

aca el codigo, fijate en cada linea: http://chopapp.com/#jy1ztg8n

saludos!

0voto

carla_Maria comentado

No puedo ver el codigo que me has puesto :S

0voto

white comentado

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