PhilippH: Breakout-Spiel und Kollisionsabfrage

Beitrag lesen

Erstmal danke an euch beide!

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);

Danke, das hat mir den richtigen Denkansatz gegeben. Hab' mir erstmal angeguckt, was Arrays sind (bin noch nicht so lange dabei, hätte ich vielleicht mal vorher sagen sollen ;-) und das dann so umgesetzt:

// Array bauen

steineX = new Array()
    steineY = new Array()
    var steinX = 0;
    var steinY = 0;
    for (var v = 0; v < 6; v++)
    {
    for (var i = 0; i < 15; i++)
    {
    steineX.push(steinX);
    steineY.push(steinY);
    steinX = steinX + 50
    }
    steinY = steinY + 26
    steinX = 0
    }

Ist das so, wie du es meintest?

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.

Nein, bekomme ich leider nicht hin; aber für oben und unten klappt es schonmal, denke ich. Wie ich allerdings auch eine Abfrage für links/rechts machen soll, weiß ich nicht. Der Ball soll dann ja auch richtig abprallen... Ihr könnt ja mal den aktuellen Stand der Datei betrachten.

// Kollisionsabfrage
    for (var i = 0; i < 90; i++)
    {
      if (posy < steineY[i]+26 && posy > steineY[i]-16 && posx > steineX[i]-8 && posx < steineX[i]+42 && steineX[i] != "kaputt")
      {
      dy=-dy;
      document.getElementById("ball1").style.top = (posy+dy)+"px";
      document.getElementById(i).style.visibility = "hidden";
      steineX[i] = "kaputt";
      }
    }

Habe vorher garnicht daran gedacht, dass man eine for-Schleife mit if verbinden kann... gut zu wissen!

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

Naja, aber würde sich das ganze dann nicht verschieben? Hab' das jetzt anders gemacht, so gehts auch (steineX[i] = "kaputt";).

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)

[...]
}

Ist das eine if-Bedingung? Kann man das einfach weglassen? Hab' das jetzt mal direkt übernommen:

function move(e)   //Bewegung des Schlägers
    {

e = e || window.event
    x= e.clientX;
    if (x>50 && x<700)
       {
       sx=x-50;
       document.getElementById("racket").style.left = (sx)+"px";
       }
    else if (x<50)
    {
    sx = 0;
    document.getElementById("racket").style.left = (sx)+"px";
    }
        else if (x>700)
    {
    sx = 650;
    document.getElementById("racket").style.left = (sx)+"px";
    }
    }

Der IE schluckts, Firefox meckert immer noch. Die Fehlerkonsole spuckt folgendes aus:

Warnung: Fehler beim Verarbeiten des Wertes für Eigenschaft 'left'.     »» Deklaration ignoriert.
Zeile: 0

und

Fehler: e has no properties
Zeile: 129

Kann ich mir beides nicht erklären. Naja, dieses Problem hat erstmal eine geringere Priorität - bei der Vorlage meines Informatiklehrers hat es auch nicht geklappt und ich muss das am Montag fertig haben. Aber danach würde mich das doch noch interessieren.

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..

Geht leider nicht anders, wenn ich immer nur 1 addieren würde, dann würde der Ball viel zu langsam fliegen. Und die Aktualisierungsrate kann ich nciht noch niedriger setzen. Aber wie gesagt, die Kollisionsabfrage ist erstmal wichtiger.

Habe die aktuelle Datei wieder in den Anhang gehängt.

Vielen lieben Dank nochmal und Gruß, Philipp