| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| alte pfeife Registriert seit: May 2003 Ort: Kassel
Beiträge: 1.222
| Breakout Clone - Kollision
Hallo FF, ich bin gerade dabei einen Breakout-Clone zu programmieren. Klappt auch alles wunderbar soweit... Levels werden aus einer XML geladen und auch die Steine werden korrekt platziert. Bewegungen von Ball und Pedal besteht auch schon, jedoch hab ein bisschen Probleme mit der korrekten! Kollision. Alle meine Steine liegen in einem Array und habe eine X&Y Koordinate. Ich prüfe jetzt im EnterFrame ob der Ball rechts, links, oben oder unten den Stein trifft. PHP-Code: PS: Ist es performanter einen Timer zu benutzen anstatt eines EnterFrames? lg |
| | |
| | #2 (permalink) |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 16.326
|
seltsamer weisse passiert das allen ;-) wenn sich der ball jeweils weiter bewegt, als deine mauer dick ist, dann springt er drüber. entweder du musst öfters berechnen um kleinere weiter zu erhalten oder du musst die geschwindigkeit reduzieren oder du musst den befehl 'intersects' kicken und die schnittpunkte linie (ballbewegung) mit linie (mauer) selbst berechnen. nur mit intersects ermittelst du auch nicht, wie weit dein ball eindrinnt bzw. ob er die mauersteine seitlich trifft; was dein 'komisch "abgeleitet" ' erklärt. http://www.seibsprogrammladen.de/fra.../Schnittpunkte http://www.seibsprogrammladen.de/fra...piel/Kleinkram <-- man muss ja auch mal angeben dürfen ;-) http://www.seibsprogrammladen.de/fra.../Spiel/Engines <-- PinLines-Engine schnittpunkt berechnen, den reststahl abbrallen, damit wieder schnittpunkt berechnen, bis kein rest mehr da ist.
__________________ die ultimative antwort auf alle programmierfragen: der debugger mfg h.g.seib www.SeibsProgrammLaden.de Geändert von hgseib (18-04-2011 um 13:31 Uhr) |
| | |
| | #3 (permalink) |
| alte pfeife Registriert seit: May 2003 Ort: Kassel
Beiträge: 1.222
|
okay danke für die hinweiße ![]() ich glaub ich werde nicht darum kommen mir die Schnittpunkte selbst zu berechnen, ich glaube das ist die beste Alternative von den 3en ![]() eine Frage noch, wie hast du es in deinem Beispiel "mauer" gelöst? |
| | |
| | #4 (permalink) |
| alte pfeife Registriert seit: May 2003 Ort: Kassel
Beiträge: 1.222
|
ich habe mal probiert nun dein Linie-Linie Schnittpunkt Beispiel zu verstehen. Ich hab aber dazu ein paar Fragen. Wann weiß denn die Methode wenn sich 2 Linien gekreuzt haben ? Und bei unserem Beispiel, woher wüsste er dann ob er links, rechts, oben oder unten getroffen wurde. Und da ich 4 Punkte habe, müsste ich das 4x berechnen für jede Seitenline 1x oder wie ![]() Ich blick es noch nicht so richtig. Ich bräuchte mal ein Beispiel anhand eines Arrays von bricks mit einem Ball. Geändert von muschko (22-04-2011 um 19:38 Uhr) |
| | |
| | #5 (permalink) |
| Keine Panik Registriert seit: Apr 2010 Ort: Düsseldorf (im ernst)
Beiträge: 1.869
|
für ein klassisches Breakout brauchst du doch "nur" eine Kollisionsberechnung linie-Rechteck, komplexer sind die Formen doch nicht. hier mal eine zweite Demo (swf && fla (CS4) sind im Anhang) der Kern des ganzen ist folgende Funktion, und eine Erweiterung hiervon: winkel zu xy && länge Bildschirmrand PHP-Code: die Variable f hab ich extra herausgestellt, da sie ebenfalls die Dauer bis zum treffer ausgibt, in frames (bei gleichem Vektor) Geändert von thomas_E (23-04-2011 um 00:17 Uhr) |
| | |
| | #7 (permalink) |
| whatever Registriert seit: May 2008
Beiträge: 419
|
hätte da auch noch was im angebot ![]() war primär für sichtbarkeitstest entwickelt und ist schon ein tick älter aber seit dem für solche geschichten bei mir im einsatz, ist allerdings schon komplett OO umgesetzt und schlanker als die funktion von thomas_E ![]() die klasse AABB (axis-aligned bounding box / achsen-ausgerichtete bounding box) verwaltet ein rechteck, mit der methode detectCollision() kann ein linienschnitttest mit dem rechteck durchgeführt werden. die methode detectCollision() erwartet als ersten parameter ein objekt mit den eigenschaften x / y für die position sowie vx / vy für die geschwindigkeit / sichtweite etc, der zweite parameter ist ein array in dem das kollisionsobjekt eingetragen wird falls eine kollision stattfindet. das kollisionsobjekt (klasse CollisionData) enthält sämtliche informationen wie das getroffene objekt, welche seite getroffen wurde, der genaue schnittpunkt und die distanz. besonders die distanz ist enorm nützlich, damit kann man sortieren, den reststrahl berechnen, die krafteinwirkung bestimmen usw. ActionScript:
verwendung: ActionScript:
das schöne an der methode ist das man innerhalb eines zyklus gleich alle potenziell getroffenen objekte zurück kriegt und sortieren kann, so kann man den ball zb. erst am zweiten block abprallen lassen und den zuerst getroffenen einfach nur zerstören (für power-ups etc). demo maus bewegen, klicken um den linienursprung neu zu setzen Geändert von ING (24-04-2011 um 14:41 Uhr) |
| | |
| | #8 (permalink) | |
| alte pfeife Registriert seit: May 2003 Ort: Kassel
Beiträge: 1.222
| Zitat:
erstmal ein riesen "Danke" an deine Klasse. Echt super, so kann ich das nämlich gleich öfters mal benutzen. Jedoch habe ich noch ein Problem. Und zwar hab ich nun eine Liste mit AABB Objects ( Meine Steine ) und teste diese auf Kollisionen mit meinem Ball ( ganz normaler MovieClip ). Oben und Links funktioniert die Kollision super, aber Rechts und Unten geht der Ball mindestens zuf Hälfte in den Stein hinein und prallt dann ab. Ich denke du kannst mir helfen woran das liegen könnte. Danke nochmal an alle ![]() muschko | |
| | |
| | #9 (permalink) | |
| whatever Registriert seit: May 2008
Beiträge: 419
| Zitat:
simpler workaround: einfach die bounding box entsprechend vergrößerst, ein ball.width dazu addieren reicht meistens schon. du solltest auch berücksichtigen das die x und y werte die der klasse übergeben werden den mittelpunkt darstellen und nicht die linke obere ecke | |
| | |
| | #10 (permalink) |
| alte pfeife Registriert seit: May 2003 Ort: Kassel
Beiträge: 1.222
|
Also die Steine erstelle ich nun so: ActionScript:
Jetzt müsste ich es quasi so ändern, dass die Breite des Balls berücksichtigt wird: ActionScript:
Leider funktioniert das nicht so wie ich möchte. Denn manchmal werden in einer kompletten Steinreihe, nur von links und rechts "treffbar". Alle anderen funktionieren dann tabellos ![]() Muss der Ball eigentlich auch ein AABB Object sein oder reicht da ein normaler MC? Danke nochmal für deine Hilfe. Geändert von muschko (30-04-2011 um 18:11 Uhr) |
| | |
| | #11 (permalink) |
| whatever Registriert seit: May 2008
Beiträge: 419
|
also der ankerpunkt der objekte spielt auch eine rolle, wenn der überall zentriert ist sollte das aber eigentlich klappen ![]() bin grad dabei die breakout spielmechanik nachzubauen und hab dabei auch bemerkt das es vorkommen kann das manchmal eine reihe aus einer bestimmten richtung ignoriert wird. problem ist wenn die "bewegungslinie" des balls pixelgenau auf die andere linie trifft, dabei kann eine kollision übersehen werden, umso langsamer die bewegung umso höher die wahrscheinlichkeit. wie eingangs erwähnt, war das für sichtbarkeitstest entwickelt, da fiel mir das nie auf. hab das problem aber schon behoben, infolge dessen model ich das ganze grad aber nochmal etwas um und kann dir in den nächsten tagen bestimmt eine überarbeitete version anbieten wo das problem behoben ist |
| | |
| | #12 (permalink) | |
| alte pfeife Registriert seit: May 2003 Ort: Kassel
Beiträge: 1.222
| Zitat:
![]() Genau was du beschrieben hast ist bei mir aufgetreten, das manche Steine nur von bestimmten Seiten getroffen werden konnten. Sobald ich das dann fertig habe, kann ich dir ja mal meine Version von Breakout zeigen ... "Breax" ![]() Grüße muschko | |
| | |
| | #13 (permalink) | ||
| whatever Registriert seit: May 2008
Beiträge: 419
|
so, das ganze wurde nun einem ordentlichen refactoring unterzogen es sollte aber alles wie bisher funktionieren...
ich hab die breakout demo nur auf die schnelle umgesetzt, besonders das kollisionshandling (klasse: Ball, methode: projectCollision) hab ich nur hingeschlampt, die "engine" übernimmt zwar die kollisionserkennung aber das handling bleibt einem selbst überlassen. normalerweise kommen hier die geschichten wie ausfallswinkel & reststrahl berechnen, reststrahl auf weitere kollisionen testen usw. zum einsatz, das ist umso wichtiger umso kleiner der abstand zwischen den objekten wird. das gute ist das das CollisionData objekt alle nötigen daten verfügbar macht, auch auf die daten der getroffenen seite (Ray objekt) kann man zugreifen, über kollisionsDaten.target.rays[kollisionsDaten.side].angle erhält man zb. den winkel der getroffenen seite. über die Ray klasse (vergleichbar mit einem Vector2D objekt) kann man das recht unkompliziert lösen, denk ich. werd das bei nächster gelegenheit auch nochmal in angriff nehmen, bis dahin überlasse ich jedem diesen spaß, bin aber für lösungen immer offen ![]() Breakout Demo (3kb, breakout endlosschleife) Download (3kb, demo code und kollisionerkennung (im package ing.bounds)) -------------------------------------------------- Zitat:
![]() lösung war denkbar einfach, die linie einfach um 1 pixel verlängern, dadurch entsteht zwar die möglichkeit auf bis zu einem pixel ungenauigkeit aber ich denke die ist verschnmerzbar ![]() Zitat:
| ||
| | |
| | #14 (permalink) |
| + Zimt & Zucker Registriert seit: Mar 2006 Ort: hinterm Mond gleich links
Beiträge: 2.043
|
Warum eigentlich nicht auf sowas wie box2d zurück greifen?
__________________ anbei Grüße vom milchreis: Viva la [Silb] [Von null auf Flash in einem Klick.] <<< klick |
| | |
| | #15 (permalink) |
| alte pfeife Registriert seit: May 2003 Ort: Kassel
Beiträge: 1.222
| Hat den ganz einfachen Hintergrund, dass ich das erst selber schreiben wollte und gar nicht gesehen habe, dass es doch relativ umfangreich ist. Auch den ganzen Overhead von einem großeren Framework wollte ich mir sparen. Ich wäre dann als nächstes aber warscheinlich zu Box2D oder FlashPunk gegangen, wenn mir hier keiner geholfen hätte. Danke nochmal an alle |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Clone oder so von Strasse und Autos | DennisG | ActionScript 3 | 0 | 08-07-2010 21:28 |
| dr. mario clone | onip | ActionScript 2 | 1 | 02-12-2009 08:29 |
| blingee clone | Senhor | ActionScript 2 | 1 | 09-01-2008 18:59 |
| Struktur BustAMove Clone | André Michelle | ActionScript 3 | 34 | 23-02-2006 15:45 |