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

1voto

Sprite con movimiento no se mueve en Libgdx

Tengo el Sprite puesto,correctamente.Pero cuando pongo movimiento no se mueve y no entiendo que sucede.
¿Que podría ser?

Este es mi codigo:

public void draw (SpriteBatch Batcher){

        personaje.draw(Batcher);
    }

            public void update() {

                if(Gdx.input.isTouched()){

                    if(Gdx.input.getX()> personaje.getX()){
                    cuerpoJugador.applyLinearImpulse(
                            new Vector2 (1,0),
                    cuerpoJugador.getLocalCenter(),true);

                    }

                    else if(Gdx.input.getX()< personaje.getX()){
                        cuerpoJugador.applyLinearImpulse(
                                new Vector2 (-1,0),
                        cuerpoJugador.getLocalCenter(),true);
                    }

                     personaje.setRotation(cuerpoJugador.getTransform().getRotation());

                personaje.setPosition(cuerpoJugador.getPosition().x,cuerpoJugador.getPosition().y);
        }
            }

    Mi render:

public void render(float arg0) {

    Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

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

    jugador.update();

    Batcher.begin();
    piso.draw(Batcher);
    personaje.draw(Batcher);
    Batcher.end();

Codigo:

public void show() {

    piso = new Sprite(new Texture(Gdx.files.internal("plataforma1.png")));
    piso.setPosition(0,-400);
    mundo = new World ( new Vector2(0,-98f),true);
    Batcher = new SpriteBatch();
    escenario = new Plataforma(this,200,100);
    jugador = new Jugador(this,200,200);
    personaje = new Sprite(new Texture(Gdx.files.internal("panda1.png")));
    personaje.setPosition(20,190);

1 Respuesta

1voto

white Puntos75880

Cual es la clase que contiene este método?

public void draw (SpriteBatch Batcher){
    personaje.draw(Batcher);
}

personaje tiene relacion con jugador?
cual debe moverse jugador o personaje?

0voto

carla_Maria comentado

Esa es la clase Jugador:

public class Jugador {

protected Texture texture;
protected Sprite personaje;
protected World mundo;
public float PX_TO_METERS = 80f;
public PantallaJuego game;
public Body cuerpoJugador;

public Jugador(PantallaJuego pantallajuego, float x, float y){

    this.game =pantallajuego;

    personaje = new Sprite(new Texture(Gdx.files.internal("panda1.png")));
    personaje.setPosition(x,y);

    crearJugador();

}

private void crearJugador() {

    BodyDef cuerpo = new BodyDef();
    cuerpo.type = BodyDef.BodyType.StaticBody;
    cuerpo.position.set(personaje.getX(),personaje.getY());

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

    PolygonShape forma = new PolygonShape();
    forma.setAsBox(
            personaje.getHeight()/2/PX_TO_METERS,
            personaje.getWidth()/2/PX_TO_METERS);

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

    cuerpoJugador.createFixture(fixtureDef);

    forma.dispose();

}

    public void draw (SpriteBatch Batcher){

        personaje.draw(Batcher);
    }

            public void update() {

                if(Gdx.input.isTouched()){

                    if(Gdx.input.getX()> personaje.getX()){
                    cuerpoJugador.applyLinearImpulse(
                            new Vector2 (1,0),
                    cuerpoJugador.getLocalCenter(),true);

                    }

                    else if(Gdx.input.getX()< personaje.getX()){
                        cuerpoJugador.applyLinearImpulse(
                                new Vector2 (-1,0),
                        cuerpoJugador.getLocalCenter(),true);
                    }

                     personaje.setRotation(cuerpoJugador.getTransform().getRotation());

                personaje.setPosition(cuerpoJugador.getPosition().x,cuerpoJugador.getPosition().y);
        }
            }

Jugador lo hice para hacer el personaje.

El personaje es el que se mueve.

Codigo:

public class PantallaJuego implements Screen {

public Texture texture;
public Sprite piso,personaje;
public SpriteBatch Batcher;
public World mundo;
public Plataforma escenario;
public Jugador jugador;

public PantallaJuego(MyGame myGame) {

}

@Override
public void dispose() {
    Batcher.dispose();
    texture.dispose();

}

@Override
public void hide() {
    // TODO Auto-generated method stub

}

@Override
public void pause() {
    // TODO Auto-generated method stub

}

@Override
public void render(float arg0) {

    Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

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

    jugador.update();

    Batcher.begin();
    piso.draw(Batcher);
    personaje.draw(Batcher);
    Batcher.end();

}

@Override
public void resize(int arg0, int arg1) {
    // TODO Auto-generated method stub

}

@Override
public void resume() {
    // TODO Auto-generated method stub

}

@Override
public void show() {

    piso = new Sprite(new Texture(Gdx.files.internal("plataforma1.png")));
    piso.setPosition(0,-400);
    mundo = new World ( new Vector2(0,-98f),true);
    Batcher = new SpriteBatch();
    escenario = new Plataforma(this,200,100);
    jugador = new Jugador(this,200,200);
    personaje = new Sprite(new Texture(Gdx.files.internal("panda1.png")));
    personaje.setPosition(20,190);

}

}

0voto

carla_Maria comentado

Jugador lo hice para hacer el personaje.

El personaje es el que se mueve.

Esta es la clase Jugador:

protected Texture texture;
protected Sprite personaje;
protected World mundo;
public float PX_TO_METERS = 80f;
public PantallaJuego game;
public Body cuerpoJugador;

public Jugador(PantallaJuego pantallajuego, float x, float y){

    this.game =pantallajuego;

    personaje = new Sprite(new Texture(Gdx.files.internal("panda1.png")));
    personaje.setPosition(x,y);

    crearJugador();

}

private void crearJugador() {

    BodyDef cuerpo = new BodyDef();
    cuerpo.type = BodyDef.BodyType.StaticBody;
    cuerpo.position.set(personaje.getX(),personaje.getY());

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

    PolygonShape forma = new PolygonShape();
    forma.setAsBox(
            personaje.getHeight()/2/PX_TO_METERS,
            personaje.getWidth()/2/PX_TO_METERS);

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

    cuerpoJugador.createFixture(fixtureDef);

    forma.dispose();

}

    public void draw (SpriteBatch Batcher){

        personaje.draw(Batcher);
    }

            public void update() {

                if(Gdx.input.isTouched()){

                    if(Gdx.input.getX()> personaje.getX()){
                    cuerpoJugador.applyLinearImpulse(
                            new Vector2 (1,0),
                    cuerpoJugador.getLocalCenter(),true);

                    }

                    else if(Gdx.input.getX()< personaje.getX()){
                        cuerpoJugador.applyLinearImpulse(
                                new Vector2 (-1,0),
                        cuerpoJugador.getLocalCenter(),true);
                    }

                     personaje.setRotation(cuerpoJugador.getTransform().getRotation());

                personaje.setPosition(cuerpoJugador.getPosition().x,cuerpoJugador.getPosition().y);
        }
            }

Codigo:

public class PantallaJuego implements Screen {

    public Texture texture;
    public Sprite piso,personaje;
    public SpriteBatch Batcher;
    public World mundo;
    public Plataforma escenario;
    public Jugador jugador;

    public PantallaJuego(MyGame myGame) {

    }

    @Override
    public void dispose() {
        Batcher.dispose();
        texture.dispose();

    }

    @Override
    public void hide() {
        // TODO Auto-generated method stub

    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub

    }

    @Override
    public void render(float arg0) {

        Gdx.gl.glClearColor(0,0,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

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

        jugador.update();

        Batcher.begin();
        piso.draw(Batcher);
        personaje.draw(Batcher);
        Batcher.end();

    }

    @Override
    public void resize(int arg0, int arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub

    }

    @Override
    public void show() {

        piso = new Sprite(new Texture(Gdx.files.internal("plataforma1.png")));
        piso.setPosition(0,-400);
        mundo = new World ( new Vector2(0,-98f),true);
        Batcher = new SpriteBatch();
        escenario = new Plataforma(this,200,100);
        jugador = new Jugador(this,200,200);
        personaje = new Sprite(new Texture(Gdx.files.internal("panda1.png")));
        personaje.setPosition(20,190);

    }

}

0voto

white comentado

Te comento:

en el sprite Personaje, no creo necesite estar en dos clases no? basta con que crees el sprite en la clase Jugador

Yo creo que el error se debe a que no estas dibujando a jugador en el batcher solo al personaje de tu clase PantallaJuego

de modo que....

              / --------> (Sprite) personaje ( 1 )
             /
PantallaJuego                              / ----> (Sprite) personaje ( 2 )
             \                            /  ----> (Body) cuerpoJugador
               \ -------> (Jugador) jugador -  ----> (Texture) texture

tienes 2 sprites 1 es innceseario e inmovil, elimina personaje ( 1 ).

y dibuja al sprite personaje ( 2 ) en el batcher

@Override
public void render(float arg0) {

    Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

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

    jugador.update();

    Batcher.begin();
    piso.draw(Batcher);
    jugador.draw(Batcher); // DIBUJAMOS EL JUGADOR!!!
    Batcher.end();
}

0voto

carla_Maria comentado

No tengo dos clases solo tengo la clase Jugador donde creo el Sprite.
En mi Sprite tengo puesto personaje, si cambio el draw a jugador me pone que esta mal.

0voto

white comentado

No dije que tuvieras 2 clases (aparte de PantallaJuego), dije que tienes 2 sprites con el mismo nombre y la misma imagen en 2 clases ( PantallaJuego y Jugador )

el sprite personaje de la clase PantallaJuego no se movera nunca por que no programaste un metodo que lo haga interactuar, en cambio la clase jugador si tiene el metodo update y contiene su sprite.

edite el diagrama de arriba, talvez asi lo entiendas mejor.

0voto

carla_Maria comentado

Cuando hago lo que me dices me pone este error en el LogCat:

http://gyazo.com/19307b97e1ea68434fd134c6c6c2ee50

0voto

white comentado

De tu fichero Jugador.java, pasame la linea 65
De tu fichero PantallaJuego.java, pasame la linea 58

0voto

carla_Maria comentado

public void draw(SpriteBatch Batcher){

        piso.draw(Batcher);

}

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

    jugador.update();

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

0voto

white comentado

solo pásame la linea no el método draw completo, en tu IDE puedes ver el numero linea. necesito 2 lineas de 2 archivos

0voto

carla_Maria comentado

jugador.draw(Batcher); --> Linia 58
jugador.draw(Batcher); --> Linia 65

0voto

carla_Maria comentado

jugador.draw(Batcher); --> Linia 58
jugador.draw(Batcher); --> Linia 65

0voto

white comentado

jugador.draw(Batcher) linea 58, de que archivo? Jugador.java ?

existe el campo jugador en tu clase Jugador?
existe el campo personaje en tu clase Jugador?

0voto

carla_Maria comentado

jugador.draw(Batcher); ---> Linia 58 --> Clase PantallaJuego

Campos en clase Jugador:

protected Texture texture;
protected Sprite personaje;
protected World mundo;
public float PX_TO_METERS = 80f;
public PantallaJuego game;
public Body cuerpoJugador;
public Jugador jugador;

0voto

white comentado

en tu clase PantallaJuego reemplaza jugador.draw(Batcher); por personaje.draw(Batcher);

0voto

carla_Maria comentado

sigue sin moverse :S

0voto

white comentado

No me fije como tenías definido el tipo de cuerpo, cuerpoJugador nunca se movera por que lo definiste como un cuerpo estático

cambia en la clase Jugador esto:

cuerpo.type = BodyDef.BodyType.StaticBody;

por esto:

cuerpo.type = BodyDef.BodyType.DynamicBody;

por otro lado, el cuerpo no se actualiza a menos de que hagas touch

saca fuera de este if: if(Gdx.input.isTouched()){

estas dos lineas:

personaje.setRotation(cuerpoJugador.getTransform().getRotation());
personaje.setPosition(cuerpoJugador.getPosition().x,cuerpoJugador.getPosition().y);

0voto

carla_Maria comentado

Pensaba que sería eso pero nada no se mueve....

0voto

white comentado

Asegúrate de que tu clase Jugador luzca así:
http://paste.ofcode.org/Vqw2MRsUpMpJTzKngzrDLT

y tu clase PantallaJuego así:
http://paste.ofcode.org/hZZWkfX2sc2dfmhgfLN5kD

0voto

white comentado

De que tamaño es tu sprite? estas dandole una fuerza de 1 si tu personaje tiene un tamaño considerable, entonces le estas dando muy poca fuerza y no basta para moverlo.

Tenias otras falencias en tú codigo, declarabas sprites que nunca se usaban, para que declaras personaje y un Batcher ? en la clase MyGame si nunca los utilizas en esta?

Como consejo, por favor manten ordenado tu código, no des espacios ni saltos de linea excesivos, sigue las buenas practicas para formatear tu código.

Tus ficheros corregidos:

MyGame => http://paste.ofcode.org/PL4z29HvQRA8jKimZAERLj
PantallaJuego => http://paste.ofcode.org/n5EEE7BGrZmU4Y7FHJkp2s
Jugador => http://paste.ofcode.org/iSbSfbFUTbaSeer8NatQFS
Plataforma => http://paste.ofcode.org/xhDY6Zaw3n8tp2NXz7ikY8

te regalo un enlace donde explican como seguir una buena convencion para el codigo en java:

http://www.um.es/docencia/vjimenez/ficheros/practicas/ConvencionesCodigoJava.pdf

saludos!

0voto

carla_Maria comentado

Era el impulso ^-^
Lo único que ahora el personaje se cae solo,hacía abajo.
Sera por la gravedad ¿no?

Gracias :)

0voto

carla_Maria comentado

Era el impulso ^-^
Lo único que ahora el personaje se cae solo,hacía abajo.
Sera por la gravedad ¿no?

Gracias :)

0voto

white comentado

en efecto, es la gravedad la que mueve el cuerpo de jugador constantemente.

en el metodo crearPiso()

debes definir la posicion y el tamaño.

el tamaño:

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

la posicion:

cuerpo.position.set(0,0);

en tu clase PantallaJuego defines una nueva instancia de Plataforma asi: escenario = new Plataforma(this, 200, 100);

y en tu clase plataforma esta: piso.setPosition(x,y);

eso quiere decir que el sprite esta en posicion (200, 100) y el cuerpo estatico del piso esta en (0, 0), al cuerpo no lo vas a poder ver pero al sprite si.

 X                                     
 ^                                     
 |                                     
 |                                     
 |                                     
 |                  * piso (200, 100)  
 |                                     
 |                                     
 |                                     
 |* cuerpo (0, 0)                      
 +---------------------------------->Y 

corrige la posicion de cuerpo de acuerdo a la de piso.

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