このチュートリアルhttp://www.tonypa.pri.ee/tbw/tut05.htmlに従って、タイルベースの世界でリアルタイムの衝突を実装しようとしています。
これらのプロパティのおかげで、エンティティの中心座標がわかります。
public float CenterX
{
get { return X + Width / 2f; }
set { X = value - Width / 2f; }
}
public float CenterY
{
get { return Y + Height / 2f; }
set { Y = value - Height / 2f; }
}
次に、すべてのフレームで呼び出されるプレーヤークラスのupdateメソッドに、次のコードがあります。
public override void Update()
{
base.Update();
int downY = (int)Math.Floor((CenterY + Height / 2f - 1) / 16f);
int upY = (int)Math.Floor((CenterY - Height / 2f) / 16f);
int leftX = (int)Math.Floor((CenterX + Speed * NextX - Width / 2f) / 16f);
int rightX = (int)Math.Floor((CenterX + Speed * NextX + Width / 2f - 1) / 16f);
bool upleft = Game.CurrentMap[leftX, upY] != 1;
bool downleft = Game.CurrentMap[leftX, downY] != 1;
bool upright = Game.CurrentMap[rightX, upY] != 1;
bool downright = Game.CurrentMap[rightX, downY] != 1;
if(NextX == 1)
{
if (upright && downright)
CenterX += Speed;
else
CenterX = (Game.GetCellX(CenterX) + 1)*16 - Width / 2f;
}
}
downY、upY、leftX、およびrightXは、それぞれ、最低のY位置、最高のY位置、左端のX位置、右端のX位置を見つける必要があります。チュートリアルではgetMyCorners関数が次のパラメーターで呼び出されるため、+ Speed * NextXを追加します。
getMyCorners (ob.x+ob.speed*dirx, ob.y, ob);
GetCellXおよびGetCellYメソッド:
public int GetCellX(float mX)
{
return (int)Math.Floor(mX / SGame.Camera.TileSize);
}
public int GetCellY(float mY)
{
return (int)Math.Floor(mY / SGame.Camera.TileSize);
}
問題は、壁に当たっているときにプレーヤーが「ちらつく」ことです。コーナーの1つだけに当たる壁に重なる可能性があるため、コーナーの検出は正しく機能しません。何が悪いのかわかりません。チュートリアルでは、ob.xおよびob.yフィールドは私のCenterXおよびCenterYプロパティと同じであり、ob.widthおよびob.heightはWidth / 2fおよびHeight / 2fと同じである必要があります。ただし、それでも機能しません。
ご協力いただきありがとうございます。