| |||||||
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) |
| [+] Registriert seit: Dec 2002 Ort: cologne
Beiträge: 2.271
| Lecker Spaghetti
Ich suche ein Pattern für eine AS3 Physicsengine. Die Physicsengine unterstützt bislang zahlreiche Hindernisse und bewegliche Kreise. Alle Hindernisse haben eine Funktion, mit der ich eine dynamische Intersektion mit einem bewegten Kreis berechnen kann. Jetzt möchte ich die Engine um weitere bewegliche Objekte (Partikel,Kreis,Poly,Flipper,etc.) erweitern. Dafür brauche ich weitere Methoden, um die dynamische Intersektion zu berechnen. Und zwar paarweise. Eine Resolver Klasse, die zur Auflösung der Simulation vorhanden ist, speichert alle beweglichen und unbeweglichen Objekte in 2 Arrays (movables,statics). Jetzt ist die Frage, wie ich innerhalb der beiden Loops auf die jeweiligen Methoden komme, welche die dynamische Intersektion berechnen. Das soll möglichst nachvollziehbar (OO), aber letztlich natürlich auch performant laufen. #A: Eine Möglichkeit wäre, den Methodennamen aus Strings zusammenzusetzen. Dabei hätten alle Objekte einen UniqueString. Zum Beispiel: 'MovableParticle' und 'StaticCircle'. Innerhalb des Loops könnte ich dann den Methodennamen zusammenbauen: eval( StringA + StringB ). Ich weiss, dass eval nicht mehr existiert in AS3, aber mit der Array Syntax ('[]') könnte das gehen. Nachteil: Die Typisierung geht verloren. #B: Eine andere Idee ist, allen Objekten Bits zu vergeben. Im Loop verknüpfe ich die beiden Bits (performant) 'bitA | bitB' und mache eine switch Anweisung mit allen Cases, die möglich sind und rufe dann die entsprechende Methode auf. Nachteil: Ich kenne die Reihenfolge nicht. Entweder ich müsste immer beide Möglichkeiten in 2 Methoden implementiert haben oder ich tausche die beiden Objekte, wenn die Signatur eine andere Reihenfolge vorgibt. #C: Man arbeitet mit instanceof bzw. jetzt 'is'. Letztendlich ist das in etwa wie #B. ##: Die Lösungen befriedigen mich nicht. Sie sind allesamt Hacks und erzeugen langen SpaghettiCode. Am schicksten wäre zu Begin eine Anmeldung aller Objektpaare mit deren Methoden an einem MethodTable. Genau dafür bräuchte ich einen Hint. |
| | |
| | #3 (permalink) |
| [+] Registriert seit: Dec 2002 Ort: cologne
Beiträge: 2.271
|
So gefällt mir das sehr gut: Code: public function nextFrame(): void
{
var objA: IDynamicIntersectionTestAble;
var objB: IDynamicIntersectionTestAble;
var intersection: DynamicIntersection;
for each( objA in movables )
{
if( objA is MovableParticle )
{
for each( objB in statics )
{
intersection = objB.dIntersectMovableParticle( MovableParticle( objA ) );
}
for each( objB in movables )
{
if( objA == objB ) continue;
intersection = objB.dIntersectMovableParticle( MovableParticle( objA ) );
}
continue;
}
if( objA is MovableCircle )
{
for each( objB in statics )
{
intersection = objB.dIntersectMovableCircle( MovableCircle( objA ) );
}
for each( objB in movables )
{
if( objA == objB ) continue;
intersection = objB.dIntersectMovableCircle( MovableCircle( objA ) );
}
continue;
}
// [...]
}
} |
| | |
| | #4 (permalink) |
| flachzange Registriert seit: Jun 2003 Ort: berlin
Beiträge: 3.932
|
Rein von der Aufgabe her würde der Chain of Responsibility gut passen. Allerdings bräuchtest du für einen direkte umsetzung für jede Intersektionsmöglichkeit ein Objekt und bei 10 möglichkeiten könnten bis zu 10 Aufrufe stattfinden bis der richtige Algorithmus gefunden ist. Dazu kommt das die CoR nicht umbedingt super eingängig ist, dafür aber extrem Flexibel. Also wie gehts? Du packst jeden Form<->Form Algorithmus in eine Klasse. Diese Klassen werden geschachtelt. Mit 'intersect' wird das äußerste Objekt getestet ob es FormXY auflösen kann, ist das nicht der Fall dann wird das nächste getestet. PHP-Code: neuen Algo anpassen musst und dein Anwendungscode da auch relativ wenig von mitbekommt. Du kannst das ganze sehr flexibel über das Zusammenstecken der Objekte erweitern. Du könntest das ganze auch ohne die Schachtelung (dekorierung) Lösen indem du die Objekte in ein Array packst. siehe 7.6
__________________ |
| | |
| | #5 (permalink) |
| [+] Registriert seit: Dec 2002 Ort: cologne
Beiträge: 2.271
|
Das scheint mir eine AS2 Implemention zu sein. Aber dennoch. Ich werde meinen Ansatz weiterverfolgen. Es sieht ganz so aus, als wäre das eine schnellere Möglichkeit von allem, was ich wollte. Denn durch die Trennung von Movables und Statics habe ich schon eine Vorsortierung gemacht, die mir viele Abfragen erspart. Letztendlich bleiben nur für die Movables Fallunterscheidungen nach dem Typ übrig, da Statics vs Statics keinen Sinn machen. Der Spaghetti Effekt bleibt in Grenzen, weil es nicht so viele unterschiedliche Movables geben wird und der auszuführende Code sich auf einen Methodenaufruf beschränkt. Bleibt noch die Performance-Frage, ob ein 'is' schneller ist als ein Integer zu testen, welches als 'const' im Objekt liegt. Das werde ich sehen, wenn die Engine wieder funktioniert und ich mit vielen Objekten testen kann. Vielen Dank auf jeden Fall. [BASS] |
| | |
| | #6 (permalink) | ||
| flachzange Registriert seit: Jun 2003 Ort: berlin
Beiträge: 3.932
| Zitat:
Zitat:
__________________ | ||
| | |
| | #7 (permalink) | ||
| [+] Registriert seit: Dec 2002 Ort: cologne
Beiträge: 2.271
| Zitat:
Zitat:
| ||
| | |
| | #8 (permalink) |
| flachzange Registriert seit: Jun 2003 Ort: berlin
Beiträge: 3.932
|
Das OO bischen mehr arbeit als Spaghetti macht sollte klar sein. Wenn du das ganze mit SVN o.ä. pflegen würdest könnte ich ja mal versuchen eine Lauffähige Version umbauen. Würde mich auf jeden Fall mal interessieren ob man das nicht auch mit halbwegs ordentlichen OO performant hinbekommt.
__________________ |
| | |
| | #10 (permalink) |
| flachzange Registriert seit: Jun 2003 Ort: berlin
Beiträge: 3.932
|
Naja wenn ich das jetzt umstricke und du Zeitgleich daran rumschraubst, wird es wieder ein Akt das ganze wieder zusammen zu friemeln. Ich würde lieber mal vorbeikommen, dann könnten wir das zusammen umsetzen.
__________________ |
| | |
| | #12 (permalink) |
| Flashaholic Registriert seit: Feb 2003 Ort: Berlin
Beiträge: 1.459
|
Moin würden dir in einem solchen fall nicht auch reflection sachen helfen ??? dies kann mann ja nun für anonyme objecte gut gebrauchen. Rein theoretisch. weil das if konstrukt das du dir da aufbaust wäre ja eher unschön. mir fallen da zb. die methoden string flash.utils.getQualifiedClassName( object ) object flash.utils.getDefinitionByName(name ) du könntest nen Array mit representative klassennamen als keys nutzen und dahinter dann eine Klassenreferenz. mal einfach nen theoretisches codebeispiel PHP-Code: mfg alex
__________________ TVNEXT Solutions |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |