2011-01-04 5 views
0

Ich versuche ein Air-Hockey-Spiel zu erstellen, in Flash mit AS3.Erkennen von Kollisionen in Flash ... oder eine bessere Methode

Im Moment benutze ich eine Enter-Frame-Funktion, um die Positionierung der 3 Objekte, 2 Paddel und eine Kugel zu überprüfen, dann prüft sie, ob sie in Kontakt sind, wenn sie es sind, löst sie eine Kollision aus Funktion.

Allerdings überprüft es jedes Mal, wenn der Rahmen geladen wird, und bei 25 fps ist das ziemlich viel und die App bleibt zurück.

Irgendwelche Ideen oder bessere Möglichkeiten, dies zu tun?

Vielen Dank im Voraus.

+0

Wie ist der Rest Ihres Spiels aufgebaut? Haben Sie einen einzigen Renderzyklus? Sind die Spielsprites komplex oder haben sie ein einfaches Box/Circle-Zeichen? Wie berechnen Sie die Kollisionserkennung? Verwenden Sie die integrierten Funktionen oder machen Sie Ihre eigene Mathematik? – weltraumpirat

+0

Im Moment sind die Sprites, sehr einfach, drei Kreise. Kollisionserkennung, habe ich selbst, es überprüft den Abstand zwischen den beiden Kreisen, sehen, wenn es gleich dem Radius der beiden Kreise ist. – S1syphus

+0

Ich würde nicht denken, dass das Ausführen jedes Frames sehr teuer wäre, da es nur ein paar Objekte sind. Ich würde bei der Verwendung der Radiusberechnungen bleiben, aber in Bezug auf Optimierungen können Sie sicherstellen, dass Sie Ihre Vergleichslogik dort verlassen, wo es sinnvoll ist. IE) wenn die Geschwindigkeit aller Gegenstände 0 ist. Wenn der Puck auf der linken Hälfte ist, keine Notwendigkeit, das rechte Paddel zu überprüfen (wenn du an den Air Hockey Regeln bleibst!), Etc .. – gthmb

Antwort

1

Zwei Pythagoras-Aussagen verlangsamen Ihr Spiel? Bei 25 Bildern pro Sekunde? Etwas stimmt nicht - das sollte nicht der Fall sein.

Entfernen Sie die Kollisionserkennung vollständig und überprüfen Sie, ob Sie Ihre 25fps zurückbekommen, und fügen Sie dann Anweisungen jeweils eine Zeile hinzu, bis die Verlangsamung wieder auftritt.

Überprüfen Sie, dass Sie Ihren Kollisionscode nicht mehr als einmal (gut, zweimal) pro Frame aufrufen.

Denken Sie daran, dass Sie Test für Kollision ohne Math.sqrt mit:

function circlesTouching(circle1:Point, circle1Radius:Number, circle2:Point, circle2Radius:Number):Boolean { 
    var dx:Number = circle1.x - circle2.x; 
    var dy:Number = circle1.y - circle2.y; 
    var minDist:Number = circle1Radius + circle2Radius; 
    return (dx*dx) + (dy*dy) < (minDist * minDist); 
} 

(Sie noch sqrt zu Entschlossenheit brauchen die Kollision aber das sollte ziemlich selten sein.)

jedoch in Meine Erfahrung, obwohl Math.sqrt ist der langsamste Teil von Pythagoras, es ist immer noch schnell genug, um zwei Anrufe pro Bild bei 25 Bildern pro Sekunde zu verwalten. Es klingt wie etwas anderes ist falsch.

1

Wenn Sie regelmäßig etwas überprüfen müssen, ist das enterFrame-Ereignis ein geeigneter Mechanismus, um dies zu tun.

Sie erwähnen nicht, wenn Sie die integrierten Hit-Test-Funktionen verwenden oder nicht, also dachte ich, ich würde sie erwähnen: hitTestObject und hitTestPoint.

+0

Benutzte hitTestObject nicht, da es das enthält Bounding Box ... weil es Kreise waren, dachte man, es wäre einfacher zu überprüfen, ob die Entfernung die Summe des Radius der beiden Kreise ist – S1syphus

1

Haben Sie einen Timer versucht?

var timer:Timer = new Timer(250); // 4 times a second 

timer.addEventListener(TimerEvent.TIMER, onTimer); 
timer.start(); 


private function onTimer(ev:TimerEvent):void 
{ 
    checkCollision(); 
}