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

11

16.11.2012, 00:04

@Renegade123:
Das wär wohl auch ein Ansatz. Da ich aber nicht wahllos irgendwelche Einheiten einfüge, und auch der Benutzer sich während des Spiels keine Einheiten zusammen basteln kann, werd ich das ganze wohl nicht mehr ändern, zumal ich es ja jetzt alles schon so geschrieben hab. ;) Vielleicht werd ich das in meinem nächsten Projekt mal anders machen - jedenfalls ist es ein interessanter Ansatz. Danke dafür!

So ungefähr weiß ich schon, was eine virutelle Methode ist - zumindest, wofür ich sie verwende. Um eben z.B. die Funktion der Basisklasse virtual zu machen und sie dann in der abgeleiteten Klasse zu überschreiben. Wenn ich jetzt ein neues Objekt der abgeleiten Klasse erzeuge und in einem Zeiger der Basisklasse speichere (so wie ich das jetzt auch mache), dann wird die Funktion der abgeleiteten Klasse aufgerufen.
Ich hab aktuell auch eine Update-Methode und eine Render-Methode, allerdings sind die in CEinheit definiert, deswegen is die nicht virtual. Vielleicht wäre es wirklich sinnvoller, die virtual zu machen und jede Einheit (CFlugzeug, CFahrzeug) das Updaten und Rendern selbst zu überlassen. Allerdings sind viele Teile in Update für Flugzeuge und Fahrzeuge ja ident...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

16.11.2012, 06:38

Es gibt Leute, die sagen, dass es nicht sinnvoll ist Update() und Render() virtual zu machen, sondern protected/private-Methoden (je nach Sprache) OnRender() und OnUpdate() virtual zu deklarieren und diese von Update() und Render() aufrufen zu lassen, damit das Verhalten des Interfaces gewahrt bleibt.
Für Deinen Anfang würde aber auch virtuel Render() und Update() reichen. Die Basis-Klasse wissen zu müssen ist jedenfalls ein offensichtlicher Fehler im Konzept.
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (16.11.2012, 06:45)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

13

16.11.2012, 13:08

Ich hab aktuell auch eine Update-Methode und eine Render-Methode, allerdings sind die in CEinheit definiert, deswegen is die nicht virtual. Vielleicht wäre es wirklich sinnvoller, die virtual zu machen und jede Einheit (CFlugzeug, CFahrzeug) das Updaten und Rendern selbst zu überlassen. Allerdings sind viele Teile in Update für Flugzeuge und Fahrzeuge ja ident...

Du könntest die Updatemethode der Basisklasse auch in der Methode der abgeleiteten Klasse aufrufen. Besserer Stil wäre allerdings, dem Vorschlag von BlueCobold anzunehmen und nur private Methoden als virtuell (oder besser als abstrakt) zu deklarieren. Diese musst du in den abgeleiteten Klassen überschreiben und in den Methoden der Basisklasse aufrufen. Das hat den Vorteil, dass du nicht vergessen kannst die Methode der Basisklasse aufzurufen und du kannst in der Basisklasse bestimmen wann was getan wird.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Käsekönig

1x Contest-Sieger

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

14

16.11.2012, 18:15

So, ich hab das jetzt so gelöst, dass ich zwei Funktionen (OnUpdate und OnRender) als protected in CEinheit mit virtual deklariert hab. Diese hab ich dann in CFlugzeug und CFahrzeug jeweils überladen. Die "Haupt"-Update und Renderfunktion (Update und Render) bleiben gleich und rufen OnUpdate und OnRender auf. In Update und Render werden also alle Dinge gemacht, die alle Einheiten betreffen, und wenn etwas speziell nur auf eine Einheit zutrifft, wird das dann durch die überladene Funktion von OnUpdate und OnRender ausgeführt.
Also danke Leute, ich glaub, damit hab ich gefunden, was ich gesucht habe. :)

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

15

17.11.2012, 00:07


@Renegade123:
Das wär wohl auch ein Ansatz. Da ich aber nicht wahllos irgendwelche Einheiten einfüge, und auch der Benutzer sich während des Spiels keine Einheiten zusammen basteln kann, werd ich das ganze wohl nicht mehr ändern, zumal ich es ja jetzt alles schon so geschrieben hab. Vielleicht werd ich das in meinem nächsten Projekt mal anders machen - jedenfalls ist es ein interessanter Ansatz. Danke dafür!


Ich glaube, du verstehst nicht. Du schaffst dir durch diese Methode einfach Standardeinheiten. Du kannst dann die Fabrik aufrufen, wenn du es für notwendig hälst einen Panzer zu erzeugen. Nur mit dem Unterschied, das der Schaffensprozess des Akteurs von einer XML abhängig ist.

abstrakte Fabrik


Der Aufwand ist doch gar nicht so riesig. Teile einfache alle Funktion auf Komponenten auf die du als Gruppe identifizierst. So könnte z.B. eine Komponente eine Render2D sein, oder ein Driving-Skript für einen Panzer.


lg René
Liebe Grüße,
René

Werbeanzeige