Christian S.: Breakout-Spiel und Kollisionsabfrage

Beitrag lesen

Hi

Die Position des Balls ist mit Posx und Posy beschrieben. Nach dem Aufprall soll der Stein verschwinden (ich wollte da dann einfach visibility per getElementById auf hidden setzen) und der Ball die Richtung ändern.
Wie könnte ich jetzt eine Kollisionsabfrage von Ball und Steinen realisieren?

Du müsstest während einer Bewegung des Balls prüfen, ob sich eine seiner Kanten an einer Kante eines Steins befindet.

Dazu würde ich die Position (und Dimension) eines jeden Steines in einem Array als Objekte halten:

var steine = [];
var stein = {left: leftWert top: topWert};
steine.push(stein);

Dimension brauchst du eigentlich ja nicht, da sie immer gleich ist. Die werte berechnen sich aus den Laufvariablen deiner Schleifen.

Die Abfrage, ob die linke Kante (left) des Balls an die rechte Kante eines Steins (left + width) stößt, solltest du hinkriegen.
Und dass dann in einer for-Schleife, für alle noch übrigen Steine.

Wurde einer getroffen, würde ich den Stein aus dem Array entfernen (steine.splice(index, 1)).

Zweites Problem. Das ganze funktioniert nur im Internet Explorer. Im Firefox
Browser lässt sich der Schläger nicht bewegen, vermutlich wegen der Ermittlung der Mausposition mit "x=window.event.x;", was ja laut Selfhtml im FF nicht möglich ist. Ich weiß zwar, dass das irgendwie mit "clientX" geht, habe allerdings keine Ahnung, wie das geht, auch nach dem Lesen des entsprechenden Eintrages. "x=clientX" funktioniert jedenfalls nicht.

Ja, das Event Modell vom IE weicht vom Standard ab. Normalerweise bekommt man das event Objekt implizit als Parameter an die Funktion übergeben, beim IE steckts in window.event.

Jedoch kennt auch IE die Eigenschaft clientX. Diese solltest du auch dort verwenden.

function move(e)
    {
e = e || window.event;
    x= e.clientX;
    if (x>50 && x<700)

[...]
}

Letztes Problem (bis jetzt ;-)) wäre dann noch, dass manchmal der Ball über den Schläger "schliddert", was ich mir überhaupt nicht erklären kann.

Ich vermute es liegt daran, dass du zuviel dy auf die top position des Balls addierst. Dann fragst du ab:
if (posy > 391)

Wenn die Position dann 392 ist, schliddert er durch. Irgendwie so jedenfalls... Ich blicke deinen Code auch nicht vollständig..

Gruß!