2

私がこれから尋ねようとしている質問は、やや難しいかもしれません。私はこれを可能な限り明確でまとまりのあるものにするよう努めます。

私は現在、次のように「レーザーリング」を備えたゲームを作成しています。

レーザーリング

このレーザーリングは、プロンプトが表示されると、以下に示す画像である「グラップリングフック」を発射します。この画像のframe.widthプロパティは、発射(長く)および収縮(短く)するように調整されます。幅0から始まり、フレームが進むにつれて、目的のポイントに到達するまで長くなります。

ここに画像の説明を入力してください

この鉤縄は、発射されると、1つのアイテムのように見えるようにリングと一列に並ぶ必要があります。明確にするために、以下の画像を参照してください。

ここに画像の説明を入力してください

※グラップリングフックの幅はほぼフレームごとに変化するため、一定の幅を想定することはできませんのでご注意ください。

他に注意すべき点は、説明が難しい理由で、私はframe.centerグラップリングフックのプロパティにのみアクセスでき、プロパティにはアクセスできないというframe.originことです。

だから、皆さんへの私の質問はこれです:上の画像に示すように、グラップリングフックのプロパティframe.center.xframe.center.yプロパティのみにアクセスして、リングからシームレスに伸びているように見えるように、レーザーリングの周りに配置するにはどうすればよいですか? -おそらく、任意のフレームでのグラップリングフックの角度と幅に基づいて計算されますか?

どんな助けでも大歓迎です。

4

1 に答える 1

6

OK、私は自分のアプリでこれとまったく同じことをしました。

簡単にするために私が行ったトリックは、ラインの「unitVector」を計算する関数を持つことでした。

つまり、線の長さ 1 に基づく線のベクトルの変化です。

単純なピタゴラスを使用するだけです...

- (CGSize)unitVectorFromPoint:(CGPoint)start toPoint:(CGPoint)end
{
    //distance between start an end
    float dX = end.x - start.x;
    float dY = end.y - start.y;
    float distance = sqrtf(dX * dX + dY * dY);  // simple pythagorus

    //unit vector is just the difference divided by the distance
    CGSize unitVector = CGSizeMake(dX/distance, dY/distance);

    return unitVector;
}

注...数値を2乗すると正の値しか得られないため、開始と終了がどちらの方向であっても問題ありません。

これで、このベクトルを使用して、2 点 (円の中心とターゲット) の間の線に沿った任意の点に到達できます。

というわけで、列の先頭は……

CGPoint center = // center of circle
CGPoint target = // target
float radius = //radius of circle

float dX = center.x - target.x;
float dY = center.y - target.y;

float distance = sqrtf(dX * dX + dY * dY);

CGSize unitVector = [self unitVectorFromPoint:center toPoint:target];

CGPoint startOfLaser = CGPointMake(center.x + unitVector.x * radius, center.y + unitVector.y * radius).

CGPoint midPointOfLaser = CGPointMake(center.x + unitVecotr.x * distance * 0.5, center.y + unitVector.y * distance * 0.5);

これは、単位ベクトルに移動したい距離 (半径) を掛けて、その距離の線上の点に到達するだけです。

これが役立つことを願っています:D

2点間の中間点が必要な場合は、「半径」を計算したい距離に変更するだけで、中間点が得られます。(等々)。

于 2012-11-19T10:42:10.703 に答える