Canvas: Sich schneidende Objekte herausfinden

FirstLion

Grünschnabel
Hallo,

ich bin momentan dabei ein kleines Javascript 2D Canvas Spiel zu programmieren. Jetzt habe ich mir gerade
eine Funktion getippt, die mir zunächst zurückliefert ob sich ein Objekt mit einem anderen Objekt überlappt / schneidet.
Jetzt ist mein Problem, dass meine Funktion scheinbar viel zu kompliziert bzw. zu Ressourcen - unfreundlich arbeitet.
Das Script stürzt meistens völlig ab bei 30FPS. Hier der Code:
Code:
function seheObjekte(Objekt) {
  
        var check = false;
        var i = 0;

        for (var e in OBJECTS_) {
            if (e != Objekt.objName) {

                var x2 = OBJECTS_[e].getX();
                var y2 = OBJECTS_[e].getY();
               var x = Objekt.getX();
               var y = Objekt.getY();

                x_max = Objekt.getWidth() + x;
                y_max = Objekt.getHeight() + y;
                var x2_max = OBJECTS_[e].getWidth() + x2;
                var y2_max = OBJECTS_[e].getHeight() + y2;

                var c = false;
                while(x <= x_max && c == false) {
                    if (x >= x2 && x <= x2_max) {
                        c = true;
                    }
                    x++;
                }
                if (c == true) {
                    var d = false;
                    while (y <= y_max && d == false) {
                        if (y >= y2 && y <= y2_max) {
                            d = true;
                        }
                        y++;
                    }
                }

                if (d == true) {
                    check = true;
                }
            }

        }
        return check;
    }

Edit:
Hab den Fehler schon selbst gefunden, warum das Script den PC so strapazierte .. habs im Code oben auch schon angepasst .. Thema ist also schon erledigt (;

MfG Lion (;
 
Zuletzt bearbeitet:
Du prüfst also jedes Objekt, ob es sich mit einem anderen schneidet. Das ist bei sehr vielen Objekten nicht gut. Besser ist es, wenn du versuchst die Anzahl möglicher Kollisionen einzugrenzen.
Du könntest dein Spielfeld beispielsweise in Sektoren einteilen. Wenn die Sektoren deutlich größer als deine Objekte sind kannst du zum Beispiel ausschließen, das zwei Körper kollidieren die nicht im selben oder im benachbarten Sektor sind.
Eine andere typische Methode ist die Hitbox (Boundingbox.) Da wird jedes Objekt durch ein Rechteck repäsentiert, das es komplett einschließt. Kreis geht auch. Für diese kannst du rasch überprüfen, ob sie sich schneiden oder nicht. Alle Objekte die sich nicht schneiden, kannst du bei der Nachfolgenden genaueren Prüfung weglassen.
Für den Kreis ist die Überprüfung am einfachsten.
Du bestimmt die Distanz der Mittelpunkte und die muss größer sein als die Summe der Radien
dist=sqrt((x1-x2)^2 +(y1-y2)^2)
R=r1+r2
if(dist> R) keine Kollision.
Für die genauere Überprüfung könntest du sowas verwenden
http://www.codeworx.org/gamedev_tuts_kollision_pixel.php

Beschreib doch mal für dein Spiel, wie deine Objekte aussehen, und was genau x, y, xmax etc sind.
 
Zuletzt bearbeitet:
Danke erstmal. Also die Einteilung in Sektoren finde ich eine sehr gute Idee (;
Also wollte zunächst mit dieser Funktion mir zunächst eine allgemeine Funktion schaffen, welche mir in einem Array die Objektnamen zurückliefert welche sich kollidieren.( Momentan liefert es zurück ob überhaupt eine Kollision vorhanden ist, aber das ist mir schon klar wie ich das umsetze) Hatte mir jetzt noch nicht so genaue Gedanken gemacht was ein Spiel am Ende rauskommt, dachte zunächst an ein einfaches Tisch-Hockey Spiel. Hier würde es sich dann um Kreise handeln, wo sich deine Kollision - Überprüfung der Kreise anbieten würde.
Also x, y, x2 und y2 stehen in dem Script jeweils für die entsprechende Punkte. x_max,y_max,x2_max und y2_max stehen für den entsprechenden x oder y Wert + die Breite oder eben Höhe um den Definitionsbereich festzulegen. In der Variable OBJECTS_ sind in einem Array die Objekte der "Klassen" gespeichert.
 

Neue Beiträge

Zurück