Libgdx - 如何使用“长按”?

时间:2017-02-15 05:23:00

标签: java android libgdx

我已经尝试找到解决问题的答案,但我认为我似乎不明白如何在 Libgdx 中使用长按。

当我长按屏幕的右半部分时,我希望我的角色向右移动,当我长按屏幕的左半部分时,我想离开。

我已经搜索并尝试过了。

这是我的 InputHandler 类:

public class InputHandler implements InputProcessor {
private MainCharacter myMainCharacter;

public InputHandler(MainCharacter mainCharacter) {
    myMainCharacter = mainCharacter;
}

@Override
public boolean keyDown(int keycode) {
    return false;
}

@Override
public boolean keyUp(int keycode) {
    return false;
}

@Override
public boolean keyTyped(char character) {
    return false;
}

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    myMainCharacter.onClick();
    return false;
}

@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    return false;
}

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
    return false;
}

@Override
public boolean mouseMoved(int screenX, int screenY) {
    return false;
}

@Override
public boolean scrolled(int amount) {
    return false;
}
}

这是我的 MainCharacter 类:

public class MainCharacter {

private Vector2 position;
private Vector2 velocity;
private Vector2 acceleration;

private float rotation;
private int width;
private int height;

public MainCharacter(float x, float y, int width, int height) {
    this.width = width;
    this.height = height;
    position = new Vector2(x, y);
    velocity = new Vector2(0, 0);
    acceleration = new Vector2(0, 460);
}

public void update(float delta) {
    velocity.add(acceleration.cpy().scl(delta));

    if (velocity.y > 200) {
        velocity.y = 200;
    }

    position.add(velocity.cpy().scl(delta));
}

public void onClick() {
    if (Gdx.input.getX() <= 135) {
        Gdx.app.log("TAG", "LEFT");
        position.x--;
    } else if (Gdx.input.getX() >= 137) {
        Gdx.app.log("TAG", "RIGHT");
        position.x++;
    }
}

public float getX() {
    return position.x;
}

public float getY() {
    return position.y;
}

public float getWidth() {
    return width;
}

public float getHeight() {
    return height;
}

public float getRotation() {
    return rotation;
}
}

我使用onClick()方法作为替代方法,直到找到问题的解决方案。它工作正常,但它与长按没有相同的效果。当我点击屏幕左侧时,我的角色向左移动,当我点击屏幕右侧时,我的角色向右移动。但当我长按时,它当然不起作用。

那么如何使用'长按'?

我真的很感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Gokul给出了GestureListener的一个很好的概述,但我不相信这是你正在寻找的。 LongPress确实只会在按下几秒后才会注册,并且您希望立即对该角色进行触控。

侦听器中没有开箱即用的方法来保持触摸检测,但您可以自己创建。

if (Gdx.input.isTouched())
{
  //Finger touching the screen
  // You can actually start calling onClick here, if those variables and logic you are using there are correct.
  if (Gdx.input.getX() >= screenSize / 2)
  {
    //Right touched
  }
  else if (Gdx.input.getX() < screenSize / 2)
  {
    //Left touched
  }
}

只需检查每一帧并做出你的逻辑。

答案 1 :(得分:0)

您可以通过实施GestureListner界面实现长按。

GestureDetector可让您检测以下手势:

touchDown:用户触摸屏幕。

longPress:用户触摸屏幕一段时间。

tap:用户触摸屏幕并再次抬起手指。手指不得移动到初始触摸位置周围的指定方形区域之外,以便注册水龙头。如果用户在指定的时间间隔内执行点击,则会检测到多个连续点击。

pan:用户在屏幕上拖动手指。检测器将报告当前触摸坐标以及当前触摸位置和先前触摸位置之间的差值。用于在2D中实现摄像机平移。 panStop:不再平移时调用。

fling:用户将手指拖过屏幕,然后将其抬起。用于实现滑动手势。

zoom:用户将两根手指放在屏幕上并将它们一起/分开移动。检测器将以像素为单位报告手指之间的初始和当前距离。用于实现相机缩放。

pinch:与缩放相似。检测器将报告初始和当前手指位置而不是距离。用于实现相机缩放和更复杂的手势,如旋转。

GestureDetector是一个事件处理程序。要监听手势,必须实现GestureListener接口并将其传递给GestureDetector的构造函数。然后将检测器设置为InputProcessor,在InputMultiplexer上或作为主InputProcessor:

public class MyGestureListener implements GestureListener{

    @Override
    public boolean touchDown(float x, float y, int pointer, int button) {

        return false;
    }

    @Override
    public boolean tap(float x, float y, int count, int button) {
        return false;
    }

    @Override
    public boolean longPress(float x, float y) {
        return false;
   }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        return false;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {
        return false;
    }

    @Override
    public boolean panStop(float x, float y, int pointer, int button) {
        return false;
    }

    @Override
    public boolean zoom (float originalDistance, float currentDistance){
       return false;
    }

    @Override
    public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer){
       return false;
    }

    @Override
    public void pinchStop () {
    }
}

您必须将包含GestureDetector的{​​{1}}设为GestureListener

InputProcessor

有关详细信息,请查看以下链接

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/input/GestureDetector.GestureListener.html