Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Libgdx-如何使用;长按“;?_Java_Android_Libgdx - Fatal编程技术网

Java Libgdx-如何使用;长按“;?

Java Libgdx-如何使用;长按“;?,java,android,libgdx,Java,Android,Libgdx,我试图找到解决问题的答案,但我认为我似乎不明白如何在Libgdx中使用长按 我希望我的角色在长按屏幕右半部分时向右移动,在长按屏幕左半部分时向左移动 我找了又试 这是我在PuthHandler上的课程: public class InputHandler implements InputProcessor { private MainCharacter myMainCharacter; public InputHandler(MainCharacter mainCharacter) {

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

我希望我的角色在长按屏幕右半部分时向右移动,在长按屏幕左半部分时向左移动

我找了又试

这是我在PuthHandler上的课程:

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;
}
}
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;
}
}
这是我的
主要角色课程:

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;
}
}
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;
}
}
公共类主字符{
私有向量2位置;
专用矢量2速度;
私人矢量2加速;
私人浮动轮换;
私有整数宽度;
私人内部高度;
公共主字符(浮点x、浮点y、整型宽度、整型高度){
这个。宽度=宽度;
高度=高度;
位置=新矢量2(x,y);
速度=新矢量2(0,0);
加速度=新矢量2(0460);
}
公共无效更新(浮动增量){
速度.add(加速度.cpy().scl(增量));
如果(速度y>200){
速度y=200;
}
position.add(velocity.cpy().scl(delta));
}
公共void onClick(){
if(Gdx.input.getX()=137){
Gdx.app.log(“TAG”,“RIGHT”);
position.x++;
}
}
公共浮点getX(){
返回位置.x;
}
公共浮球{
返回位置y;
}
公共浮点getWidth(){
返回宽度;
}
公众浮标高度(){
返回高度;
}
公共浮动getRotation(){
返回旋转;
}
}
我使用
onClick()
方法作为替换,直到找到问题的解决方案。它工作得很好,但它没有长按的效果。我的角色在单击屏幕左侧时向左移动,在单击屏幕右侧时向右移动。但当我长按时,它当然不起作用

那么如何使用“长按”呢


非常感谢您的帮助。

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

GestureDetector
将让您检测以下手势:

触地
:用户触摸屏幕

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

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

pan
:用户在屏幕上拖动手指。探测器将报告当前触摸坐标以及当前和以前触摸位置之间的增量。用于在二维中实现摄影机平移。 panStop:不再平移时调用

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

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

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

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

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 () {
    }
}
您必须将包含您的
gestureeListener
GestureDetector
设置为
InputProcessor

     Gdx.input.setInputProcessor(new GestureDetector(new MyGestureListener()));
有关更多详细信息,请查看下面的链接


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
  }
}
if(Gdx.input.isTouched())
{
//手指触摸屏幕
//如果您在这里使用的变量和逻辑正确,您实际上可以在这里开始调用onClick。
if(Gdx.input.getX()>=screenSize/2)
{
//右击
}
else if(Gdx.input.getX()

每帧检查一次,然后进行逻辑分析。

那么我应该删除我的输入处理程序和onClick方法吗?一切都很好,但是如果长按左半部,我如何使角色向左移动,如果长按右半部,我如何使角色向右移动?如何随着按下时间或持续时间的增加而增加移动距离?请尝试实现手势检测器,而不是实现输入处理器,请遵循我发布的链接。如需更多参考,请通过tat链接,您必须将屏幕分为左侧和右侧。我会给你的样本代码。请稍候。如果(Gdx.input.isTouched()){float touchleet=Gdx.input.getX();如果(touchleet<640){characterVelocity=10;}否则{characterVelocity=20;}那么这应该在长按之外吗?它应该进入更新循环。长按仅在按住一段时间后被调用一次。长按仅在按住屏幕X次后被调用
1次
。因此,如果你将角色移动1个单位,它将只移动1个单位。然后,您需要释放屏幕并再次按下X次,使其移动另一个1单元。这是您正在寻找的功能吗?