使用开关盒进行验证功能(LWJGL键盘输入)?

时间:2017-07-03 01:05:34

标签: java switch-statement lwjgl

标题所说的内容。有可能吗? 据我所知,没有getKeyPressed或类似的东西。我想使用开关盒进行组织(和练习)以及速度(或者我被告知)。

基本上,switch case子句(?)只是一个布尔返回。但是如何在没有面食if / else语句的情况下根据传入的值检查是否按下某个键?

显然这段代码不起作用,但我正在寻找类似的东西。

public void moveCamera() {
    switch (Keyboard.isKeyDown(!!!CASE CHECKING HERE!!!)) {
        case Keyboard.KEY_W:
            position.z -= MOVE_SPEED;
            break;

        case Keyboard.KEY_A:
            position.x += MOVE_SPEED;
            break;

        case Keyboard.KEY_S:
            position.z -= MOVE_SPEED;
            break;

        case Keyboard.KEY_D:
            position.x += MOVE_SPEED;
            break;
    }
}

1 个答案:

答案 0 :(得分:0)

以下是 @KysonTyner 我喜欢(但未尝试过)的解决方案。

  

您可以启用getEventKey()。这将触及您当前的情况,然后您可以使用(getEventKeyState()) {switch/case}包装整个switch语句。无需使用事件侦听器。 - Kylon Tyner

至于我使用的是什么,我完全抛弃了开关的想法,因为我意识到如果有多个输入方向,移动速度会倍增。

我想支持对角线移动的多个运动方向,因此按下按键时不会出现“重影”。

我所做的是将功能分开,一个用于测试键盘输入,一个用于移动相机。键输入没有任何特殊逻辑,因为它只是将LWJGL Vector3f传递给相机移动功能。

然后,在相机移动中,我对该矢量进行了标准化并相应地改变了位置。

这是我的Camera类的简化版本,用于演示。除了翻译,我删除了所有内容。

package spikespaz.engine.main;

import org.lwjgl.input.Keyboard;
import org.lwjgl.util.vector.Vector3f;

// Created by spike on 7/3/2017.
public final class Camera {
    private Camera() {}

    private float moveSpeed = 0.2f;
    private Vector3f position = new Vector3f(0, 0, 0);

    public Camera(Vector3f position, Vector3f rotation) {
        this.position = position;
    }

            public void updateKeyInput() {
        Vector3f direction = new Vector3f(0, 0, 0);

        if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
            direction.x = 1;
        } else if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
            direction.x = -1;
        }

        if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
            direction.y = -1;
        } else if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {
            direction.y = 1;
        }

        if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
            direction.z = 1;
        } else if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
            direction.z = -1;
        }

        translate(direction);
    }

    private void translate(Vector3f direction) {
        Vector3f normalized = direction.normalise(null);
        Vector3f.add(position, (Vector3f) normalized.scale(moveSpeed), position);
    }

    public float getMoveSpeed() {
        return moveSpeed;
    }

    public void setMoveSpeed(float moveSpeed) {
        this.moveSpeed = moveSpeed;
    }
}

翻译是相对的。在完整的课程中,我有另一个设置绝对位置的功能,没有移动速度。

在上面的例子中,用于翻译的输入向量只是一个方向。该功能应根据每帧的移动速度进行协调。