XNA: Rectangle.Intersects()



  • Hey,
    für mein 2D-Spiel, das ich momentan programmiere, habe ich mir eine Terrain.cs erstellt um Blöcke zu zeichnen, auf denen der Spieler laufen kann.
    In dieser werden lediglich Position, Textur und ein Rechteck an der Position der Textur für die Kollision festgelgt.

    public class Terrain
        {
            public Vector2 position;
            public Texture2D texture;
            public Rectangle boundingBox;
    
            public Terrain(Texture2D Newtexture, Vector2 newPosition)
            {
                position = newPosition;
                texture = Newtexture;
                boundingBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
            }
    
            public void Draw(SpriteBatch spriteBatch)
            {
                    spriteBatch.Draw(texture, position, Color.White);    
            }
         }
    

    Um die ganzen Blöcke zu managen habe ich eine Liste mit Terrain in der Game1.cs erstellt.
    Dazu habe ich eine Methode die abhängig vom Typ und der Menge die man eingibt Blöcke in einer Reihe zeichnet und somit auch die "Kollisionsboxen".

    private void AddBlocks(Vector2 newPosition, int amount, string type)
            {
                Texture2D texture = null;
    
                if (type == "earth")
                {
                    texture = Content.Load<Texture2D>("Block_Earth");
                }
    
                for (int i = 0; i < amount; i++)
                {
                    terrainList.Add(new Terrain(texture, new Vector2(newPosition.X + i * texture.Width, newPosition.Y)));
                }
            }
    

    Der Spieler fällt die ganze Zeit nach unten; Dafür gibt es die Variable "gravity = 2" in der Player.cs. (-> player.position.Y += gravity)

    Trifft der Spieler nun auf einen Block (d.h. die KollisionsRechtecke der Beiden berühren sich) wird die gravity auf 0 gesetzt, sodass er stehen bleibt.

    foreach (Terrain terrain in terrainList)
                {
                    if (terrain.boundingBox.Intersects(player.boundingBox))
                    {
                        player.gravity = 0;
                    }
                    else
                    {
                        player.gravity = 2;
                    }
    
                }
    

    Starte ich nun das ganze und erstellt z.b. 10 Blöcke in einer Reihe, bleibt der Spieler nur auf dem 9. und 10. stehen, durch den Rest fällt er durch.
    Ich habe das ganze mal durchgetestet und verschiedene Anzahlen an Blöcken gezeichnet und jedesmal erkennt er die Kolission nur bei den letzten beiden Blöcken.
    Die Rechtecke (boundingBox) sind bei jedem Block vorhanden, weil ich sie mal grün einzeichnen hab lassen.

    Kann mir vielleicht jemand weiterhelfen.
    Danke 👍



  • D.J. schrieb:

    Starte ich nun das ganze und erstellt z.b. 10 Blöcke in einer Reihe, bleibt der Spieler nur auf dem 9. und 10. stehen, durch den Rest fällt er durch.
    Ich habe das ganze mal durchgetestet und verschiedene Anzahlen an Blöcken gezeichnet und jedesmal erkennt er die Kolission nur bei den letzten beiden Blöcken.

    Dein Problem ist ein Logikfehler. -> Für jeden Block, der nicht mit dem Spieler kollidiert, wird Gravity auf 2 gesetzt.
    Da du diese Logik eben auf jeden Block anwendest ändert sich Gravity ständig auf 2.

    Und das ganze funktioniert nur beim letzten Block wie gewollt, weil es nach dem letzten keinen anderen Block gibt, der die Gravity unbeabsichtigt auf 2 setzten kann.

    Hoffe meine Erklärung macht halbwegs Sinn, es ist ziemlich spät.
    Lg


Anmelden zum Antworten