Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用开关盒进行验证功能(LWJGL键盘输入)?_Java_Switch Statement_Lwjgl - Fatal编程技术网

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

Java 使用开关盒进行验证功能(LWJGL键盘输入)?,java,switch-statement,lwjgl,Java,Switch Statement,Lwjgl,标题所说的。可能吗? 据我所知,没有getKeyPressed或类似的东西。我想为组织(和实践)以及速度(或者我被告知的那样)使用一个切换案例 基本上,switch case子句(?)只是一个布尔返回。但是,如果没有if/else语句,如何根据传入的值检查是否按下了键 显然,这段代码不起作用,但我正在寻找类似的东西 public void moveCamera() { switch (Keyboard.isKeyDown(!!!CASE CHECKING HERE!!!)) {

标题所说的。可能吗? 据我所知,没有
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;
    }
}

这是一个我喜欢(但没有尝试)的@KysonTyner解决方案。

您可以打开
getEventKey()
。这将影响您当前的案例,然后您可以使用if
(getEventKeyState()){switch/case}
包装整个switch语句。无需使用事件侦听器凯隆·泰纳

至于我使用的东西,我完全放弃了开关的想法,因为我意识到如果有多个输入方向,运动速度会成倍增加

我想支持对角线运动的多个运动方向,这样按键时就不会出现“重影”

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

然后,在摄影机移动中,我规范化了该向量,并相应地改变了位置

这是我的相机课程的简化版本,用于演示。除了翻译,我什么都删除了

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;
    }
}
翻译是相对的。在完整的类中,我有另一个函数来设置绝对位置,而不需要移动速度


在上面的示例中,translate的输入向量只是一个方向。该函数应根据每帧的移动速度进行协调。

为此,通常需要一个事件侦听器。请注意,这在控制台程序中是不可能的。@TimBiegeleisen它是LWJGL,因此显然不是控制台应用程序。但一个事件监听器会有多重呢?只需谷歌搜索,或者检查堆栈溢出。您可以打开getEventKey()。这将影响您当前的案例,然后您可以使用if(getEventKeyState()){switch/case}包装整个switch语句。不需要使用事件侦听器。很高兴看到您找到了一个有效的解决方案!如果您感兴趣……以这种方式创建相对移动将允许移动实体在按住A/W、W/D、D/S、S/A时移动得更快,因为它应用了大约1.414个平移单位。而当你只握住一个方向键(W,A,S,D)时,它正好应用了1个单位的平移。要解决此问题,可以使用相对于实体角度的sin/cos函数。(对于某些游戏来说,这会产生巨大的差异)@KylonTyner我明白你的意思,如果它们在所有三个轴上运动,它的移动速度也会超过1.414个单位,例如服务器上的管理员。但是我认为输入向量的标准化可以通过将和减少到一个单位来解决这个问题。不是这样吗?