Ich vermute, Sie verwenden eine Kachelkarte. In diesem Fall besteht die Lösung darin, sie auf der Grundlage von Kachelindizes durchzuführen. Du musst herausfinden, auf welchem Plättchen sich dein Monster gerade befindet, mit den folgenden Formeln:
int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);
Sobald Sie diese kennen, müssen Sie herausfinden, in welche X-Richtung Sie fahren (um nach Blöcken zu suchen):
int direction = 0;
if (monster.Velocity > 0f)
direction = 1;
if (monster.Velocity < 0f)
direction = -1;
Jetzt haben Sie eine normalisierte X-Richtung, mit der Sie arbeiten können.
Als Nächstes sollten Sie die Blöcke überprüfen, um festzustellen, ob Sie die Richtung ändern sollten:
if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
ChangeDirection(); // we change direction
Sie bekommen die allgemeine Idee. Stellen Sie sicher, dass Sie zurückkehren TileCollision.Impassable
(oder was auch immer), wenn sich die Kachelindizes außerhalb der Karte befinden, um zu verhindern, dass Ihr Programm mit einem ungültigen Index abstürzt, und um zu verhindern, dass Monster die Karte verlassen.
Ich denke, es hängt wirklich davon ab, wie Sie mit Fliesen umgehen, aber dies ist die Lösung, die für mich funktioniert hat.
Basierend auf den Tutorials von http://www.sgtconker.com/ (obwohl die Website nicht verfügbar ist, während ich dies schreibe)