Java - 在循环中接收输入

时间:2015-09-07 16:41:57

标签: java loops 3d render lwjgl

我将LWJGL用于3d图形。

我想做的是从#34; GL_TRIANGLES"更改渲染类型。到" GL_LINES"按指定键(例如 - F1)。 因为帧率正常

if(Keyboard.isKeyDown(key))
        {
            //Action
        }
在正常按下按钮期间,

最多可以打开和关闭200次。 总的来说,它对我来说很有意思,这个问题通常是如何解决的,并且是最好的解决方法。

所以我提出的事情是(可能非常无效):

//Render class init
Key F1 = new Key(Keyboard.KEY_F1);

//Render method
renderMode = F1.ifPressed(delta);
if(renderMode)
{
    //GL_LINES render
}
else
{
    //GL_TRIANGLES render
}

//Key class
public class Key 
{
    int DELAY_TIME = 20;
    int delay = 0;
    int key;
    boolean isActive = false;
    boolean  state = false;

public Key(int key)
{
    this.key = key;
}

public boolean ifPressed(int delta)
{
    if(!isActive)
    {
        if(Keyboard.isKeyDown(key))
        {
            isActive = true;
            state = !state;
            return state;
        }
    }
    else if(delay <= DELAY_TIME * delta)
    {
        delay++;
    }
    else if(delay > DELAY_TIME)
    {
        delay = 0;
        isActive = false;
    }
    return state;

1 个答案:

答案 0 :(得分:2)

一个通用解决方案是拥有当前活动动作/按下的键列表。当某个键触发输入事件PRESSED(通常由框架/操作系统完成)时,检查该键是否在列表中。

if (list.contains(key)) {
    // not first time, so fire held
    onKeyHeld(key);
}
else {
    list.add(key);
    onKeyPressed(key);
}

触发输入事件RELEASED时,您将执行以下操作:

list.remove(key);
onKeyReleased(key);

鼠标事件以类似的方式完成。

更好的是,您可以使用某些UserAction类替换这些方法,以便它可以绑定到键/鼠标事件。代码将改为:

bind(Key.SPACE, new UserAction("Jump") {
    public void onActionStart() {} // on key pressed
    public void onAction() {}      // on key held
    public void onActionEnd() {}   // on key released
});

我在游戏库中使用了这个解决方案,因此可以确认它是否有效。