この質問が少しオープンエンドである場合は申し訳ありませんが、私はC#とXNAにかなり慣れていません...そして実際、このフォーラムです!
私はゲームを作成しており、固定点 (PowerStation という名前のクラスに属する添付のスクリーン キャプチャの左下) から光線を放射し、ユーザーが移動および回転できるミラーから反射する必要があります。添付のキャプチャで動作していることがわかるように、ピクセルごとの衝突検出方法を追加しました (ミラーが赤くなります)。
現在、ポイントを作成し、衝突が検出されるまで光のパスに沿って移動することにより、ビームのパスに対する障害物をテストしようとしています。そこから移動した距離を記録し、ビーム スプライトを不均一な方法で必要な量だけ引き伸ばします。これはすでに困難であることが証明されており、この方法にはまだ長い道のりがあると思います。
障害物とその回転を検出し、ビームを反射する方向 (ミラーのどちら側に当たるか) を決定するための最善の方法について誰かアドバイスがあればと思っていました。本当に複雑ですか、それともまったく機能しませんか?
現在、私の Beam クラスは次のようになっています... 1 つを除くすべてのクラスは、Object と呼ばれる 1 つの基本クラスから継承され、オブジェクトはすべて、別のクラス Items に属する静的な objectList で宣言されます。これが悪い、乱雑なコーディングである場合はお詫びします!
class Beam : Object
{
private Vector2 start;
private double length;
private Vector2 POC;
public Beam(Vector2 pos)
: base(pos)
{
spriteName = "beam";
depth = 0.2f;
solid = true;
foreach (Object o in Items.objectList)
{
if (o.GetType() == typeof(PowerStation))
{
start = o.Origin;
}
}
}
public override void Update()
{
Point newPoint = new Point((int)Origin.X, (int)Origin.Y);
while ((!(collision(new Mirror(new Vector2(0, 0))))) && (newPoint.X > 0) && (newPoint.Y > 0)) // && boundaries of window
{
newPoint.Y--; //will be changed to a Vector
}
POC = PointOfCollision(new Mirror(new Vector2(0, 0))); // Need to make it do POC of newPoint, not just the Beam Object!
length = FindLength(start, new Vector2(50, 50));
//Scale = new Vector2( , ); //amount to scale sprite
base.Update();
}
private double FindLength(Vector2 pos1, Vector2 pos2)
{
return (Math.Sqrt(Math.Pow(Math.Abs(pos2.X - pos1.X), 2.0f) + Math.Pow(Math.Abs(pos2.Y - pos1.Y), 2.0f)));
}
}
どんな助けでも大歓迎です!前もって感謝します