4

我正在使用带有舞台的演员作为按钮。我可以检测到何时touchDown/touchUp事件在actor上发生得很好,但是当用户点击actor然后继续将他们的手指从actor上拖动时,touchUp事件永远不会触发。我尝试改用退出事件,但它永远不会触发。在我的程序中,touchUp/touchDown 事件决定了移动以及按钮颜色,这取决于按钮是否被按下。所以我留下了一个永久“按下”的按钮,直到它再次被向下/向上点击。

我正在使用的代码示例:

stage.addListener(new InputListener() {

    public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
        Actor actor = stage.hit(x, y, true);
        if (actor != null){
            System.out.println("touchDown: " + actor.getName().toString()); 
        }
        return true;
    }

    public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
        Actor actor = stage.hit(x, y, true);
        if (actor != null){
                System.out.println("touchUp: " + actor.getName().toString());           
                }
        }

    public void exit(InputEvent event, float x, float y, int pointer, Actor toActor){
        System.out.println("exit");
    }
});
4

2 回答 2

3

如果你改变

stage.addListener(new InputListener() {});

stage.addListener(new ClickListener() {});

它会识别 TouchUp 调用。它仍然能够处理 TouchDown 和 Exit 调用。

于 2014-02-02T05:28:30.650 回答
1

我有同样的问题。我通过创建boolean isDown变量作为我的 GameScreen 类的字段来修复它。每当我的背景图像上发生 touchDown 时,我将 isDown 变量设为 true,而当 touchUp 发生时 - isDown = false。这样touchUp总是会发生。然后仍然在我的 GameScreen 渲染方法中检查 isDown 是否为真,如果是,我检查触摸是否与我的演员相交:

if (isDown) {
   if (pointIntersection(myActor, Gdx.input.getX(), Gdx.input.getY())) {
                // do something
   }
} else {
  // reverse the effect of what you did when isDown was true
}

其中 pointIntersection 方法是:

public static boolean pointIntersection(Image img, float x, float y) {
    y = Gdx.graphics.getHeight() - y;
    if (img.x <= x && img.y <= y && img.x + img.width >= x && img.y + img.height >= y)
        return true;

    return false;
}

这是我发现的唯一解决方法。不过,它不是很漂亮,但对我有用。

于 2013-03-28T19:30:35.423 回答