<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Pointer vs Objektübergabe in Funktionen &#x2F; Vorzeichenchaos in SDL]]></title><description><![CDATA[<p>Hallo,<br />
Ich wollte, um mit c++ und sdl besser vertraut zu werden pong implementieren. Ich fand auch ein imho sehr gutes <a href="http://wiki.gamedev.net/index.php/SDL:Tutorials:Simple_Engine_Framework" rel="nofollow">SDL Tutorial</a>, es funktionierte alles sehr gut, dann wollte ich meine eigene Klasse für die Spielobjekte schreiben...<br />
Das führte nun zu einigen Problemen, ich hoffe, ihr könnt mir helfen.<br />
Zuallererst: Wenn man einer Funktion ein Objekt übergibt, wann sollte man den Pointer zum Objekt, wann das Objekt selbst übergeben?<br />
Ich hab da die öffentliche Funktion, die nun imo echt ekelig aussieht:</p>
<pre><code class="language-cpp">void RenderMe(SDL_Surface* pDestSurface, SDL_Rect pScreenRect)
		{
			DrawImage(m_pImage, m_pCoord.ToSDL_Rect(), pDestSurface, &amp;pScreenRect);
		}
</code></pre>
<p>Ich habe pScreenRect als 'objekt' an die RenderMe Funktion übergeben, weil es nach SDL_BlitSurface(srcimg, &amp;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?<br />
(Die aufgerufene DrawImage funktion mit ebeso ekeligen Parametern:)</p>
<pre><code class="language-cpp">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, &amp;sRect, dstimg, dRect);

		}
</code></pre>
<p>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?</p>
<pre><code>private:
		object* TestPaddle;
		SDL_Rect ScreenRect;
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
nutze ich object (ohne <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> erhalte ich</p>
<blockquote>
<p>error: no match for 'operator=' in '((CMyEngine*)this)-&gt;CMyEngine::TestPaddle = (((object*)operator new(28u)), (&lt;statement&gt;, &lt;anonymous&gt;))'</p>
</blockquote>
<p>Der Konstruktor der object klasse schaut wie folgt aus:</p>
<pre><code class="language-cpp">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-&gt;w, m_pImage-&gt;h);
			else
				exit(2);

		}
</code></pre>
<p>Das ganze Funktioniert auch nicht richtig, das Objekt wird zwar angezeigt, aber die Koordinaten verhalten sich verkehrt - statt dass das mit</p>
<pre><code class="language-cpp">char* file = &quot;gfx/paddle.png&quot;;
	TestPaddle = new object(6,19,file);
</code></pre>
<p>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? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
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</p>
<pre><code class="language-cpp">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;
</code></pre>
<p>Und nochetwas: Um die object Klasse im Hauptquellcode benutzen zu können musste ich sie mit #include &quot;object.cpp&quot; 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?<br />
Ich hoffe, ihr könnt meine Unklarheiten beseitigen, ich bin wohl ziemlich noobig<br />
Danke schonmal für die Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215750/pointer-vs-objektübergabe-in-funktionen-vorzeichenchaos-in-sdl</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 02:08:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215750.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Jun 2008 22:49:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer vs Objektübergabe in Funktionen &#x2F; Vorzeichenchaos in SDL on Sat, 14 Jun 2008 22:49:35 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich wollte, um mit c++ und sdl besser vertraut zu werden pong implementieren. Ich fand auch ein imho sehr gutes <a href="http://wiki.gamedev.net/index.php/SDL:Tutorials:Simple_Engine_Framework" rel="nofollow">SDL Tutorial</a>, es funktionierte alles sehr gut, dann wollte ich meine eigene Klasse für die Spielobjekte schreiben...<br />
Das führte nun zu einigen Problemen, ich hoffe, ihr könnt mir helfen.<br />
Zuallererst: Wenn man einer Funktion ein Objekt übergibt, wann sollte man den Pointer zum Objekt, wann das Objekt selbst übergeben?<br />
Ich hab da die öffentliche Funktion, die nun imo echt ekelig aussieht:</p>
<pre><code class="language-cpp">void RenderMe(SDL_Surface* pDestSurface, SDL_Rect pScreenRect)
		{
			DrawImage(m_pImage, m_pCoord.ToSDL_Rect(), pDestSurface, &amp;pScreenRect);
		}
</code></pre>
<p>Ich habe pScreenRect als 'objekt' an die RenderMe Funktion übergeben, weil es nach SDL_BlitSurface(srcimg, &amp;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?<br />
(Die aufgerufene DrawImage funktion mit ebeso ekeligen Parametern:)</p>
<pre><code class="language-cpp">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, &amp;sRect, dstimg, dRect);

		}
</code></pre>
<p>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?</p>
<pre><code>private:
		object* TestPaddle;
		SDL_Rect ScreenRect;
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
nutze ich object (ohne <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> erhalte ich</p>
<blockquote>
<p>error: no match for 'operator=' in '((CMyEngine*)this)-&gt;CMyEngine::TestPaddle = (((object*)operator new(28u)), (&lt;statement&gt;, &lt;anonymous&gt;))'</p>
</blockquote>
<p>Der Konstruktor der object klasse schaut wie folgt aus:</p>
<pre><code class="language-cpp">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-&gt;w, m_pImage-&gt;h);
			else
				exit(2);

		}
</code></pre>
<p>Das ganze Funktioniert auch nicht richtig, das Objekt wird zwar angezeigt, aber die Koordinaten verhalten sich verkehrt - statt dass das mit</p>
<pre><code class="language-cpp">char* file = &quot;gfx/paddle.png&quot;;
	TestPaddle = new object(6,19,file);
</code></pre>
<p>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? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
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</p>
<pre><code class="language-cpp">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;
</code></pre>
<p>Und nochetwas: Um die object Klasse im Hauptquellcode benutzen zu können musste ich sie mit #include &quot;object.cpp&quot; 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?<br />
Ich hoffe, ihr könnt meine Unklarheiten beseitigen, ich bin wohl ziemlich noobig<br />
Danke schonmal für die Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529306</guid><dc:creator><![CDATA[milchhamster]]></dc:creator><pubDate>Sat, 14 Jun 2008 22:49:35 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer vs Objektübergabe in Funktionen &#x2F; Vorzeichenchaos in SDL on Sun, 15 Jun 2008 04:39:50 GMT]]></title><description><![CDATA[<p>Google mal nach Referenzen und const correctness.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529325</guid><dc:creator><![CDATA[Pointer vs Objektübergabe]]></dc:creator><pubDate>Sun, 15 Jun 2008 04:39:50 GMT</pubDate></item></channel></rss>