Hallo,
ich bin dabei ein Asteroids-Spiel zu entwickeln. Es klappt ganz gut (Raumschiff bewegen, schießen etc.), allerdings habe ich ein Problem bei der Kollisionsabfrage des Raumschiffes (Rechteck) mit einem Asteroiden (Kreis).
Ich zeichne alles auf einer pictureBox und speichere dabei die Asteroiden in einer Liste (s. Code):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| List<GeometricObject> astroids = new List<GeometricObject>(); foreach (var item in listBox1.Items) { if (item is Asteroid) { astroids.Add((Asteroid)item); } } |
Diese Objekte in der Liste (Asteroiden) vergleiche ich mit dem Raumschiff mit Hilfe der Methode "CheckCollision".
In meiner Basisklasse (GeometricObject) habe ich eine Methode, die um alle gezeichnete Objekte (also um Kreis, Rechteck, Dreieck usw.) ein Rechteck zeichnet, um die Kollisionsabfrage fürs Erste einfacher zu gestalten. Die Kollisionsabfrage habe ich auch in meiner Basisklasse geschrieben.
Mein Code in der Basisklasse:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| public virtual void Boundaries(Graphics g) { g.DrawRectangle(Pens.White, (float)X, (float)Y, (float)Width, (float)Height); } public Collision CheckCollison(List<GeometricObject> otherObjects) { foreach (var item in otherObjects) { var collison = CheckCollison(item); if (collison != null) return (collison); } return null; } public Collision CheckCollison(GeometricObject otherObject) { asteroid = new Asteroid(); rectangle = new Rectangle(); 1. if ((asteroid.X > rectangle.X && asteroid.X < rectangle.X + rectangle.Width) && (asteroid.Y > rectangle.Y && asteroid.Y < rectangle.Y + rectangle.Height)) { return new Collision() { Object1 = this, Object2 = otherObject }; } 2. if ((asteroid.x > this.X && asteroid.X < this.X + Width) && (asteroid.Y > this.Y && asteroid.Y < this.Y + Height)) { return new Collision() { Object1 = this, Object2 = otherObject }; } return null; } |
Wie man in der unteren
CheckCollision-Methode sieht, habe ich schon einiges ausprobiert.
Mein Problem:
In 1. werden die Werte der einzelnen Objekte irgendwie nicht erfasst, wodurch die Position von den Objekten (x und y) immer auf 0 stehen...
In 2. bekomme ich zwar mit "this.X" die Koordinaten des Rechteckes vom Raumschiff (klar, weil ich ja auch in dieser Klasse das umschließende Rechteck zeichne), aber bei "asteroid.X" und bei "asteroid.Y" steht immer noch 0...
Wie kann ich diesen Wert (also den Wert von dem oberen linken Punkt des Rechteckes, das den Asteroiden umschließt) bekommen?
Danke schon mal!
Moderiert von Th69: C#-Tags hinzugefügt