1

さて、私は自分の問題の解決策を探して探しましたが、それを修正していないようです。

回転する「大砲」でゲームを作成する必要があります。大砲は、パネルの中央に配置された単純な長方形で、キーボードで回転できます。片方の端を中心に回転します。向こう側の端から飛び出したい。以下を使用して、弾丸を発射する場所の開始点を見つけました。

x = a + dia * (float)Math.Cos(angle);
y = b + dia * (float)Math.Sin(angle)

ここで、「a、b」は中心座標を回転させ、「dia」は長方形の対角線、「angle」は長方形の半分の角度です。

public float rotate = 0.0f; 
g.TranslateTransform(a , b);
        g.RotateTransform(rotate);

リストに入れた弾丸用の独自のクラスがあります。ここまでは順調ですね。しかし、大砲を回転させると、弾丸が先端から出なくなります。弾丸は、私が望む場所から遠くに現れ始めます。これは、このコードが原因です。

x = (float)((x * Math.Cos(rotate)) - (y * Math.Sin(rotate)));
        y = (float)((x * Math.Sin(rotate)) + (y * Math.Cos(rotate)));

これは、大砲の先端のx、y座標を更新することになっています。削除すると、同じ場所から発砲するだけです(たわごとはありません)。X、Yを更新して長方形の端から出てくるように、どのコードを書く必要があるかを誰かに説明してもらえますか?それは私を夢中にさせています。

編集:早朝に画面を見つめて私の答えを見つけました。「新しいx、y座標を見つける」必要はありませんでした。回転するたびに少し動かす必要のあるフロート番号で元の角度を更新するアップデーターを作成しただけです。はぁ!とてもシンプルですが、とても見づらいです。

4

1 に答える 1

0

初めに、

x = (float)((x * Math.Cos(rotate)) - (y * Math.Sin(rotate)));
y = (float)((x * Math.Sin(rotate)) + (y * Math.Cos(rotate)));

次のようにする必要があります。

float oldx = x;
float oldy = y; 
x = (float)((oldx * Math.Cos(rotate)) - (oldy * Math.Sin(rotate)));
y = (float)((oldx * Math.Sin(rotate)) + (oldy * Math.Cos(rotate)));

あなたの新しい価値観は、純粋に古い価値観に基づいている必要があります..

これを修正した後に他の問題が発生した場合は、長方形が平面上でどのように変換されるかに関連している可能性があります。

編集:これがコードレビューである場合、私が与えた解決策も最善の解決策ではないと思います(xの新しい値を使用して新しい値を計算することによって導入されたバグに悩まされていないだけです) yの)。参照してください、Math.Cos と Math.Sin は、一般に、乗算と加算に比べて高価な演算です。同じ方法で変換する必要があるポイントがたくさんある場合は、それらの値を一度計算して、すべてのポイントに使用するのMath.Sin(rotate)が最善です。Math.Cos(rotate)これは、Flyweight パターンを使用し、インスタンスが特定のオブジェクト/コンテキストのすべてのポイントを保持するクラスを定義して、操作を集約して実行できるようにするのに適した場所です。

于 2012-11-18T18:12:22.000 に答える