LibGDX - 如何获取向上滑动或向右滑动等手势?

12

触摸区域 http://imageshack.us/a/img836/2909/swipe1.png

在绿色区域内,用户可以向上、向右、向下、向左滑动。 现在我该如何获取例如向上滑动?或者向下滑动?或者向右滑动或向左滑动? 例如,如何获取字符串 -> input = getSwiped(); -> 然后输入为 Up、right、down 或 left。

用户还可以触摸两个按钮。1 或 2。 1 是鸭子,2 是跳跃。

我想同时检查这些输入。用户可以同时触摸并向上滑动。

我知道有一个 GestureDetector。我看了代码,但不知道如何使用滑动部分。

我知道一点如何检查按钮。问题只在于 -> 如何同时检查输入以及如何获取 Swipe Up、Swipe right 等。

我搜索并找到了如何检查多点触控的方法:

for (int i = 0; i < 10; i++) {
    if (Gdx.input.isTouched(i) == false) continue;
    float x = Gdx.input.getX(i);
    float y = Gdx.graphics.getHeight() - Gdx.input.getY(i) - 1;
    //...
}
2个回答

27

这篇文章详细讲解了一种很好的实现滑动方向检测系统的方法。我将其发布在此处,因为该文章可能会在未来失效:

创建一个名为SimpleDirectionGestureDetector的类

public class SimpleDirectionGestureDetector extends GestureDetector {
public interface DirectionListener {
    void onLeft();

    void onRight();

    void onUp();

    void onDown();
}

public SimpleDirectionGestureDetector(DirectionListener directionListener) {
    super(new DirectionGestureListener(directionListener));
}

private static class DirectionGestureListener extends GestureAdapter{
    DirectionListener directionListener;

    public DirectionGestureListener(DirectionListener directionListener){
        this.directionListener = directionListener;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        if(Math.abs(velocityX)>Math.abs(velocityY)){
            if(velocityX>0){
                    directionListener.onRight();
            }else{
                    directionListener.onLeft();
            }
        }else{
            if(velocityY>0){
                    directionListener.onDown();
            }else{                                  
                    directionListener.onUp();
            }
        }
        return super.fling(velocityX, velocityY, button);
    }

}

}

在LibGdx应用程序的create()函数中,放入以下内容以激活手势处理功能:

Gdx.input.setInputProcessor(new SimpleDirectionGestureDetector(new SimpleDirectionGestureDetector.DirectionListener() {

@Override
public void onUp() {

}

@Override
public void onRight() {

}

@Override
public void onLeft() {

}

@Override
public void onDown() {

}
}));

1
我在我的游戏中使用这个,问题是每当我向任何方向滑动时,游戏都会暂停一段时间(我指的是毫秒级别,但是它是明显可见的)。有没有办法解决这个问题? - Vipul Behl
如果你不展示代码,那么为什么会发生这种情况就很难知道了,这是不应该出现的。 - Daahrien
我想知道为什么它还没有被添加到Libgdx中。 顺便说一下,如果你想使用滑动手势(例如通过InputMultiplexer顺序),你需要从fling方法返回“true”。 - Enigo
@VipulBehl 我也遇到了这个基本代码示例的同样问题。它会延迟大约500毫秒。你找到解决方法了吗?另外,我想知道用户在屏幕上滑动的距离的提示。如果他在屏幕的下半部分或上半部分滑动,有人知道如何获取吗? - trinity420
似乎只有在手势完成时才会调用fling()。你可以尝试覆盖pan()方法。 - Anthony Hayward

0
我创建了一个简单的类来识别滑动的方向。
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.input.GestureDetector;
import com.badlogic.gdx.math.Vector2;

/**
 * Created by ROHIT on 3/11/2018.
 */

public class swipelistener  {

public boolean isswipright(){
    if(Gdx.input.isTouched()&&Gdx.input.getDeltaX()>0)
        return true;
    return false;
}

public boolean isswipleft(){
    if(Gdx.input.isTouched()&&Gdx.input.getDeltaX()<0)
        return true;
    return false;
}

public boolean isswipup(){
    if(Gdx.input.isTouched()&&Gdx.input.getDeltaY()>0)
        return true;
    return false;
}

public boolean isswipdown(){
    if(Gdx.input.isTouched()&&Gdx.input.getDeltaX()<0)
        return true;
    return false;
}

}

жүҖжңүдёҠиҝ°д»Јз ҒйғҪдҪҝз”ЁlibGDXзҡ„`Gdx.input.getDeltaX()`е’Ң`Gdx.input.getDeltaY()`жқҘиҺ·еҸ–ж–№еҗ‘зҡ„зӣёеҜ№еҸҳеҢ–гҖӮ
еёҢжңӣиҝҷиғҪжңүжүҖеё®еҠ©гҖӮ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接