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

9 Tipps zur MySQL-Datenbankoptimierung

Inhaltsverzeichnis 1. Wählen Sie die am besten ge...

So öffnen Sie eine Seite in einem Iframe

Lösung: Setzen Sie den Zielattributwert des Links ...

Reines HTML und CSS, um den JD-Karusselleffekt zu erzielen

Das JD-Karussell wurde mit reinem HTML und CSS im...

Der vollständige Leitfaden zum Rasterlayout in CSS

Grid ist ein zweidimensionales Rasterlayoutsystem...

Einführung in Sublime Text 2, ein Web-Frontend-Tool

Sublime Text 2 ist ein leichter, einfacher, effiz...

SVN-Installation und grundlegende Bedienung (grafisches Tutorial)

Inhaltsverzeichnis 1. Was ist SVN? 2. Methoden zu...

Vue hält den Benutzer angemeldet (verschiedene Token-Speichermethoden)

Inhaltsverzeichnis So setzen Sie Cookies Nachteil...

Eine einfache Methode zum Zusammenführen und Entfernen doppelter MySQL-Tabellen

Szenario: Die gecrawlten Daten erzeugen eine Date...

So wählen Sie das Format bei der Verwendung von Binlog in MySQL

Inhaltsverzeichnis 1. Drei Binlog-Modi 1.Anweisun...

Verwenden Sie vue2+elementui für Hover-Prompts

Die Hover-Prompts von Vue2+elementui sind in exte...