Ich versuche, diesem Tutorial http://www.tonypa.pri.ee/tbw/tut05.html zu folgen , um Echtzeitkollisionen in einer kachelbasierten Welt zu implementieren.
Ich finde die Mittelkoordinaten meiner Entitäten dank dieser Eigenschaften:
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; }
}
Dann habe ich in meiner Update-Methode in der Player-Klasse, die jeden Frame heißt, diesen Code:
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 und rightX sollten jeweils die niedrigste Y-Position, die höchste Y-Position, die X-Position ganz links und die X-Position ganz rechts finden. Ich füge + Speed * NextX hinzu, da im Tutorial die Funktion getMyCorners mit folgenden Parametern aufgerufen wird:
getMyCorners (ob.x+ob.speed*dirx, ob.y, ob);
Die Methoden GetCellX und 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);
}
Das Problem ist, dass der Spieler beim Auftreffen auf eine Wand "flackert" und die Eckenerkennung nicht einmal richtig funktioniert, da sie Wände überlappen kann, die nur eine der Ecken treffen. Ich verstehe nicht, was los ist. Im Tutorial sollten die Felder ob.x und ob.y mit meinen CenterX- und CenterY-Eigenschaften übereinstimmen, und ob.width und ob.height sollten mit Width / 2f und Height / 2f übereinstimmen. Es funktioniert jedoch immer noch nicht.
Danke für Ihre Hilfe.