Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

1

02.08.2013, 19:52

Zusammenspiel Inputmanager - Objectmanager

Wie es der Titel schon sagt, geht es um das Zusammenspiel zwischen Inputmanager und Objectmanager. Und zwar steh ich vor einem Problem bei meinem Projekt (Strategiespiel). Dabei gibt es die Klasse Game, welche eine Instanz des Inputmanagers und des Ojectmanagers hält. Im Objectmanager sind alle Objekte in einer Liste gespeichert. Nun hab ich aber das Problem, dass manche Objekte ja etwas tun sollen, wenn ein Input kommt.
Nur stellt sich mir die Frage, wie dieses Zusammenspiel am besten aussehen könnte.
Ein Beispiel: Man klickt mit der Maus auf ein Objekt -> dieses soll dann markiert werden (eine bool Membervariable des Objekts soll geändert werden). Der Objectmanager weiß ja aber nicht, dass geklickt wurde und der Inputmanager weiß nichts von den Objekten. Ich könnte natürlich dem Inputmanager die Objektliste übergeben, oder dem Objectmanager den Input übergeben.
Allerdings sind beide Lösungen glaub ich nicht wirklich sinnvoll.
Eine andere Möglichkeit wäre natürlich, den Inputmanager als Singleton zu halten und im Objectmanager schauen, ob auf eine Einheit geklickt wurde. Allerdings weiß ich nicht, ob das da nicht fehl am Platz ist!? Außerdem sind Singletons scheinbar nicht so beliebt (zumindest hab ich das in dem Forum so mitbekommen, wenn ich es nicht falsch verstanden habe).
Habt ihr eine Idee, wie ich das vielleicht am besten umsetzen könnte?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

02.08.2013, 20:00

Ich habe dieses Problem sooft gehabt, dass ich zu folgender Architektur gegangen bin:

1) Ich habe eine Game-Klasse. Diese hat auch einen InputManager (wobei ich einfach ein Keyboard und Mouse-Objekt bereistelle), und auch den RessourcenManager.
2) Jedes Objekt erbt von GameObject und muss eine obligatorische Verbindung zum Game haben. Dadurch es auf den RessourcenManager oder InputObjekte zugreifen (Ressourcen laden, auf Eingaben reagieren, ...).

Zusätzlich habe ich das Problem, dass teilweise GameObjects von anderen benötigt werden. Ich habe den Weg eingeschlagen, Objekte im Game Global registrieren zu können:

C#-Quelltext

1
Game.RegisterGlobalObject("Level", _level);


andere GameObjekt-Instanzen können über eine Analoge GetGlobalObject()-Methode sich die Instanz holen.

Dadurch habe ich mittlerweile eine sehr robuste Architektur, die solche "ich brauche X" auf ein minimum begrenzen.

Lares

1x Contest-Sieger

  • Private Nachricht senden

3

03.08.2013, 00:43

Hmm verstehe ehrlich gesagt nicht so ganz, wo genau das Problem liegt. Nehmen wir an, du klickst eine Einheit an. Du speicherst die Position und lässt den ObjectManager nach der Einheit suchen, die auf dieser Position (bzw. innerhalb eines gewissen Radius davon) sich befindet. Diese kannst du dann manipulieren.
Was ich persölnlich machen würde ist, selektierte Einheiten in einen eigenen Container zu setzen. Deine Anwendung findet diese dann schneller und du kannst auch mehrere Einheiten ganz einfach auswählen, indem du halt jede Einheit in diesen Container setzt. Dann könntest du z.B. folgendermaßen die auf verschiedene Mausklicks reagieren:

- Es befinden sich Einheiten im Container -> Bewege Einheiten
- Es befinden sich Gebäude im Container -> Setze Sammelpunkte
- Es befinden sich Einheiten im Container und auf der geklickten Position ist ein Gegner -> Greife Gegner an

Da InputManager und ObjectManager beide Teile der Gameklasse sind, kann diese entsprechend das ganze steuern: Der InputManager sagt, es wurde auf Position xy geklickt, die Gameklasse geht dann zum ObjectManager und sucht sich die entsprechenden Einheiten an der Position raus und bestimmt die Aktion nach oben genannten Schema.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

03.08.2013, 07:18

Den Ansatz von TrommBomml mag ich ehrlich gesagt gar nicht. Ein Objekt steuert sich immer selbst und alles ist global, aber nur scheinbar hübsch verpackt? Irgendwie sehr dezentral, sehr chaotisch und noch schlechter zu warten oder zu verstehen als globale Variablen, denn Referenzen und Call-Hierarchien lassen sich damit überhaupt nicht mehr bestimmen.

