質問

パドルに当たる位置に応じて、ボールをある角度にそらしたいと考えています。現時点では Y 座標のみを変更しているため、面白くない偏向が生じます。角度はつきますが、パドルに対する衝撃位置には依存しません。もっと楽しいことがしたいです。速度、運動量、質量、その他の要素を考慮する必要はありません。パドルのインパクト位置に応じて角度を調整してください。これを読みました iPhone アプリで衝突検出を行う非番号エラー (NAN) しかし、私が探しているものにとっては複雑すぎるようです。たわみを計算するもっと簡単な方法はありますか?

オブジェクトは 2 つの UIImageView です。

役に立ちましたか?

解決

まあ、現実的なことは何もありませんが、アウトバウンドの角度がパドルのどこに当たるかだけに依存するようにすることはできます。

私は iPhone や客観的な C コーディングをしたことがないので、疑似 C コードで何かを書いていきます。

まず、速度ベクトルの長さである速度を計算します。または、次のようになります。

double speed = sqrt(velX * velX + velY * velY); // trigonometry, a^2 + o^2 = h^2

次に、パドルを叩いた位置に基づいて新しい角度を計算します。X 衝突を ImpactX に格納し、パドルの長さを paddleLength に格納すると仮定します。そうすることで、外向きの角度を計算できます。まず、-1 から 1 までの値を取得する範囲を計算する方法を考えてみましょう。

double proportionOfPaddle = impactX / (double) paddleLength; // between 0 and 1
double impactRange = proportionOfPaddle * 2 - 1; // adjust to -1 and 1

ボールを完全に横方向、つまり 90 度に逸らしたくないと仮定します。そうしてしまうと回復するのが非常に難しくなります。ImpactRange を新しい velY として使用するので、-0.9 から 0.9 までスケールダウンします。

impactRange = impactRange * 0.9;

次に、速度が一定になるように velX を計算する必要があります。

double newVelX = impactRange;
double newVelY = sqrt(speed * speed - newVelX * newVelX); // trigonometry again

ここで、newVelX と newVelY を返すと、衝撃と速度に依存するバウンスが得られます。

幸運を!

(ここにバグがある可能性が高く、X または Y を反転した可能性がありますが、大まかなアイデアは理解していただければ幸いです)。

編集:ImpactX の入手についての考えを追加します。

ball.center.x と paddle.center.x (何と呼ぶか​​はわかりませんが、paddle.center.x がパドルの中心を提供すると仮定しましょう) があると仮定しましょう。次のことができるはずです。そこからimpactRangeを計算します。

ボールの半径 (ball.width を直径と仮定します) とパドルのサイズ (paddle.width?) も必要です。

int ballPaddleDiff = paddle.center.x - ball.center.x;
int totalRange = paddle.width + ball.width;

ballPaddleDiff の最小値は、ボールがパドルの側面にちょうど触れているときです。その ballPaddleDiff は、paddle.width/2 + ball.width/2 になります。したがって、新しいimpactRangeは次のようになります。

double impactRange = ballPaddleDiff / (double) totalRange / 2;

おそらく、ボールが星などに飛び出さないように、実際に -1 から 1 の間にあるように、impactRange をチェックする必要があります。

他のヒント

あなたは必ずしも現実的である必要はなく、楽しみたいです。それらは常に同じではありません。リアルにしたい場合は、速度、運動量、質量などを捨てることはできません。ピンポンの通常のゲームでは、パドルに当たるポイントは実際には重要ではなく、テニスラケットのようなスイートスポットはありません。

ボールの出力角度と速度を表す出力ベクトル、または速度と単位ベクトルを返す数学関数を開発し、入力角度、速度、パドル上の衝撃点、およびパドルの速度を与えます。

すでに出力角度= -1 *入力角度であると予想しています。出力速度も-1 *入力速度であると予想されます。それをミックスしたい場合は、それらを調整します。パドルの中心からの距離に比例して出力角度を増やすことができます。パドルが当たったときの角度または速度をパドルの速度に比例して増加させることもできます。

これを行うには多くの方法がありますので、使用する機能を正確に伝えることはできません。テストとプレイでそれを把握する必要があります。さらに情報が必要な場合は、質問に詳細を追加してください。

次のコード(C ++ですが、ObjCに簡単に変換できます)は、着信2Dベクトルを取得し、表面法線(ポンバットの顔)に基づいてそれを反映します。

「スカラー」に適用するオフセットをランダム化することで、ランダムな「楽しい要素」を追加することができます-速度を変更するか、表面の法線に適用して、反射角度を変更します。

iPhoneプロジェクトでこれを使用していますが、うまく動作します:)

void vec2ReflectScalar(vec2& vResult, const vec2& v1, const vec2& normal, float scalar)
{
    vec2  _2ndotvn;
    float dotVal = vec2DotProduct(v1, normal); 

    vec2Scale(_2ndotvn, normal, scalar * 2.f * dotVal);
    vec2Subtract(vResult, v1, _2ndotvn); 
}

void vec2Reflect(vec2& vResult, const vec2& v1, const vec2& normal)
{
    vec2ReflectScalar(vResult, v1, normal, 1.f);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top