したがって、私の衝突検出システムは、文字の各ピクセルをチェックし、collisionDetectedにフラグを立て、問題のある文字モデルのピクセルをcollisionDetectedXとcollisionDetectedYに配置するように設定されています。このデータを使用して、有効な可動領域がどこにあるかを判断し、ユニットをその中に戻します。これを回避する唯一の方法は、XとYのCollisionクラスを同時に実行することですか、それともこのクラスを変更して両方のジョブを同時に適切に実行することはできますか?お時間をいただきありがとうございます。私は自分が何を間違えたのかを理解しようと努力してきました。ずさんなコードをお詫びします。私はそれを少しきれいにしました(それは本当に混乱でした)、しかし私はそれが価値のある最終製品ではないことに気づきます。
class Collision
{
public Color[,] DataMiner(Texture2D background)
{
Color[,] collision2D;
Color[] collision1D;
collision1D = new Color[background.Width * background.Height];
background.GetData(collision1D);
collision2D = new Color[background.Width, background.Height];
for (int x = 0; x < background.Width; x++)
for (int y = 0; y < background.Height; y++)
collision2D[x, y] = collision1D[x + y * background.Width];
return collision2D;
}
public void CollisionChecker(Color[,] background, ref Vector2 position)
{
Rectangle character;
character.Width = 32;
character.Height = 32;
character.X = Convert.ToInt16(position.X);
character.Y = Convert.ToInt16(position.Y);
int n = 0;
int n2 = 0;
bool collisionDetected = false;
int collisionDetectedX = 0;
int collisionDetectedY = 0;
while (n2 < character.Width)
{
n = 0;
while (n < character.Height)
{
if (background[character.X + n2, character.Y + n] == Color.Black)
{
collisionDetected = true;
collisionDetectedX = n2;
collisionDetectedY = n;
}
n++;
}
n2++;
}
if (collisionDetected == true)
{
collisionDetectedX += Convert.ToInt16(position.X);
collisionDetectedY += Convert.ToInt16(position.Y);
if (background[collisionDetectedX, collisionDetectedY + 2] == Color.Red)
position.Y += 1;
else if (background[collisionDetectedX, collisionDetectedY - 2] == Color.Red)
position.Y -= 1;
else if (background[collisionDetectedX + 2, collisionDetectedY] == Color.Red)
position.X += 1;
else if (background[collisionDetectedX - 2, collisionDetectedY] == Color.Red)
position.X -= 1;
else if (background[collisionDetectedX - 2, collisionDetectedY - 2] == Color.Red)
{
position.X -= 1;
position.Y -= 1;
}
else if (background[collisionDetectedX - 2, collisionDetectedY + 2] == Color.Red)
{
position.X -= 1;
position.Y += 1;
}
else if (background[collisionDetectedX + 2, collisionDetectedY - 2] == Color.Red)
{
position.X += 1;
position.Y -= 1;
}
else if (background[collisionDetectedX + 2, collisionDetectedY + 2] == Color.Red)
{
position.X += 1;
position.Y += 1;
}
collisionDetected = false;
}
}
public void Update(Texture2D background, ref Vector2 position)
{
CollisionChecker(DataMiner(background), ref position);
}
}
うーん、私はまだ10人の担当者がいないので、自分の質問に答えることはできませんが、私はそれを理解しました:
ifステートメントの条件を少し変更しました。elseを削除する必要がありました。変更する必要があるものが見つかったときに、ネストされたifの残りの部分を削除するだけだからです。一度に全部やっていたので、この問題を修正した後、平らな壁が角の近くにあると、壁にぶつかると左右に「滑る」でしょう。私は、collisionDetectedがまだtrueであるかどうかを確認する条件を追加し、変更するたびにfalseに戻しました。
素晴らしい一日をお過ごしください。誰かが私の過ちから学ぶことができることを願っています!
if (collisionDetected == true)
{
collisionDetectedX += Convert.ToInt16(position.X);
collisionDetectedY += Convert.ToInt16(position.Y);
if (background[collisionDetectedX, collisionDetectedY + 2] == Color.Red && collisionDetected)
{
position.Y += 1;
collisionDetected = false;
}
if (background[collisionDetectedX, collisionDetectedY - 2] == Color.Red && collisionDetected)
{
position.Y -= 1;
collisionDetected = false;
}
if (background[collisionDetectedX + 2, collisionDetectedY] == Color.Red && collisionDetected)
{
position.X += 1;
collisionDetected = false;
}
if (background[collisionDetectedX - 2, collisionDetectedY] == Color.Red && collisionDetected)
{
position.X -= 1;
collisionDetected = false;
}
}