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

Posted

技术标签:

【中文标题】Libgdx 输入处理器无法正常工作【英文标题】:Libgdx input processor doesn't work properly 【发布时间】:2014-10-10 04:41:58 【问题描述】:

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

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

这是我的输入处理器:

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 没有在那个特定时刻获得触摸数据,当用户开始围绕他的手指移动然后停止他的移动但仍然保持向下移动时。

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

【问题讨论】:

【参考方案1】:

对我来说,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;
        
    

【讨论】:

以上是关于Libgdx 输入处理器无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Libgdx输入处理手势捕获

批处理文件无法正常工作,找不到我的错误[关闭]

LibGDX - 无法从 FrameBuffer 获取纹理

LibGDX:AudioFlinger 无法创建轨道,状态 -12

开源java游戏框架libgdx专题-07-文件处理

EBCDIC 到 ASCII 无法正常工作