2016-06-07 4 views
0

В настоящее время метод, который я использовал, заключается в обнаружении касания (Gdx.input.getX() & Y()) в области, является ли текстура объекта. Если это так, я устанавливаюPosition текстуры объекта в положение мыши как центр. Хотя эта работа, но она не является надежной. Потому что, если мой палец движется быстрее, чем обновление, как только косвенное положение находится за пределами текстуры. Он больше не обновится.Libgdx, Android, как перетащить и переместить текстуру

Должен быть более надежный способ и, пожалуйста, совет. По сути, я хочу коснуться текстуры и перетащить текстуру туда, куда движется мое касание.

Большое спасибо.

Мой текущий подход таков:

public class PlayScreen implements Screen { 
    int scWidth, scHeight; 
    int playerWidth, playerHeight; 
    private SpriteBatch batch; // This is in the render. 
    Player player; 
    // Create a constructor 
    Game game; 
    public PlayScreen(Game game){ 
     this.game = game; 
    } 

    @Override 
    public void show() { 
     batch = new SpriteBatch(); 
     scWidth = Gdx.graphics.getWidth(); 
     scHeight = Gdx.graphics.getHeight(); 
     playerWidth = 180; 
     playerHeight = 240; 
     player = new Player("mario.png", new Vector2(250, 300),new Vector2(playerWidth, playerHeight)) ; 
    } 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(1,1,1,1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     batch.begin(); 

     // Only draw if the mouse is hover on the image. 
     if (Gdx.input.getX() > player.getPosition().x && Gdx.input.getX() < player.getPosition().x + playerWidth){ 
      if (scHeight - Gdx.input.getY() > player.getPosition().y && scHeight - Gdx.input.getY() < player.getPosition().y + playerHeight) 
      { 

       player.setPosition(new Vector2(Gdx.input.getX() - playerWidth/2, 
         scHeight - Gdx.input.getY() - playerHeight/2)); 
       player.draw(batch); 

      } else{ 
       player.draw(batch); 
      } 

     } else{ 
      player.draw(batch); 
     } 

     batch.end(); 
     player.update(); // Update the bound 


    } 
} 

Также класс игрока является:

package com.jiajunyang.emosonicsgame; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.math.Rectangle; 
import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.scenes.scene2d.ui.Image; 


public class Player extends Image { 

    Vector2 position, size; 
    Texture player; 
    Rectangle bounds; 

public Player(String fileName, Vector2 position, Vector2 size){ 
    super(new Texture(Gdx.files.internal(fileName))); 
    this.position = position; 
    this.size = size; 
    bounds = new Rectangle(position.x, position.y, size.x, size.y); 

// игрок = новый Texture (Gdx.files.internal (Filename)); }

public void update(){ 
     bounds.set(position.x, position.y, size.x, size.y); 
    } 

    public void draw(SpriteBatch batch){ 
     batch.draw(player, position.x, position.y, size.x, size.y); 
    } 

    public Vector2 getPosition() { 
     return position; 
    } 

    public void setPosition(Vector2 position) { 
     this.position = position; 
    } 

    public Vector2 getSize() { 
     return size; 
    } 

    public void setSize(Vector2 size) { 
     this.size = size; 
    } 

    public Rectangle getBounds() { 
     return bounds; 
    } 

    public void setBounds(Rectangle bounds) { 
     this.bounds = bounds; 
    } 
} 

ответ

0

Jiajun, создать Stage и ваш плеер продлить изображение. Затем вызовите stage.addActor (плеер) в шоу. В render call stage.act() и stage.draw(). Используйте конструктор изображения, чтобы передать текстуру. Наконец, в конструкторе Игрока позвоните по этому адресу:

addListener(new DragListener() { 
      @Override 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
       return true; 
      } 

      @Override 
      public void touchDragged(InputEvent event, float x, float y, int pointer) { 
       moveBy(x - getWidth()/2, y - getHeight()/2); 
      } 
     }); 
+0

Привет Спасибо за ваш комментарий. У меня уже есть сцена, которую я использовал для кнопки, которую я использую для случайного отображения некоторых деревьев. Итак, теперь я расширяю класс Player с помощью Image (хотя у меня есть идея, что означает расширение, :() Я добавляю игрока. Но я не знаю, как «Использовать конструктор Image, чтобы передать вашу текстуру в». Можете ли вы объяснить, как эта работа пожалуйста, –

+0

Привет, я только что отредактировал класс Player на вопрос. Можете ли вы рассказать мне, требуется ли больше изменений? Спасибо –

+0

player = new Player («mario.png», новый Vector2 (250, 300), новый Vector2 (playerWidth, playerHeight)); - это вызов конструктора Игрока, расширение класса - это терминология java, это означает, что суперкласс класса будет Image, поэтому Player по существу будет классом Image с вашими изменениями. В вашем публичном Player() - конструктор - используйте конструктор Image, вызвав super (texture). – WonderfulWorld

Смежные вопросы