Kollision



  • Guten Abend,

    zur Zeit bin ich an einem PingPong-Spiel in C# unter XNA. Momentan versuche ich die Kollision zwischen Balken (mein Schläger) und dem Ball abzufragen.
    Das sieht bei mir so aus

    if (this.Ball.Position.X - this.Ball.Sprite.GraphicsDevice.Viewport.Width / 2 <=
        this.Balken.Position.X + this.Balken.Sprite.GraphicsDevice.Viewport.Width / 2)
    {
        this.Ball.Position.X = ViewPort.Center;
    }
    

    Ball.Position ist der Mittelpunkt des Balls, ebenso bei dem Balken.
    .Sprite.GraphicsDevice.Viewport.Width gibt mir die breite des Sprites (meinem Schläger oder des Balls) zurück.
    Was ich also jetzt versuche ist zu prüfen, ob die Kanten (mein Schläger und mein Ball sind viereckig) meiner beiden Figuren aufeinander prallen. Bei dem Ball ist es die linke Kante, bei dem Balken die rechte Kante.
    Mein Problem ist, die if-Anweisung ist scheinbar immer true.
    Wo ist mein Logikfehler?

    Mit freundlichen Grüßen,
    Freaky



  • Ich hab' zwar von XNA keinen Dunst, aber Sprite.GraphicsDevice.Viewport.Width klingt nicht danach, als ob hier die Breite des Sprites zurückkommen würde.
    Eher die Breite des "Viewport". Und das müsste IMO typischerweise entweder 1 oder 2 oder die Breite des Bildschirms in Pixeln sein.
    Wenn letzteres, dann würde es denke ich erklären, wieso die Bedingung immer erfüllt ist.



  • Eieiei, du hast natürlich Recht. Ich muss this.Ball.Sprite.Width schreiben. Danke dir hustbaer.



  • Ich möchte jetzt keinen neuen Thread aufmachen, da es immer noch etwas mit Kollision zu tuen hat.
    Ich habe meinen alten Code weggeschmissen, da er ungünstig war und selbst wenn der Balken nicht dort war, wo der Ball hinfliegt, wurde er zurückgestoßen da die komplette Fläche gezahlt wurde und nicht nur der Balken selbst.

    Also hab ich das folgenderweiße geregelt:
    Durch mein Sprite hab ich ein Viereck erstellt, womit ich prüfen kann, ob der Ball sich in diesem Viereck befindet, wenn ja, kehre ich die Velocity meines Balles einfach um, sprich "-BallVelocityX", damit er wieder in die gegengesetzte Richtung fliegt. Nun möchte ich aber eine Prüfung, wo genau der Ball in diesem Viereck ist. D.h., wenn er in der oberen Hälfte ist, schlägt sich der Winkel weiter nach oben für den Ball aus, damit er nicht, wenn er mit 45° auf den Balken zu fliegt, er wieder mit 45° zurück geht.

    Ich habe mir gedacht, ich mache aus dem einen Viereck, mehrere Viecke, à la:
    http://img694.imageshack.us/img694/5461/viereck.jpg
    und dann prüfe ich jeweils, ob der Ball sich in einem der 4 rechten Vierecke befindet, um dann einen anderen Winkel zu setzen.
    Wie würdet ihr das lösen?



  • Ich hab das bei meinem Pong damals einfach so gelöst, dass ich die Differenz der Y Koordinaten der Mittelpunkte von Schläger und Ball hergenommen habe. Dadurch hab ich dann einen Wert von z.B. -25 bis +25 bekommen.

    Und mit diesem Wert hab ich dann die Y-Geschwindigkeit verändert, einfach nach newYSpeed = clamp(ySpeed + offset * K, minYSpeed, maxYSpeed) .
    Wobei offset besagte Differenz der Mittelpunkte ist und K irgendein Skalierungsfaktor.

    Und dann einfach die Geschwindigkeit in X-Richtung nach dem guten alten Pythagoras neu ausgerechnet.

    Ist ziemlich "crude", aber funktioniert, und ist vor allem auch "stufenlos".



  • Klingt gut, ich versuch es umzusetzen, danke nochmals hustbaer 🙂


Anmelden zum Antworten