XNA Collisions berechnung optimieren

DuffCola

Mitglied
Hi.
ich checke in meiner Tile Engine derzeit so die Collision:

Code:
public bool CheckCollsion(Rectangle bounds)
        {
            bool collision = false;
            for (int x = 0; x < bounds.Width; x++)
            {
                for (int y = 0; y < bounds.Height; y++)
                {
                    if (map.TileMap[(bounds.X + x) / tile_width, (bounds.Y + y) / tile_height] != -1)
                    {
                        collision = true;
                    }
                } // Y
            } // X

            return collision;
            }

map.TileMap ist ein zweidimensionales Int Array, dass den Block Typ speichert.

Wenn mein Spieler jetzt gehen will berechne ich die Bewegung so:

Code:
private void Move(TileLayer layer, Vector2 direction)
        {
            Rectangle new_bounds = new Rectangle(bounds.X + (int)direction.X, bounds.Y + (int)direction.Y, bounds.Width, bounds.Height);

            if(layer.CheckCollsion(new_bounds) == false)
            {
                bounds.X += (int)direction.X;
                bounds.Y += (int)direction.Y;
            }
        }

bounds ist das Retangle, das position und größe des Spielers festlegt.

Ich weiß, dass sehr viel ungünstig im COde ist, aber mir geht es gerade nur darum eine Vernünftige Collisions System hinzubekommen.

Jetzt habe ich das Problem, dass wenn der SPieler sich z.B. mit 20px pro Sekunde bewegt, der SPieler dann manchmal z.B. 10 px vor dem nächsten Tile stehen bleibt(Ist ja auch Logisch).
Nur wie kriege ich, dass hin, dass das nicht passiert.

Und zum anderen, wenn zum beispiel nur auf der X Achse eine Collision statt fuindet, kann der Spieler nicht an der Y Achse weiter ( Acuh das ist llogisch), nur ich weiß nciht, wie ich das verbessern kann.
 
Hallo DuffCola

Das erste Problem kannst du folgendermassen lösen:
- Wenn es eine Kollision gab gibst du die Position der Kollision aus
- Wenn es keine Killision gab gibst du die neue Position aus

Das zweite Problem löst du so:
Du behandelst x und y getrennt und stellst für beide Komponenten die Begrenzung fest, anschliessend gibst du es wie im ersten Punkt erwähnt zurück.
 
Zurück