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

Movimiento de textura con Libgdx

No entiendo porque no tengo movimiento en mi textura ¿Que pasa?
No me sale ningún error en LogCat ni en la consola.

Este es mi codigo :

package com.Videojuego;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;

public class DerechaCoche extends Coche {
   public float Spped = 20;
   public float dir = 0;
    public DerechaCoche(float x, float y) {
        super(x, y);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void update() {
        float delta =Gdx.graphics.getDeltaTime();
        float dir = 0;

        if (Gdx.input.isKeyPressed(Keys.RIGHT)) dir = 1;{
        bordes.x = bordes.x * delta; 

    }

    }
}

Este es mi codigo de clase coche:

package com.Videojuego;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Rectangle;

public abstract class Coche { /// 

     protected Texture texture;
     protected SpriteBatch Batcher;
     protected Rectangle bordes;

      public Coche (float x , float y){
          texture = new Texture (Gdx.files.internal("coche1.png"));
          bordes = new Rectangle(x,y,texture.getWidth(),texture.getHeight());  
      }

    public void draw(SpriteBatch Batcher){ 

         Batcher.draw(texture,bordes.x,bordes.y,texture.getWidth(),texture.getHeight());  

      }

      public abstract void update(); 

      public Rectangle getBordes(){
          return bordes;
      }

}

0voto

white comentado

puedes agregar el código de tu clase "Coche"?

0voto

carla_Maria comentado

ya, ahí tienes el codigo de coche :)

1 Respuesta

2votos

white Puntos75880

Te comento los errores que hay en tu código,

En la sentencia if (Gdx.input.isKeyPressed(Keys.RIGHT)) dir = 1;{ la variable dir esta antes de la llave lo que ocasiona que ignore la linea bordes.x = bordes.x * delta;

al campo x de bordes no lo estas incrementando, sino que lo defines igual, recuerda que el tiempo delta necesita de una variable que sera la velocidad puedes usar el campo de tu clase ( Spped ), usarlo con el tiempo delta y usar el operador += quedaría así: bordes.x += Spped * delta,

intenta de esta manera:

if (Gdx.input.isKeyPressed(Keys.RIGHT))
{
    dir = 1;
    bordes.x += Spped * delta; 
}

PD: no conozco la clase donde instancias DerechaCoche pero asegurate de que estes llamando al método update de DerechaCoche:

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

        coche.update();

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

saludos!

0voto

carla_Maria comentado

public class PantallaJuego implements Screen{

    MyGame juego;

    public SpriteBatch Batcher; /
    public Texture texture,Fondo;
    private Coche CocheDerecha;

    public PantallaJuego(MyGame juego){
            this.juego = juego;
    }

    public void dispose() { // 
        Batcher.dispose();
        texture.dispose();
}

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

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

    @Override
    public void render(float arg0) { /
        Gdx.gl.glClearColor(0,1,0,1); /// 
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); /
        CocheDerecha.update(); /// 
        Batcher.begin();/
    CocheDerecha.draw(Batcher);
    Batcher.end();
   }

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

    @Override
    public void show() {
            Texture motor = new Texture(Gdx.files.internal("coche1.png")); 
            CocheDerecha = new DerechaCoche(10,Gdx.graphics.getHeight()/2 - motor.getHeight()/2); 
            Batcher = new SpriteBatch();
    }

0voto

white comentado

Si tienes aun problemas se me ocurre que el evento que realmente quieres es Gdx.input.isTouched() estas probando tu código en un dispositivo android?

intenta cambiando esto:

if (Gdx.input.isKeyPressed(Keys.RIGHT))
{
    dir = 1;
    bordes.x += Spped * delta; 
}

por esto:

if (Gdx.input.isTouched())
{
    if(Gdx.input.getX() > bordes.x) {
        bordes.x += Spped * delta;
    }
    else if(Gdx.input.getX() < bordes.x){
        // bordes.x -= Spped * delta;
    }
}

0voto

carla_Maria comentado

Cuando pones Vector2, que significa,la posición de x,y?

Vector2 touchPosition = new Vector2(0, 0);

Y cuando pones esto : Porque el primero se suma siendo mayor el touchPosition.x y menor bordes.x.

Y en el otro es todo lo contrario, ¿Porque bordes en una ocasión es mayor y en otra menor?

if (Gdx.input.isTouched()){

        touchPosition.set(Gdx.input.getX(), Gdx.input.getY());

        if(touchPosition.x > bordes.x) {
            bordes.x += SPEED * delta;
        }
        else if(touchPosition.x < bordes.x){
            bordes.x -= SPEED * delta;

Gracias por tu ayuda.

0voto

white comentado

Esta duda debería estar en un nuevo tema @carla_Maria, no en el que ya se soluciono. a dudas nuevas => preguntas nuevas.

Vector2: como su nombre lo indica es un vector de 2 dimensiones, coordenadas x, y.
touchPosition: es una variable que contendra las coordenadas donde el usuario a tocado la pantalla


que hace esta parte?

if(touchPosition.x > bordes.x)

aca preguntamos, si la posicion del dedo al hacer contacto con la pantalla es mayor a la posicion x del coche entonces...

bordes.x += SPEED * delta;

aumentamos la posicion del coche.

graficamente:

================================================================
              .--------.    x: 50 -------------------------->
         ____/_____|___ \___
        O    _   - |   _   ,*                   ( ( (  TOUCH ) ) )
         '--(_)-------(_)--'                          x: 150
=================================================================

el carro se movera a la dirección donde se toco ( touch ), ya que auto tiene x: 50 y touch tiene x: 150

lo mismo ocurriria con la condicion:

else if(touchPosition.x < bordes.x)

pero el auto debe tener en posicion x menos que la posicion x de donde se toco ( touch ), moviendose a la izquierda.

espero con esto se libre tu duda, recuerda revizar conceptos básicos de programacion de videojuegos, el sistema de coordenadas, en algunas librerias es diferente, el origen esta en direccion a otra parte del plano.

en este documento explican cual es el sistema de coordenadas para libgdx https://docs.google.com/document/d/1YfuJ-gsc7VfIlX2G8Ix5K0laaqEsvFDuTz3Cnecy2_M/edit?pli=1

saludos!

1voto

Leonardo-Tadei comentado

+1 a la respuesta.
+1 a empezar una pregunta nueva
+3 al ASCII Art ;-)

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