Java - 在循环中接收输入

标签 java loops 3d render lwjgl

我使用 LWJGL 进行 3D 图形。

我想要做的事情是通过按指定的键(例如 - F1)将渲染类型从“GL_TRIANGLES”更改为“GL_LINES”。 由于帧率高正常

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;

最佳答案

一个通用的解决方案是拥有当前 Activity 操作/按下的按键的列表。当某个键的输入事件 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)到键/鼠标事件。代码将更改为如下内容:

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

我已在游戏库中使用此解决方案,因此可以确认它有效。

关于Java - 在循环中接收输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443026/

相关文章:

java - 访问静态对象而不创建包含它的类的实例

java - 如何使用 Java 将 JPEG 图像插入 PostgreSQL bytea 字段,然后使用 PHP 显示在网站上?

java - 有什么方法可以从层次结构中更高的类中退出命名循环(或其他方式)?

Javascript - 递归循环,同时跟踪父子关系

javascript - 在javascript中使用什么数据结构或迭代方法来获得循环列表行为

java - 在 Main 中调用静态方法

java - 如何从已编译的类中获取 javac 标志

javascript - 如何在 webgl 中从前/左/上向量创建投影矩阵

javascript - THREE.js:将网格划分为多个部分

c++ - 给定两组 xyz 坐标和 sag (a) 的值,我可以在 OpenGL 中的这些点之间绘制悬链线吗?