Ich bin immer noch der Fan von Controllern. Der Vorteil ist dabei auch, dass es für das "GameObject" (ich hasse dieses nichts-sagende Wort) egal ist, wie der Input gemappt wird oder woher er stammt. Mouse, Joystick, Tastatur, Tastenbelegung, Touch-Screen, Beschleunigungs-Sensor? Total egal. Der Controller mappt das und gibt dem Objekt seine Befehle. Dabei braucht kein Objekt irgendwelche anderen globalen Objekte zu kennen oder sich selbst um Dinge zu kümmern, die es eigentlich nichts angeht (eine Spielfigur kennt meiner Meinung nach logisch gesehen so etwas wie Maus oder Touch-Screen nicht - auch ein Raumschiff kennt so etwas nicht - wieso also den Code so aufbauen?).
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

5

03.08.2013, 11:33

Wenn ich das richtig verstanden habe, könnte das ganze so aussehen:
-Inputmanager fängt einen Input ab und speichert ihn in einer Struktur (oder wo auch immer), was für ein Input mit welchen Parametern (linke Maustaste, rechte Maustaste, etc.) es war
-Die Klasse Game holt sich einen Zeiger auf die Struktur und übergibt sie im Update-Aufruf des Objectmanagers an selbigen
-Der Objectmanager entscheidet, was anhand dieses Inputs geschehen soll (er selektiert die Einheiten, etc.)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

05.08.2013, 13:51

Den Ansatz von TrommBomml mag ich ehrlich gesagt gar nicht. Ein Objekt steuert sich immer selbst und alles ist global, aber nur scheinbar hübsch verpackt? Irgendwie sehr dezentral, sehr chaotisch und noch schlechter zu warten oder zu verstehen als globale Variablen, denn Referenzen und Call-Hierarchien lassen sich damit überhaupt nicht mehr bestimmen.


Ich glaube du bist ein bisschen allergisch, was global angeht oder? :P Ausserdem glaube ich, dass du meinen Ansatz nicht ganz verstanden hast. Jedes Objekt ist sogar sehr selbstständig, weil es als einzigen Kontext das Game benötigt und darüber zentral an alle wichtigen Teile des Spiels kommt: Ressourcen, RenderContext, Einstellungen, Auflösung des Viewports, GraphicsDevice, Input etc. Ich fand das letztendlich besser, als immer die Update-Methoden unterschiedlich zu parametrisieren, weil z.B. das Level den Player kennen muss oder ein Player Projetile abfeuert, die mit dem Level und Figuren kollidieren usw.
Für mich hat das einfach ziemlich saubere Trennung bewirkt und den Code stark vereinfacht. Globale Objekte sind einfach nur im Game bekannte GameObjects. Das sind nicht alle, sondern nur eine Hand voll. Dadurch hat man sehr einheitliche Schnittstellen für jedes GameObject, was ich sehr leserlich finde.

Ich bin immer noch der Fan von Controllern. Der Vorteil ist dabei auch, dass es für das "GameObject" (ich hasse dieses nichts-sagende Wort) egal ist, wie der Input gemappt wird oder woher er stammt. Mouse, Joystick, Tastatur, Tastenbelegung, Touch-Screen, Beschleunigungs-Sensor? Total egal. Der Controller mappt das und gibt dem Objekt seine Befehle. Dabei braucht kein Objekt irgendwelche anderen globalen Objekte zu kennen oder sich selbst um Dinge zu kümmern, die es eigentlich nichts angeht (eine Spielfigur kennt meiner Meinung nach logisch gesehen so etwas wie Maus oder Touch-Screen nicht - auch ein Raumschiff kennt so etwas nicht - wieso also den Code so aufbauen?).


Interessanter Ansatz. Mich würde eine konkrete Implementierung zum Vergleich interessieren. Gerade, was Kollisionen und deren reaktion angeht, wäre interessant zu wissen, wie das aussehen würde. Ich empfinde es spannenderweise genau anders herum gut, wenn die einzelnen Spielelemente alles selbst behandeln, was für sie von Interesse ist. Sonst hatte ich die Erfahrung, dass sich die öffentlichen Schnittstellen der Objekte einfach enorm vergrößert, was ich gar nicht gut finde. Dafür nehme ich gerne ein paar globale Einzelkämpfer in Kauf.

Werbeanzeige