ÜberblickDieser Artikel beginnt mit der Einführung von Inhalten im Zusammenhang mit der Geschäftsarchitektur von Spielen. Auf der Geschäftsebene des Spiels können alle Systeme, die isoliert werden müssen, und die Kommunikation zwischen Modulen durch Nachrichtenverteilung entkoppelt werden. Beispielsweise Netzwerk-Rückmeldungen, mit der Schnittstelle synchronisierte Datenaktualisierungen usw. Die Nachrichtenverteilung erfolgt nach dem Beobachtermuster. Der Ort, an dem die Nachricht verarbeitet werden muss, registriert den Abhörrückruf beim Nachrichtencenter. Wenn die Nachricht versendet wird, wird die Versandschnittstelle des Nachrichtencenters aufgerufen, um die Abhörwarteschlange der Nachricht zu durchlaufen und die entsprechende Rückrufmethode aufzurufen. Spezifischer PlanDefinieren Sie zuerst den Listening-Callback-Typ /** * Rückrufmethode zur Nachrichtenüberwachung */ Exporttyp NotifyListener = (Quelle: beliebig, Daten: beliebig) => ungültig; Speichern der Abhörwarteschlange nach Schlüsselwert private static msg2listDict: Dictionary<Zeichenfolge, Array<NotifyListenerInfo> > = neues Dictionary<Zeichenfolge, Array<NotifyListenerInfo> >(); Schnittstellendefinition /** * Mehrere Listener hinzufügen, müssen manuell entfernt werden * @param msg * @param-Listener * @param Ziel */ öffentliche statische addListener(msg: Zeichenfolge, Listener: NotifyListener, Ziel?: beliebig): void {} /** * Fügen Sie einen einmaligen Listener hinzu und entfernen Sie ihn, nachdem das Ereignis ausgelöst wurde* @param msg * @param-Listener * @param Ziel */ öffentliche statische addOnceListener(msg: Zeichenfolge, Listener: NotifyListener, Ziel?: beliebig): void {} /** * Entfernen Sie den durch die angegebene Nachricht angegebenen Listener * @param msg * @param-Listener */ öffentliche statische removeMsgListener(msg: Zeichenfolge, Listener: NotifyListener): void {} /** * Entfernt alle Listener der angegebenen Nachricht * @param msg */ öffentliche statische removeMsgAllListeners(msg: string): void {} /** * Entfernt die Überwachung der angegebenen Nachricht durch das angegebene Ziel * @param msg * @param Ziel */ öffentliche statische removeTargetMsgListen(msg: Zeichenfolge, Ziel: beliebig): void {} /** * Entfernt alle Nachrichtenlistener des angegebenen Ziels * @param target */ öffentliche statische removeTargetAllMsgListen(Ziel: beliebig): void {} /** * Nachricht senden * @param msg * @param quelle * @param-Daten */ öffentliche statische Benachrichtigung (Nachricht: Zeichenfolge, Quelle: beliebig, Daten: beliebig): void {} Bei der Implementierung zum Hinzufügen und Entfernen müssen Sie sich darüber im Klaren sein, dass möglicherweise eine Nachricht versendet wird. Für einen neu hinzugefügten Listener einer Nachricht sollte diese verteilt werden, nachdem die aktuelle Warteschlangennachricht verteilt wurde. Fügen Sie daher eine hinzuzufügende Warteschlange hinzu privater statischer listener2add: Array<NotifyListenerInfo> = []; Treffen Sie beim Hinzufügen eines Listeners die folgende Entscheidung // Die Nachricht wird versendet und in die Warteschlange gestellt, um hinzugefügt zu werden, wenn (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) { NotifyCenter.listener2add.push(info); zurückkehren; } Ebenso kann die Nachricht versendet werden, wenn der Listener entfernt wird. Um zu vermeiden, dass die Änderung der Warteschlange die Ausnahme der For-Schleife verursacht, fügen Sie eine zu entfernende Warteschlange hinzu. Wenn sich der Listener beim Versenden der Nachricht in der Entfernungswarteschlange befindet, wird er nicht versendet. Nachdem die Nachricht versendet wurde, entfernen Sie sie aus der Warteschlange privater statischer Listener2Remove: Array<NotifyListenerInfo> = []; Treffen Sie beim Entfernen des Listeners die folgende Entscheidung // Die Nachricht wird versendet und in die Warteschlange gestellt, um gelöscht zu werden, wenn (NotifyCenter.notifyMsgs.indexOf(msg) >= 0) { NotifyCenter.listener2remove.push(Listener[i]); } anders { Liste.splice(i, 1); } Beim Versenden einer Nachricht durchlaufen Sie die Warteschlangen unter der angegebenen Nachricht // Die Warteschlange existiert nicht, sie muss nicht verarbeitet werden, let list = NotifyCenter.msg2listDict.get(msg); wenn (!Liste) { zurückkehren; } // Markieren Sie die Nachricht als versendet. Es können mehrere Nachrichten gleichzeitig versendet werden. Dieselbe Nachricht kann mehrfach markiert werden. NotifyCenter.notifyMsgs.push(msg); // Nachrichtenversand verarbeiten für (let i = 0, n = list.length; i < n; i++) { NotifyCenter._dispatch(Liste[i], Quelle, Daten, falsch); } Stellen Sie beim Versenden einer Nachricht zunächst fest, ob die Warteschlange entfernt wird // In der Entfernungswarteschlange, kein Versand if (NotifyCenter.listener2remove.indexOf(info) >= 0) { zurückkehren; } Nachdem die aktuelle Warteschlange versendet wurde, überprüfen Sie die hinzuzufügende Warteschlange // Verarbeite die Warteschlange, für die eine Funktion hinzugefügt werden soll (let i = 0, n = msg2add.length; i < n; i++) { wenn (listener2add[i].msg == msg) { NotifyCenter._dispatch(listener2add[i], src, data, true); } } Es wird ein Nachrichtenverteilungszentrum eingeführt, um isolierten Systemen und Modulen die Kommunikation durch Nachrichtenüberwachung und -versand zu ermöglichen und so eine gegenseitige Referenzkopplung zu vermeiden. Oben finden Sie eine ausführliche Erläuterung des CocosCreator-Nachrichtenverteilungsmechanismus. Weitere Informationen zur CocosCreator-Nachrichtenverteilung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
>>: Der beste Weg, ein JAR-Paketprojekt unter einem Centos7-Server zu starten
MySQL ist eine häufig verwendete Open-Source-Date...
Code kopieren Der Code lautet wie folgt: <styl...
Der Server meldet einen Fehler 502 beim Synchroni...
Inhaltsverzeichnis 【Allgemeine Befehle】 [Zusammen...
Einführung Xiao A war gerade dabei, Code zu schre...
Ohne weitere Umschweife hier ein Demobild. Die im...
Der spezifische Code lautet wie folgt: Paket epoi...
CSS-Operationen CSS $("").css(name|pro|...
Hintergrund Da die Anzahl der Unterprojekte des U...
1. Einführung in nmon Nmon (Nigel's Monitor) ...
Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort ve...
MySQL-Volltextsuche, chinesische Lösung Kürzlich ...
Inhaltsverzeichnis Spielautomaten Was sind Slots?...
1. HTML-Übersicht htyper Textauszeichnungssprache...
Vorwort Ich weiß nicht, wie lange dieser Freund D...