簡単なレースゲームを作ってみました。そのために、位置のベクトルと向きのベクトルを持つ車を手に入れました。
私は更新と入力方法を持っています:
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 は移動ベクトルの長さです。
すべてが正常に機能するはずです。ただし、時々計算を誤って、車が予想どおりに別の方向に進むことがあります。
誰かが間違いを見つけるのを手伝ってくれますか?