| |||||||
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) |
| Neuer User Registriert seit: Feb 2011
Beiträge: 30
| Status verwalten/ändern
Hi, ich bins mal wieder mit einer Design-Frage... Stellen wir uns mal ein Adventure-Spiel vor. In dem Spiel gibt es eine verschlossene Tür. Wenn der Spieler drauf klickt wird eine Sprachfrequenz abgespielt, dass die Tür noch verschlossen ist. Erst wenn er einen geheimen Knopf gedrückt hat soll die Tür beim Klick aufschwingen. Das war jetzt nur exemplarisch eine Situation, wo der Zustand eines Objekts (Tür offen/geschlossen) vom Zustand eines anderen Objekts abhängt (Geheimknopf nicht gedrückt/gedrückt). Wie würdet ihr den Code zur Verwaltung schreiben? Meine Idee: Die Tür kennt den Geheimknopf nicht direkt sondern geht einen Umweg über einen Status-Manager. Der Statusmanager hört auf Events von allen Objekten. Wenn er dann mitbekommt dass der Geheimknopf gedrückt wurde informiert er die Tür darüber, die dann ihren Zustand von verschlossen auf geöffnet ändert. Was haltet ihr davon? Viele Grüße! |
| | |
| | #2 (permalink) | |
| Keine Panik Registriert seit: Apr 2010 Ort: Düsseldorf (im ernst)
Beiträge: 1.868
| Zitat:
PHP-Code: | |
| | |
| | #4 (permalink) |
| Flash-Designer Registriert seit: May 2006 Ort: Wiesbaden
Beiträge: 6.165
|
Ich glaube Du denkst da viel zu kompliziert. Im Endeffekt geht es doch nur darum, dass eine Instanz ein Ereignis in einer anderen Instanz mitbekommt ohne, dass sich die beiden Instanzen kennen. Man benötigt also einen Mittler zwischen beiden, der idealerweise auch keine festen Referenzen auf beide enthält, aber von überall aus ansprechbar ist. Und genau für diesen Zweck habe ich mir eine Art toten Briefkasten gebaut, der als Singleton (*wegduck*) global ansprechbar ist (*hinterDem SchrankVersteck*) und Ereignisse von Objekten weiterreicht, ohne das er sie oder sie sich kennen müssen: PHP-Code: P.S.: Ich überleg mir gerade die Klasse wirklich in DeadLetterOffice umzubennen
__________________ Viele Grüße // Martin Martin Kraft // Interaktionsdesign Hilfreiche Websites: // Hilfe zur Adobe Flash Plattform // ActionScript 2 Referenz // ActionScript 3 Referenz // ActionScript 3 Arbeitshandbuch // weitere Flash Ressourcen Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da! Geändert von Martin Kraft (11-05-2011 um 19:28 Uhr) |
| | |
| | #5 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
|
Verstehe ich nicht, es sind doch anscheinened immer 2 Instanzen, die miteinander assoziiert werden. Da braucht man keinen globalen EventDispatcher, da die Instanzen sich eh kennen. Man bräuchte eigentlich nur zwei Interface Code: package fs.secrets
{
public interface IAliBaba
{
function set sesame(value:ISesame):void;
}
} Code: package fs.secrets
{
public interface ISesame
{
function set aliBaba(value:IAliBaba):void
}
} Ich würde eine Form von IoC nutzen, da spart man sich viel Stress und der Singleton ist egal.
__________________ http://icodeapps.net | Meet me at the Flex user group Hamburg talking about CoffeeScript |
| | |
| | #6 (permalink) |
| Neuer User Registriert seit: Feb 2011
Beiträge: 30
|
Achtung! Post bezieht sich auf Martins Antwort! okay das stimmt eigentlich. könntest du noch mal kurz ein beispiel mit meiner knopf-tür-geschichte machen? Ein toter Briefkasten ist es nicht wirklich oder, weil eigentlich nichts reingelegt wird? Code: secretButton.addEventListener(MouseEvent.CLICK, unockDoor);
function unlockDoor(e:MouseEvent):void
{
StaticEventDispatcher.instance().dispatchEvent(StatusEvent.OPEN_DOOR);
} Code: door.addEventListener(StatusEvent.OPEN_DOOR, unlock); Geändert von Paratron (11-05-2011 um 20:08 Uhr) |
| | |
| | #7 (permalink) |
| Keine Panik Registriert seit: Apr 2010 Ort: Düsseldorf (im ernst)
Beiträge: 1.868
|
@Martin, und an der Stelle gehen die Meinungen scheinbar auseinander. du löst das (zumindest hier) über eine schier endlose Anzahl an eigenen Events, die zentral über deinen DeadLetterOffice schickst. Nachteil für mich: Wer ist dafür zuständig, die visuellen Elemente auf die Bühne zu packen, Events zu registrieren und wieder zu löschen? ich würde pro Screen einen Controller anlegen, der seine Schäfchen kennt, Objekte instanziert, Events empfängt, Aktionen auslöst, und vor allen dingen Objekte und Events wieder sauber entfernt. sprich alles verwaltet, was in diesem Bild/Raum/Fenster möglich ist, und dem Screenmanager mitteilt, wann es zeit ist, einen anderen Screen anzuzeigen. klingt erstmal kompliziert, aber im Grunde ist das nicht mehr als ein Sprite, mit init und dispose-funktion, wo Events registriert und wieder gelöscht werden. die Visuellen Teile kannst du hier sowohl programmieren, als auch in der Flash-IDE anlegen. |
| | |
| | #8 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
|
Thomas beschreibt letzten Endes gar noch mehr als das Problem. Strukturell ist das aber die bessere Variante.
__________________ http://icodeapps.net | Meet me at the Flex user group Hamburg talking about CoffeeScript |
| | |
| | #9 (permalink) |
| Keine Panik Registriert seit: Apr 2010 Ort: Düsseldorf (im ernst)
Beiträge: 1.868
| nicht ganz. PHP-Code: PHP-Code: PHP-Code: weil wir wollen ja nicht, dass der erste Event direkt alle anderen Türen mit öffnet @Paratron, und jetzt vergleich das mit dem Dreizeiler, den ich in meiner ersten antwort geschrieben habe ![]() was mach ich?
Geändert von thomas_E (11-05-2011 um 20:29 Uhr) |
| | |
| | #10 (permalink) |
| Neuer User Registriert seit: Feb 2011
Beiträge: 30
|
okay danke für die ausführen. aber das ist eurer meinung nach nicht die optimale lösung, höre ich raus es ist in der tat können sich sehr viele String-Konstanten in der Event-Klasse ansammeln, wenn das Projekt wächst.Omega Psi's Idee kann ich leider nicht so ganz nachvollziehen. Es geht darum die beiden Objekte die miteinander zu interagieren miteinander bekannt zu machen, right? Also wenn ich den Geheimschalter instanziiere kann ich folgendes machen: Code: schalter:Sender= new Geheimschalter(); tuer:Empfänger = new Tuer(); schalter.setEmpfaenger(tuer); Bitte noch um kurze Erklärung!Thomas Lösung ist ja eigentlich recht einfach. An der Stelle wo ich meine Sprites instanziiere füge ich auch direkt EventListener ein. Wer soll die init() und dispose() Funktionen anbieten und was bewerkstelligen die genau? Und was ist wenn der Geheimknopf im Keller ist und die Tür im ersten Stock aufgehen soll? Sry fürs Nerven. Bin noch neu im OO-Design, will aber nichts vermurksen... |
| | |
| | #11 (permalink) |
| Neuer User Registriert seit: Dec 2005
Beiträge: 99
|
MVC? Dein Geheimschalter(View) führt entsprechenden GeheimschalterController(Controller) aus der dann den state im Model (irgendwelche Türen wurden freigeschaltet oder verschlossen) setzt. Verstehe das Problem nicht ganz.
__________________ http://blog.johannes-hodde.com |
| | |
| | #12 (permalink) |
| Neuer User Registriert seit: Feb 2011
Beiträge: 30
|
Das Problem liegt daran, dass die Application bisher nicht nach ModelViewController aufgebaut ist. Ist das üblich bei Spielen? Ich habe mich mehrere Wochen mit Entwurfsmustern beschäftigt, aber MVC nicht richtig verstanden. Ich verstehe nicht wie ich die Funktionalität meiner Objekte auf 3 verschiedene Klassen aufteilen soll? Bzw. wo instanziiere ich z.B. das Türobjekt (Model, View oder Controller?) und wie mache ich dann diese Instanz den beiden anderen Komponenten bekannt? |
| | |
| | #13 (permalink) |
| Developer Registriert seit: Sep 2001 Ort: Unterhaching/München
Beiträge: 513
| Mvc, ioc, dpi
Hallo. Wenn Du neu bist in OOP hast Du mit Flash eine tolle Umgebung gefunden es zu lernen. Was Du Dir anlesen solltest ist ganz klar MVC(Model-View-Control), was Du wahrscheinlich an jeder Ecke schon gehört hast. Das trennt deine visuellen Anteile der Anwendung (VIEW) von den Teilen, die auf die Benutzerinteraktion hören und daraufhin entsprechende Anwendungslogiken starten (CONTROL(ler)) und dem Teil, der den Anwendungszustand speichert (MODEL). Auf diesem "Meta" Pattern (weil es viele einzel OOP Design Pattern vereint, um GROSSES zu schaffen :-)) basieren andere DPI(Dependency Injection) Frameworks, die das Problem umgehen, was Du richtig mit "Bekanntmachung der Objekte" beschrieben hast. Dependency Injection bedeutet nicht mehr, als das einem Objekt seine Abhängigkeiten (andere Objekte) injeziert werden - und zwar automatisch und nicht mehr über "boilerplate code", also Code, der nur für das Zusammenfügen von Objekten anstelle von Anwendungslogik zuständig ist. Eines dieser Frameworks ist Robotlegs. Dieses solltest Du Dir umbedingt mal anschauen, vielleicht das best-practises Dokument lesen, einfach um die Idee davon mit zu nehmen. Auf dein Problem bezogen: Du schreibst Dir also eine Klasse für deine Szene (View) und einen dazugehörigen Controller (eigene Klasse), der die View Instanz kennt und sich bei dieser für eventuelle Events anmeldet. Wenn jetzt jemand auf den Secret Button klickt, hört der Controller auf das ClickEvent (oder ein eigenes Event, was noch andere Informationen enthält) und ändert daraufhin den Zustand im Model, dessen Instanz dem Controller ebenfalls bekannt ist. So hast Du den Controller als vermittelnde Instanz zwischen der View und dem Modell. In deiner Szene (neue View), in der die Tür enthalten ist, die von dem Secret Button abhängt, holt sich zu Beginn der korrespondierende Controller (ebenfalls neuer Controller) den aktuellen Wert des Secret Button aus dem Model (wie gesagt, die Controller haben Zugriff aufs Model) und vergleicht bei Klick auf die Tür, diesen Wert. Natürlich kann der Controller auch erst bei dem Klick Event auf die Tür, auf welches er ja hört, den Secret Button Wert aus dem Model holen. Diese Controller werden auch gerne Mediatoren genannt (z.B im Falle von Robotlegs), was dem Begriff Vermittler näher kommt. Und ja, natürlich wird das Modell irgendwann riesig, wenn das Spiel wächst. Irgendwo muss der Zustand aber gespeichert werden. Bei steigender Komplexität kann man auch "das" Modell in mehrere kleinere und das Spiel in Module aufteilen. Bestimmte Zustände im Spiel sind ja auch nur für einen bestimmten Abschnitt relevant. Bei Robotlegs gibt es auch dafür eine Erweiterung. Kurz noch, wie Robotlegs das Schreiben von "Bekanntmachungs-Code" umgeht: Zu Beginn der Anwendung registrierst Du entsprechende Klassen in einem Injektor. Dieser weiß ab dem Moment, falls irgendeine Klasse signalisiert, dass es z.B das Model benötigt, welche Klasse er instanzieren und injezieren muss. Dieses Signalisieren passiert tatsächlich darüber, dass du öffentlichen Variablen in deiner Klasse ein [INJECT] anfügst. PHP-Code: Letztlich das gleiche, als wenn Du der Klasse dieses Objekt per Konstruktur beim Instanzieren übergeben hättest - nur ohne zusätzlichen Code. Geändert von malthoff (12-05-2011 um 07:17 Uhr) |
| | |
| | #14 (permalink) | ||
| Flash-Designer Registriert seit: May 2006 Ort: Wiesbaden
Beiträge: 6.165
| Dacht' ich's mir doch, dass ich für den StaticEventDispatcher mal wieder Prügel beziehe ![]() Zitat:
Zitat:
Ich hatte Paratron jedoch so verstanden, dass es darum geht, ein bestehendes Szenario um eine Art Schmetterlingsflügeleffekt zu ergänzen?! D.h. es passiert an einer beliebigen Stelle irgendetwas, was an einem ganz anderen, logisch damit nicht verknüpften Ort (z.B. in einem anderen View) irgendeine Reaktion hervorruft. Und wenn man von dieser Annahme ausgeht, ist es IMHO um ein vielfaches einfacher, das auf die beschreibene Weise zu implementieren, als die komplette Hierachie anzupassen um irgendwie eine Verbindung zwischen diesen beiden Orten hinzubekommen und damit Unmengen überflüssiger Bindungen zu produzieren.
__________________ Viele Grüße // Martin Martin Kraft // Interaktionsdesign Hilfreiche Websites: // Hilfe zur Adobe Flash Plattform // ActionScript 2 Referenz // ActionScript 3 Referenz // ActionScript 3 Arbeitshandbuch // weitere Flash Ressourcen Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da! Geändert von Martin Kraft (12-05-2011 um 08:34 Uhr) | ||
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Schaltflächen Status ändern | SKVler | ActionScript 2 | 2 | 13-03-2010 14:51 |
| Verwalten mit XML | D-Tox | Flash Einsteiger | 2 | 07-11-2006 13:28 |
| Schaltflächen Status ändern | pachita | ActionScript 1 | 5 | 09-12-2004 00:23 |
| bei mouseover status cursor ändern? | Sascha_oba | Flash 4 und Flash 5 | 2 | 10-05-2002 14:23 |
| Ändern des Status eines Rolloverbildes mit Action Script | Mattula | ActionScript 1 | 1 | 27-07-2001 15:02 |