java - Libgdx 输入处理器无法正常工作

标签 java input libgdx touch

我有这个游戏,它会跟随玩家在游戏中所做的每一次输入。我为 touchDragged、touchDown 和 touchUp 定义了特定的 Action 。唯一的问题是,每当玩家开始移动他的鼠标/手指然后停止但仍保持鼠标/手指按下时,游戏就无法捕获该输入,因此游戏无法正常运行。

如果用户拖动手指/鼠标然后没有抬起手指就停止了,有什么方法可以处理输入吗?

这是他的我的 InputProcessor:

package com.david.helpers;

import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array;
import com.david.objects.Acorn;

public class InputHandler implements InputProcessor{

    private Vector2 target;
    private Vector3 temp;
    private OrthographicCamera camera;
    private Array<Acorn> acorns;
    private boolean isAiming = false;

    public InputHandler(Array<Acorn> acorns, OrthographicCamera camera) {
        this.camera = camera;
        this.acorns = acorns;
        target = new Vector2();
        temp = new Vector3();
    }
    @Override
    public boolean keyDown(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        // TODO Auto-generated method stub
        camera.unproject(temp.set(screenX, screenY, 0));
        if(!temp.isZero() && temp != null) {
            target.set(temp.x, temp.y);
            target.sub(acorns.peek().getBody().getPosition());
            target.nor();
            isAiming = true;
        }
        return true;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        // TODO Auto-generated method stub
        camera.unproject(temp.set(screenX, screenY, 0));
        if(!temp.isZero() && temp != null) {
            target.set(temp.x, temp.y);
            target.sub(acorns.peek().getBody().getPosition());
            target.nor();
            acorns.peek().getBody().setLinearVelocity(target.cpy().scl(25));
            isAiming = false;
        }
        return true;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        // TODO Auto-generated method stub
        camera.unproject(temp.set(screenX, screenY, 0));
        if(!temp.isZero() && temp != null) {
            target.set(temp.x, temp.y);
            target.sub(acorns.peek().getBody().getPosition());
            target.nor();
        }
        return true;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
        // TODO Auto-generated method stub
        return false;
    }
    public Vector2 getTarget() {
        return this.target;
    }
    public boolean isAiming() {
        return this.isAiming;
    }
}

这背后的问题非常简单 - 我有一个射弹,在它发射之前,用户可以拖动鼠标/手指并选择发射它的位置。现在,代码根据用户的触摸绘制轨迹并且工作正常。唯一的问题是,每当用户停止移动手指但仍保持向下移动时,程序就不会绘制轨迹。在我的 Renderer 类中,我检查 InputProcessor 中的 isAiming 变量是否为真。如果是这样,它会绘制所需的轨迹。 在我看来,当用户开始围绕他的手指移动然后停止移动但仍保持向下移动时,InputProcessor 就好像没有在那个特定时刻获取触摸数据。

这很烦人,如果你们能帮助我,我会很高兴:)

最佳答案

对我来说,Android 设备中的触摸操作通常存在问题。对于你想要的,试试Input Polling相反:

//In your render method.
if(Gdx.input.isTouched()){
    camera.unproject(temp.set(Gdx.input.getX(), Gdx.input.getY(), 0));
    if(!temp.isZero() && temp != null) {
        target.set(temp.x, temp.y);
        target.sub(acorns.peek().getBody().getPosition());
        target.nor();
        isAiming = true;
    }
}else{
    if(isAiming){
        camera.unproject(temp.set(Gdx.input.getX(), Gdx.input.getY(), 0));
        if(!temp.isZero() && temp != null) {
            target.set(temp.x, temp.y);
            target.sub(acorns.peek().getBody().getPosition());
            target.nor();
            acorns.peek().getBody().setLinearVelocity(target.cpy().scl(25));
            isAiming = false;
        }
    }
}

关于java - Libgdx 输入处理器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26292075/

相关文章:

java - Android 手机使用历史 NetworkStatsManager

java - 方括号的keycode是什么

html - bootstrap 4 输入中的 ionicons

java - 程序未检测到鼠标点击

java - libGDX 我应该在哪里使用 dispose/如何使对象成为一次性对象?

java - 调整框架大小时 javafx GUI 背景保持居中的问题

java - 将 CSV 文件转换为 XLS 文件,逗号出现问题

c# - 如何使用InputSimulator模拟远程桌面上的特定按键?

c - 读取用户输入,直到在 C 中按下 ESC

java - 新的 libgdx 安装程序构建一直失败