2017-05-09 4 views
1

Ich bin ziemlich neu beim Game Maker, und ich habe einige Probleme mit einer Funktion.Ball haftet an Surface Game Maker

Ich mache ein Pong-ähnliches Spiel, und ich renne in ein Problem, wenn der Ball mit der Spitze des Paddels oder den Boden (die kleineren Seiten, nicht auf Gesicht) der Ball und Paddel einfrieren.

Der einzige Code, den ich im Kollisionsereignis des Balls mit dem Paddel habe, ist, die horizontale Geschwindigkeit umzukehren.

hspeed * = -1;

Ich verstehe das Problem, dass, weil der Ball Kontakt mit der Oberseite hat, die horizontale Richtung kehrt, aber es immer noch in Kontakt mit der Oberfläche als die veritcal Geschwindigkeit hat sich nicht geändert, so kehrt wieder und bleibt in einem stecken Endlosschleife.

Ich habe viele Dinge ausprobiert, um ihn zu arbeiten, wie zum Beispiel einen Alarm Einstellung der Ball zu erkennen, ob noch nach einem Rahmen zu berühren und die vertikale Geschwindigkeit (kein Erfolg)

ich auch zu umkehren habe versucht, um zu überprüfen, ob die y-Position der Kugel oben der y-Position der Unterseite des Paddels entspricht (und umgekehrt) und um die vertikale Geschwindigkeit umzukehren, wenn sie wahr ist. aber wieder kein erfolg.

Ich bin sicher, dass diese beiden Methoden funktionieren, wenn der richtige Code verwendet wird, aber ich muss nur falsch ausgeführt werden.

Welche Methode sollte ich verwenden, damit der Ball, wenn er mit der Ober- oder Unterseite kollidiert, nicht stecken bleibt und im Idealfall nur die vertikale statt der horizontalen Geschwindigkeit umkehrt?

Ich bin mir sicher, dass dies eine einfache Lösung hat, aber weil ich neu bin, kann ich es nicht ausarbeiten!

danke!

Antwort

0

Meine Lösung wäre, Instanz zu ändern, wenn der Ball mit dem Paddel kollidiert. Erstellen Sie ein Objekt, das nahezu identisch mit Ihrem aktuellen Objekt ist, und entfernen Sie dann das Kollisionsereignis, setzen Sie das Ereignis create jedoch so, dass es sich mit der umgekehrten Geschwindigkeit bewegt. Der Ball wird sich in die gewünschte Richtung bewegen, bleibt aber nicht hängen. Sie könnten dann prüfen, ob ein leerer Platz vorhanden ist, und falls vorhanden, ändern Sie das Objekt zurück in den ursprünglichen Ball.

+0

Ich würde nicht empfehlen, eine andere Instanz für etwas so einfach zu erstellen. – Timtech

0

Zunächst ist dies eine gute Frage. Ich weiß nicht, wie Sie nach Kollisionen suchen, aber wenn Sie es in einem Schritt-Ereignis (im Gegensatz zu einem Kollisionsereignis oder was auch immer) tun, aber Sie sollten in der Lage sein, für horizontale und vertikale Kollisionen separat zu überprüfen. Zum Beispiel (Ersetzen obj mit dem Namen des Paddle-Objekts):

if (position_meeting(x-1, y, obj) || position_meeting(x+1, y, obj)) { 
    //horizonal collision 
} 
if (position_meeting(x, y-1, obj) || position_meeting(x, y+1, obj)) { 
    //vertical collision 
} 

Dies ergibt den Vorteil, dass der Rand Fall Erkennen, wo er eine Ecke genau trifft, in dem Fall, dass Sie wahrscheinlich beiden Geschwindigkeiten drehen möchten. Sie können auch etwas mehr wie von Ihnen vorgeschlagen tun, auch wenn Sie ein Kollisionsereignis verwenden. Überprüfen Sie einfach, ob der x-Wert des Balls (vorausgesetzt, Sie haben beide Sprites zentriert) kleiner ist als der x-Wert des Paddles plus oder minus seiner Breite }, was auf eine vertikale Kollision hinweisen würde.

Verwandte Themen