0

簡単なレースゲームを作ってみました。そのために、位置のベクトルと向きのベクトルを持つ車を手に入れました。

私は更新と入力方法を持っています:

public void update(double delta) {
    float rotation = 0;
    if(movement.normalized().getY() < 0) {
        rotation = (float) (2*Math.PI - Math.acos(movement.normalized().getX()));
    } else {
        rotation = (float) Math.acos(movement.normalized().getX());
    }

    pos = pos.add(new Vector3f((float) (Math.cos(rotation) * (movement.length() - 2) * delta), (float) (Math.sin(rotation) * (movement.length() - 2) * delta), 0f));

    v1 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos((rotation + basicAngel)) * radius), (float) (pos.getY() + (Math.sin((rotation + basicAngel)) * radius)), 0), new Vector2f(0, 0));
    v2 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos(((2*Math.PI - basicAngel) + rotation)) * radius), (float) (pos.getY() + Math.sin(((2*Math.PI - basicAngel) + rotation)) * radius), 0), new Vector2f(0, 0));
    v3 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos((Math.PI + rotation + basicAngel)) * radius), (float)(pos.getY() + Math.sin((Math.PI + rotation + basicAngel)) * radius), 0), new Vector2f(0, 0));
    v4 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos(((Math.PI - basicAngel) + rotation)) * radius), (float)(pos.getY() + Math.sin(((Math.PI - basicAngel) + rotation)) * radius), 0), new Vector2f(0, 0));
    v5 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos((windowAngel + rotation)) * windowRadius), (float)(pos.getY() + Math.sin((windowAngel + rotation)) * windowRadius), 0), new Vector2f(0, 0));
    v6 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos(((2*Math.PI - windowAngel) + rotation)) * windowRadius), (float)(pos.getY() + Math.sin(((2*Math.PI - windowAngel) + rotation)) * windowRadius), 0), new Vector2f(0, 0));
}

最初の if ステートメントは、正規化されたベクトルの y コンポーネントが 0 未満かどうかをチェックします。
これにより、車が水平軸の下で回転するようになります。
次の行は、回転と速度を位置に適用します。
v1...v4 のブロックは、車の角を計算してレンダリングします。
v5 と v6 は車の窓の角です。

public void input() {

    float tempX = movement.normalized().getX();
    float tempY = movement.normalized().getY();
    float tempLength = movement.length();

    if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
        movement = movement.rotate(3);
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
        movement = movement.rotate(-3);
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
        if (tempLength <= 7) {

            movement.setX((float) (Math.cos(Math.acos(movement.normalized().getX())) * (tempLength + 0.2)));
            movement.setY((float) (Math.sin(Math.acos(movement.normalized().getX())) * (tempLength + 0.2)));

        }
    } else {
        if(tempLength > 2) {

            movement.setX((float) (Math.cos(Math.acos(movement.normalized().getX())) * (tempLength - 0.05)));
            movement.setY((float) (Math.sin(Math.acos(movement.normalized().getX())) * (tempLength - 0.05)));

        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
        if (tempLength >= 0) {

            movement.setX((float) (Math.cos(Math.acos(movement.normalized().getX())) * (tempLength - 0.2)));
            movement.setY((float) (Math.sin(Math.acos(movement.normalized().getX())) * (tempLength - 0.2)));

        }
    } else {
        if (tempLength < 2) {

            movement.setX((float) (Math.cos(Math.acos(movement.normalized().getX())) * (tempLength + 0.05)));
            movement.setY((float) (Math.sin(Math.acos(movement.normalized().getX())) * (tempLength + 0.05)));

        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
        reset();
    }
}

最初の 2 つの if ステートメントは、左または右のキーが押されたかどうかをチェックしています。それが起こった場合、移動手段は回転します。次の 2 つのステートメントは、上下のキーをチェックし、次の式を使用して移動ベクトルに速度を適用しています。

x = cos a * (l + speed)
y = sin a * (l + speed)

ここで、a は移動ベクトルの角度、
l は移動ベクトルの長さです。

すべてが正常に機能するはずです。ただし、時々計算を誤って、車が予想どおりに別の方向に進むことがあります。

誰かが間違いを見つけるのを手伝ってくれますか?

4

1 に答える 1