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

Lösung für das Problem des verstümmelten Codes in MySQL 5.x

MySQL ist eine häufig verwendete Open-Source-Date...

Fehlerbehebung bei der Ursache des 502 Bad Gateway-Fehlers auf dem Nginx-Server

Der Server meldet einen Fehler 502 beim Synchroni...

Erkunden Sie die gängigen VMware ESXI CLI-Befehle

Inhaltsverzeichnis 【Allgemeine Befehle】 [Zusammen...

So verarbeiten Sie Blob-Daten in MySQL

Der spezifische Code lautet wie folgt: Paket epoi...

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort vergessen?

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort ve...

Chinesische Lösung und Beispielcode für die MySQL-Volltextsuche

MySQL-Volltextsuche, chinesische Lösung Kürzlich ...

Ausführliche Erklärung zu Slots und Filtern in Vue

Inhaltsverzeichnis Spielautomaten Was sind Slots?...

Zusammenfassung der HTML-Wissenspunkte für das Frontend (empfohlen)

1. HTML-Übersicht htyper Textauszeichnungssprache...

Implementierung der automatischen Vervollständigung von Docker-Befehlen

Vorwort Ich weiß nicht, wie lange dieser Freund D...