Java Messaging System – Android Studio/libGDX

Als ich Kurt’s cruel adventures programmiert habe, bin ich schnell in eine der größten Fallen getappt… schlechtes Code-Design. Eigtl. war das Spiel nur als coding-doodle geplant, nichts besonderes, wuchs aber schnell.

Auf jeden Fall hab ich mir dann Gedanken gemacht wie ein MessageSystem aussehen könnte, um die Kommunikation zwischen Spielelementen, dem Spieler, der GUI usw. abzukapseln. Dies will ich hier vorstellen, es wird nicht die beste Lösung sein, aber es ist das was ich mir vorgestellt habe. Laut Android Monitor auf nicht Ressourcen fressend.

Das Ziel dieses Konstrukts sollte sein :
– dynamisches Hinzufügen von „listener“ und „handler“
– Ressourcen sparend und GC vermeidend.
– einfach

Die ganze Sache besteht aus 2 Klassen, einem Interface und einem Enum.
MessageQueue ist die Hauptklasse, diese verwaltet alle Nachrichten. Message ist eine Hilfsklasse, alle Nachrichten in der „Warteschlange“ sind von diesem Typ. MessageType dient nur zur Aufzählung, eine Übersicht über alle Nachrichten. Der Hauptbestandteil ist das Interface Event.
Desweiteren gibt es noch die Hilfsklasse console die einfach eine Ausgabe der Nachrichten darstellt, zum Debuggen ganz hilfreich.

Aber genug davon. Ich habe ein git-Repository angelegt, da könnt ihr euch den Code ansehen. https://github.com/CptnRoughnight/javamessagequeue

Die Benutzung ist dann wie folgt :


MessageQueue queue = new MessageQueue(this); // selbst als Eventhandler übergeben für Inputprocessor
queue.addInputProcessor(this); // den Inputprocessor einstellen


queue.RegisterObject(Console); // Die Debug Konsole verwenden
queue.RegisterObject(Player); // Der Spieler will auch Nachrichten empfangen

Eigtl. ganz einfach neue Teilnehmer hinzuzufügen. Wichtig ist nur das die hinzuzufügenden Klassen alle das Interface Event benutzen.

Jetzt der richtig wichtige Teil, die Teilnehmer müssen die Nachrichten verarbeiten. Dazu ist das Interface Event da. Die Funktion handleMessage
muss nur implementiert werden. Ein kleines Beispiel :

@Override
public boolean handleMessage(Message msg) {
if (target.equals("android")) // android build
{
switch(msg.msg_Type)
{
case msg_left:
break;
case msg_right:
break;

msg_Type ist vom Typ MessageType dort können dann frei die Nachrichten definiert werden. Soll ein Teilnehmer nur zuhören dann gibt handleMessage beim abarbeiten der Nachricht false zurück, soll die Nachricht nicht weiter aktiv bleiben, der Teilnehmer diese Nachricht quasi verzehren dann muss true zurück gegeben werden.

Diese Variante ist sicher nicht die Beste, ich bin mir sicher das auch noch einiges an Optimierungen möglich sind, aber fürs Erste reicht es. Wer Anregungen und Fehler findet darf gerne Kontakt aufnehmen, bin über Feedback sehr dankbar!

981 total views, 1 views today

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.