2

背景: 私はプレイヤーが円に触れることで宇宙船を制御する鳥瞰図の JavaScript ゲームを持っています。右など...疑似ジョイスティックの円の中心から離れるほど、その方向の速度が速くなります。ただし、船の速度を直接調整するのではなく、targetSpeed.x と targetSpeed.y の値を設定すると、船は次のようなものを使用して速度を調整します。

if (this.speed.x < this.targetSpeed.x) {
    this.speed.x += this.speedStep;
}
else if (this.speed.x > this.targetSpeed.x) {
    this.speed.x -= this.speedStep;
}

... y 速度についても同じです。speedStep は、それをよりスムーズにし、急すぎないようにするための小さな値です (船は、高速の左方向からすぐに高速の右方向に移動するべきではありません)。

私の質問: 上記のコードを使用すると、速度は対角線方向でより速く調整され、水平/垂直線に沿って遅く調整されると思います。これを修正して、目標速度が同じになるようにするにはどうすればよいですか?

助けてくれてありがとう!

4

2 に答える 2

5
var xdiff = targetSpeed.x - speed.x;
var ydiff = targetSpeed.y - speed.y;
var angle = Math.atan2(ydiff, xdiff);
speed.x += speedStep * Math.cos(angle);
speed.y += speedStep * Math.sin(angle);
于 2010-09-07T14:07:26.643 に答える
1

タッチが円の内側にあり、円の端が最大速度を表し、円の中心がcircleTouch == [0, 0]

一部の C++ ライクな擬似コードでは、次のようになります。

Scalar circleRadius = ...;
Scalar maxSpeed = ...;
Scalar acceleration = ...;

Vector calculateTargetSpeed( Vector circleTouch ) {
    Vector targetSpeed = maxSpeed * circleTouch / circleRadius;

    return targetSpeed;
}

Vector calculateNewSpeed( Vector currentSpeed, Vector targetSpeed ) {
    Vector speedDiff = targetSpeed - currentSpeed;

    Vector newSpeed = currentSpeed + acceleration * normalized(speedDiff);

    return newSpeed;
}

// Divide v by its length to get normalized vector (length 1) with same x/y ratio
Vector normalized( Vector v ) {
    return v / length(v);
}

// Pythagoras for the length of v
Scalar length( Vector v ) {
    Scalar length = sqrt(v.x * v.x + v.y * v.y); // or preferably hypot(v.x, v.y)

    return length;
}

これは私の頭の上にあるだけで、テストしていません。他の答えは問題ありません。三角関数なしで答えたかっただけです。:)

于 2010-09-07T15:21:51.643 に答える