Pointer vs Objektübergabe in Funktionen / Vorzeichenchaos in SDL



  • Hallo,
    Ich wollte, um mit c++ und sdl besser vertraut zu werden pong implementieren. Ich fand auch ein imho sehr gutes SDL Tutorial, es funktionierte alles sehr gut, dann wollte ich meine eigene Klasse für die Spielobjekte schreiben...
    Das führte nun zu einigen Problemen, ich hoffe, ihr könnt mir helfen.
    Zuallererst: Wenn man einer Funktion ein Objekt übergibt, wann sollte man den Pointer zum Objekt, wann das Objekt selbst übergeben?
    Ich hab da die öffentliche Funktion, die nun imo echt ekelig aussieht:

    void RenderMe(SDL_Surface* pDestSurface, SDL_Rect pScreenRect)
    		{
    			DrawImage(m_pImage, m_pCoord.ToSDL_Rect(), pDestSurface, &pScreenRect);
    		}
    

    Ich habe pScreenRect als 'objekt' an die RenderMe Funktion übergeben, weil es nach SDL_BlitSurface(srcimg, &sRect, dstimg, dRect); immer auf 0x0 zurück gesetzrt würde (als Pointer) - aber auch so passiert, das, d.h. ich muss die werte jeden Frame neu setzten - ist das normal?
    (Die aufgerufene DrawImage funktion mit ebeso ekeligen Parametern:)

    void DrawImage(SDL_Surface *srcimg, SDL_Rect sRect, SDL_Surface *dstimg, SDL_Rect *dRect, int alpha = 255)
    		{
    			if(!srcimg || alpha == 0) return;
    			SDL_SetAlpha(srcimg, SDL_SRCALPHA, alpha);
    			SDL_BlitSurface(srcimg, &sRect, dstimg, dRect);
    
    		}
    

    Unsicher bin ich mir auch, was für diese Objekte das richtige ist, in der Hauptprogramklasse werden diese Objekte erzeugt, aber was Pointer oder als richtiges Objekt?

    private:
    		object* TestPaddle;
    		SDL_Rect ScreenRect;
    

    😕
    nutze ich object (ohne 😉 erhalte ich

    error: no match for 'operator=' in '((CMyEngine*)this)->CMyEngine::TestPaddle = (((object*)operator new(28u)), (<statement>, <anonymous>))'

    Der Konstruktor der object klasse schaut wie folgt aus:

    object()
    		{
    			m_pCoord = fRect(0,0,0,0);
    			m_pImage = NULL;
    		}
    		object(int iPosX, int iPosY, char* file)
    		{
    			m_pImage = LoadImage(file);
    			if(m_pImage)
    				m_pCoord = fRect(iPosX, iPosY, m_pImage->w, m_pImage->h);
    			else
    				exit(2);
    
    		}
    

    Das ganze Funktioniert auch nicht richtig, das Objekt wird zwar angezeigt, aber die Koordinaten verhalten sich verkehrt - statt dass das mit

    char* file = "gfx/paddle.png";
    	TestPaddle = new object(6,19,file);
    

    erzeugte Objekt um 19pixel nach unten und 6 nach rechts verschoben abnezeigt wird, wird es um eben diesen wert nach oben und links verschoben - warum das? 😮
    Ob das etwas mit der fRect klasse zu tun hat, in der die Bilddimensuinen gespeichert werden? Um sie in eine normale Integer SDL_Rect umzuwandeln werden die floats gecastet

    typedef class fRect {
    	public:
    		float x, y, w, h;
    		fRect(float fX, float fY, float fWidth, float fHeight) 
    		{
    			x = fX;
    			y = fY;
    			w = fWidth;
    			h = fHeight;	
    		}
    		fRect()
    		{
    			x = y = w = h = 0;
    		}
    		fRect(float fWidth, float fHeight)
    		{
    			x = 0;
    			y = 0;
    			w = fWidth;
    			h = fHeight;		
    		}
    		SDL_Rect ToSDL_Rect()
    		{
    			SDL_Rect outR;
    			outR.x = (int)x; outR.y = (int)y; outR.w = (int)w; outR.h = (int)h;
    			return outR;
    		} 
    } fRect;
    

    Und nochetwas: Um die object Klasse im Hauptquellcode benutzen zu können musste ich sie mit #include "object.cpp" einbinden - die Engine.cpp aus dem Beispiel muss aber nicht angegeben werden, lediglich Engine.h muss includet werden - gibt es da konvntionen, was in header und was in cpp dateien sollte? Von der Object klasse sollen spezielle Objekte (Spielerpadle, Bälle, Items) abgeleitet werden, was gillt es da zu beachten? Welche Funktionen sollten 'protected' sein, welche 'virtual'? Warum kann ich in der Beispielengine in der void CMyEngine::AdditionalInit() Funktion keine private Variablen der übergeordneten Engine Klasse an eine externe (die object Klasse) übergeben?
    Ich hoffe, ihr könnt meine Unklarheiten beseitigen, ich bin wohl ziemlich noobig
    Danke schonmal für die Hilfe



  • Google mal nach Referenzen und const correctness.


Anmelden zum Antworten