Detaillierte Erläuterung des CocosCreator-Nachrichtenverteilungsmechanismus

Detaillierte Erläuterung des CocosCreator-Nachrichtenverteilungsmechanismus

Überblick

Dieser 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 Plan

Definieren 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:
  • So verwenden Sie JSZip in vue.js, um Dateien auf dem Frontend zu dekomprimieren
  • Interpretation des CocosCreator-Quellcodes: Engine-Start und Hauptschleife
  • CocosCreator allgemeines Framework-Design Ressourcenmanagement
  • So erstellen Sie eine Liste in CocosCreator
  • Analyse des neuen Ressourcenmanagementsystems von CocosCreator
  • CocosCreator Skelettanimation Drachenknochen
  • So zeichnen Sie in CocosCreator ein cooles Radardiagramm
  • Detaillierte Erklärung der CocosCreator MVC-Architektur
  • So verwenden Sie die JSZip-Komprimierung in CocosCreator

<<:  Detaillierte Erläuterung der Reihenfolge der MySQL-Abfrageergebnisse gemäß der Reihenfolge der ID in in ()

>>:  Der beste Weg, ein JAR-Paketprojekt unter einem Centos7-Server zu starten

Artikel empfehlen

js implementiert einen einfachen Countdown

In diesem Artikelbeispiel wird der spezifische Co...

MySQL erklärt das Prinzip und Beispiel zum Abrufen von Abfrageanweisungen

„explain“ wird verwendet, um Informationen zum Ab...

So verbinden Sie Navicat mit der Docker-Datenbank auf dem Server

Starten Sie den MySQL-Container in Docekr Verwend...

Die 7 besten VSCode-Erweiterungen für Vue-Entwickler

Das Hinzufügen der richtigen VS Code-Erweiterung ...

Vue-Konfigurationsdetails für mehrere Seiten

Inhaltsverzeichnis 1. Der Unterschied zwischen me...

So installieren Sie das Pip-Paket unter Linux

1. Laden Sie das Pip-Installationspaket entsprech...

Zwei Möglichkeiten zum Starten des Linux-Bootdienstes

Inhaltsverzeichnis rc.local-Methode chkconfig-Met...

Natives JS zur Implementierung der Formularvalidierungsfunktion

Inhaltsverzeichnis Bei der Entwicklung kann eine ...

Holen Sie sich die IP und den Hostnamen aller Hosts auf Zabbix

zabbix Zabbix ([`zæbiks]) ist eine Open-Source-Lö...

Asynchroner Lebenszyklus von AsyncHooks in Node8

Async Hooks ist eine neue Funktion von Node8. Sie...

Beispiel einer Nginx-Standortübereinstimmungsregel

1. Grammatik Standort [=|~|~*|^~|@] /uri/ { ... }...