Design Problem bei Grafik Engine
-
Hallo,
also ich habe eine kleine Grafik Engine mit SDL geschrieben udn es klappt auch alles wunderbar. Nun habe ich ein unschönes Problem und zwar existiert eine Klasse für die Engine von dieser Klasse erbe ich nun und erweitere sie um Funktionen die ich für das Spiel brauche. Jetzt habe ich noch eine Klasse für die Grafiken welcher aber evtl. auf die Engine zugreifen müssen. Wie löse ich das am Besten? Ich habe zwar z.B. bei der Render Methode so was:Grafik1.Render( m_pScreenSurface, 400, 400 );Aber irgendwie scheint das nicht so toll zu sein.
Wichtig wäre auch das ich z.B. von der Grafik Klasse erben kann um z.B. sowas zu machen:
class CEnemyTank : public CGrafik { void TurnGunLeft(); void TurnGunRight(); void Destroy(); /* ... */ };Jemand eine Idee?
Ich wollte auch noch eine Log-Klasse implentieren, aber ich denke das dort Singleton in Ordnung ist oder würdet ihr es anders machen?Danke schonmal würde mich über Antworten freuen
Gruß
-
Du mußt dir halt überlegen, in welcher Beziehung die beiden Klassen für die Grafik und die Engine stehen.
Designtechnisch wäre eine abstrakte Interface-Klasse wohl am besten, d.h. alle relevanten Funktionen werden dort beschrieben und dann in den abgeleiteten Klassen implementiert.
Wenn jedoch deine abgeleiteten Klassen direkt in Verbindung stehen, d.h. Spezialmethoden direkt aufrufen, dann ist dein bisheriger Ansatz ok.
Du mußt dir halt überlegen, ob du mehrere abgeleitete Klassen erzeugen möchtest und inwiefern du diese (mit wenig Aufwand) austauschen möchtest (z.B. als Basis-Klasse für eine anderes Spiel).
Bzgl. der Log-Klasse ist ein Singleton auf jeden Fall die beste Möglichkeit, d.h. es gibt nur eine Instanz, aber sie kann von diversen Klassen benutzt werden.
-
Hi danke für deine Antwort.
Also das ganze läuft halt z.Z. so das die Klasse CEngine halt einige nicht virtuelle Funktionen hat die wiederrum virtuelle Funktionen aufrufen. Es ist also nicht abstrakt, da die Klasse die Methoden schon implentiert sie aber dann nachdem sie geerbt wurden überschreibt. In der Klasse CGrafik ist z.Z. keine virtuelle Funktion definiert und man muss das Display Surface jedesmal beim Rendern mitübergeben, da die Klasse CGrafik diesen benötigt. Ich finde alle bis jetzt vorgeschlagenen Möglichkeiten nicht so pralle. Ich würde das eigentlich gerne so programmieren das CGrafik udn CEngine immer neu verwendet werden und man wenn man z.B. ein Hintergrundbild anzeigen will einfach CGrafik nimmt (welche auf irgendeinen Weg das Display Surface bekommt so das ichs nicht immer übergeben muss) und wenn man nun ein Spieler hat von CGrafik erbt und dann dort selber Sachen wie bool m_IsAlive usw. deklarieren kann. Das ganze scheint aber nicht so zu klappen da sie scheinbar sich gegenseitig brauchen

class CEngine { private: SDL_Surface *m_pSurface; public: void DoRender(); virtual void Render() { } }; void CEngine::DoRender() { // ... Render(); // ... } /* ------------------------------ */ class CGame : CEngine { public: void Render(); } void CGame::Render() { CGrafik Hintergrund; /* Ich will halt nicht jedesmal den Surface übergeben, kann ich nicht irgendwas machen damit die Funtkion auf m_pSurface zugriff bekommt und diesen Parameter nicht mehr brauche? */ Hintergrund.Render( m_pSurface, 0, 0 ); } /* ------------------------------ */ class CGrafik { public: Render( SDL_Surface *pSurface, int x, int y ); };Danke
Gruß