2016-05-29 144 views
1

我有一个简单的问题 - 我试图阻止拖动演员,但我看到奇怪的效果 - 当我试图拖动演员开始闪烁并随机更改位置。这里是一个简短的视频:https://youtu.be/KpGujQ7KHc0奇怪的行为与touchDragged

演员很简单:

public class Item extends Actor { 
    private String id; 
    private TextureRegion texture; 

    public Item() { 
     this.id = "passport"; 

     texture = PicturesData.getPicture(getId()); 
     setSize(texture.getRegionWidth(), texture.getRegionHeight()); 

     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) { 
       Log.add("Dragged: " + x + ", " + y); 
       setPosition(x, y); 
      } 
     }); 
    } 

    public String getId() { 
     return id; 
    } 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
     batch.draw(texture, getX(), getY()); 
    } 
} 

屏幕是基本太:

public class GameScreen implements Screen { 
    private Stage stage; 

    public GameScreen() { 
     stage = new Stage(new StretchViewport(800, 600)); 
     Gdx.input.setInputProcessor(stage); 

     Item item = new Item(); 

     stage.addActor(item); 
    } 

    @Override 
    public void show() { 
    } 

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

     stage.act(delta); 
     stage.draw(); 
    } 

    @Override 
    public void resize(int width, int height) { 

    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void hide() { 

    } 

    @Override 
    public void dispose() { 

    } 
} 

我不知道为什么它的发生,你能帮帮我吗?

+0

还有其它地方在你的代码中这个演员的位置发生变化? –

+0

不,我用屏幕代码更新了我的帖子。这也是非常基本的。 – Pasha

回答

1

Pasha,您的DragListener没有任何问题。使用这个项目(起始位置硬编码):

public class Item extends Image { 
    private String id; 

    public Item(String id) { 
     super(PicturesData.getPicture(getId()); 
     this.id = id; 
     setPosition(50, 50); 
     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); 
      } 
     }); 
    } 

    public String getId() { 
     return id; 
    } 
} 
+0

同样的错误对我来说。你使用什么样的libgdx版本?可以吗?我的版本是1.9。 3,但我也试过1.9.1 ...也许我应该在libgdx的github中报告它... – Pasha

+0

立即尝试代码:-) – WonderfulWorld

+0

是的,它的工作原理!他们应该在javadoc中写入'touchDragged'中的'X'和'Y'不是新的位置,而是与前一个位置的delta!非常感谢你! – Pasha

0

我认为你的DragListener不能正常工作的原因是因为你已经覆盖了touchDown函数,这是侦听器正常工作所必需的。只需将您的代码更改为:

addListener(new DragListener() { 
     @Override 
     public void drag(InputEvent event, float x, float y, int pointer) { 
      Log.add("Dragged: " + x + ", " + y); 
      setPosition(x, y); 
     } 
    }); 
+0

据我所知,覆盖'touchDown'是正确的。从用于'touchDragged'的javadoc:_当鼠标按钮或手指触摸移动到任何位置时调用,但仅当touchDown先前为鼠标按钮或touch_返回true时调用。无论如何,我试图删除'touchDown' - 结果仍然是: – Pasha

+0

尝试。相同的错误... – Pasha