<?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[AnimatedSprite Klasse Design-&#x2F;Umsetzungproblem]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich arbeite gerade an einer Klasse namens AnimatedSprite, deren Header im moment so aussieht: (Ich verwende SFML)</p>
<pre><code class="language-cpp">class AnimatedSprite :
	public sf::Sprite
{
	public:
		AnimatedSprite(float updateEvery);
		virtual ~AnimatedSprite(void);

		void updateImage(float delta);
		void addImage(sf::Image* img);
		void setLoop(int low, int high);
	private:
		std::vector&lt;sf::Image*&gt; images;
		float updateRate; //update every X seconds
		int imgIndex;
		int lowLoopBound;
		int highLoopBound; //exclusive
		float restTime;

		void nextImg(); //skips to next image in loop
};
</code></pre>
<p>Also die Idee ist folgende:<br />
Ich habe einen Vektor, der alle images die in animationen für dieses Sprite verwendet werden speichert.<br />
Mit addImage fügt man ein image hinzu, mit setloop kann man (durch indizes) auswählen zwischen welchen images durchgelaufen werden.</p>
<p>Für ein Anwendungsbeispiel brauche ich für einige sachen animationen:<br />
- nach links gehen<br />
- nach rechts gehen<br />
- richtung von links nach rechts ändern<br />
- richtung von rechts nach links ändern<br />
- stehen in richtung nach rechts<br />
- stehen in richtung nach links<br />
- und evtl. mehr</p>
<p>Ich finde das etwas mühsam, mit setloop, dann muss man sich genau die indizes merken und darauf basierend setzen...<br />
Deswegen suche ich nach einer besseren Möglichkeit.<br />
Ich habe mir schon überlegt, eine Unterklasse zu machen, die eine unterloop hält und evtl eine aktion, die aufgerufen wird, wenn diese unterloop zuende ist.<br />
Beispiel:<br />
Ein Loop Element, dass die animation für &quot;von links nach rechts wechseln&quot; hält, würde dann wenn die animation zuende ist irgendwie dafür sorgen, dass auf &quot;nach rechts gehen&quot; gewechselt wird oder so.<br />
Naja, so ganz fertiggedacht krieg ich die idee irgendwie noch nicht^^</p>
<p>Ich bin dankbar für hilfreiche Vorschläge!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285083/animatedsprite-klasse-design-umsetzungproblem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 12:19:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285083.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Apr 2011 17:18:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to AnimatedSprite Klasse Design-&#x2F;Umsetzungproblem on Wed, 13 Apr 2011 17:18:10 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich arbeite gerade an einer Klasse namens AnimatedSprite, deren Header im moment so aussieht: (Ich verwende SFML)</p>
<pre><code class="language-cpp">class AnimatedSprite :
	public sf::Sprite
{
	public:
		AnimatedSprite(float updateEvery);
		virtual ~AnimatedSprite(void);

		void updateImage(float delta);
		void addImage(sf::Image* img);
		void setLoop(int low, int high);
	private:
		std::vector&lt;sf::Image*&gt; images;
		float updateRate; //update every X seconds
		int imgIndex;
		int lowLoopBound;
		int highLoopBound; //exclusive
		float restTime;

		void nextImg(); //skips to next image in loop
};
</code></pre>
<p>Also die Idee ist folgende:<br />
Ich habe einen Vektor, der alle images die in animationen für dieses Sprite verwendet werden speichert.<br />
Mit addImage fügt man ein image hinzu, mit setloop kann man (durch indizes) auswählen zwischen welchen images durchgelaufen werden.</p>
<p>Für ein Anwendungsbeispiel brauche ich für einige sachen animationen:<br />
- nach links gehen<br />
- nach rechts gehen<br />
- richtung von links nach rechts ändern<br />
- richtung von rechts nach links ändern<br />
- stehen in richtung nach rechts<br />
- stehen in richtung nach links<br />
- und evtl. mehr</p>
<p>Ich finde das etwas mühsam, mit setloop, dann muss man sich genau die indizes merken und darauf basierend setzen...<br />
Deswegen suche ich nach einer besseren Möglichkeit.<br />
Ich habe mir schon überlegt, eine Unterklasse zu machen, die eine unterloop hält und evtl eine aktion, die aufgerufen wird, wenn diese unterloop zuende ist.<br />
Beispiel:<br />
Ein Loop Element, dass die animation für &quot;von links nach rechts wechseln&quot; hält, würde dann wenn die animation zuende ist irgendwie dafür sorgen, dass auf &quot;nach rechts gehen&quot; gewechselt wird oder so.<br />
Naja, so ganz fertiggedacht krieg ich die idee irgendwie noch nicht^^</p>
<p>Ich bin dankbar für hilfreiche Vorschläge!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048886</guid><dc:creator><![CDATA[Gast1337]]></dc:creator><pubDate>Wed, 13 Apr 2011 17:18:10 GMT</pubDate></item><item><title><![CDATA[Reply to AnimatedSprite Klasse Design-&#x2F;Umsetzungproblem on Wed, 13 Apr 2011 17:29:05 GMT]]></title><description><![CDATA[<p>Vererbung ist verlockend, aber nicht unbedingt sinnvoll. Viele Funktionen der Basisklasse haben keine sinnvolle Bedeutung mehr, z.B. <code>SetImage()</code> oder <code>SetSubRect()</code> . Verwende stattdessen Komposition.</p>
<p>Eine Möglichkeit ist eine Klasse, die mehrere <code>sf::Sprite</code> s als Member hält. Diese verweisen auf unterschiedliche <code>sf::Image</code> s oder Teile davon. Bei einem <code>Update()</code> -Aufruf sollte das <code>AnimatedSprite</code> automatisch schauen, ob das aktuelle Frame der Animation bereits passiert ist und wenn nötig zum nächsten Element im Container wechseln. Als Loop würde ich nur ein <code>bool</code> -Flag verwenden, das nach Passieren wieder von vorne anfängt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048903</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 13 Apr 2011 17:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to AnimatedSprite Klasse Design-&#x2F;Umsetzungproblem on Wed, 13 Apr 2011 17:53:44 GMT]]></title><description><![CDATA[<p>Mit der Vererbung hast du Recht, ich brauche diese Methoden von außen wirklich nicht, und die würden den internen zustand kaputt machen wenn man sie dennoch aufruft. Danke für den Vorschlag.<br />
Ist es dann sinnvoller ein Sprite als Attribut zu nehmen, oder privat zu erben?</p>
<p>Warum denn mehrere Sprites als member? (sprites halten z.B. auch position usw), ich dachte eher daran mehrere images zu speichern und nur ein spirte (oder keins, falls man privat erbt).</p>
<p>Das mit dem bool flag hab ich nicht verstanden, wie du das anwenden willst.</p>
<p>Dann noch nen bischen was anderes:<br />
Ich möchte möglichst zwei verschiedene Arten von bildmaterial unterstützen:<br />
Einmal das man die Loops aus einzelnen bildern zusammenbastelt und einmal, dass man nur ein bild hat und davon verschiedene subRects genommen werden, habt ihr dazu ne gute idee?<br />
Ich hab mir folgendes gedacht: Ich könnte ja eine abstrakte basisklasse / interface machen für diese loopobjekte und dann zwei verschiedene implementierungen, eine mit einzelbildern und eine mit subrects.<br />
Was haltet ihr davon?</p>
<p>Also zur Hilfsklasse habe ich dann folgenden Entwurf:</p>
<pre><code class="language-cpp">class ImageLoop
{
	public:
		bool update(float delta); //gibt true zurück und resetted sich selbst, wenn das ende erreicht ist

		ImageLoop&amp; getNextLoop();
		void reset(); //setzt die animation wieder auf anfang
	private:
		std::vector&lt;sf::Image*&gt; images;
		ImageLoop* nextLoop; //kann entweder eine nachfolger loop sein, oder auf sich selbst zeigen
		void nextImage();		
}
</code></pre>
<p>Benutzung dann ungefähr so:</p>
<pre><code class="language-cpp">ImageLoop* newLoop = 0;

switch(direction)
{
	case LEFT: 
		newLoop = loopLeft;
		break;
	case RIGHT:
		newLoop = loopRight;
		break;
	//andere fälle noch
}

//wenn sich die richtung geändert hat wird eine neue animation genommen und entsprechend diese neue animation auf ausgangszustand zurückgesetzt
if(newLoop &amp;&amp; newLoop != loop)
{
	loop = newLoop;
	loop-&gt;reset();
}

//wenn das ende erreicht ist, wird der nachfolger erreicht
if(loop-&gt;update(delta))
{
	loop = &amp;(loop-&gt;getNextLoop());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2048922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048922</guid><dc:creator><![CDATA[Gast1337]]></dc:creator><pubDate>Wed, 13 Apr 2011 17:53:44 GMT</pubDate></item><item><title><![CDATA[Reply to AnimatedSprite Klasse Design-&#x2F;Umsetzungproblem on Wed, 13 Apr 2011 18:06:26 GMT]]></title><description><![CDATA[<p>Gast1337 schrieb:</p>
<blockquote>
<p>Ist es dann sinnvoller ein Sprite als Attribut zu nehmen, oder privat zu erben?</p>
</blockquote>
<p>Attribut. Private Vererbung brauchst du ziemlich selten (z.B. für Zugriff auf <code>protected</code> -Member oder Überschreibung einer virtuellen Funktion). Verwende immer Komposition, wenn du damit erreichst was du willst.</p>
<p>Gast1337 schrieb:</p>
<blockquote>
<p>Warum denn mehrere Sprites als member? (sprites halten z.B. auch position usw), ich dachte eher daran mehrere images zu speichern und nur ein spirte (oder keins, falls man privat erbt).</p>
</blockquote>
<p>Du hast Recht, ein Sprite wäre klüger. Ich würde einen Container mit <code>std::pair&lt;sf::Image*, sf::IntRect&gt;</code> oder was Ähnlichem speichern, um die einzelnen Bilder/Bildausschnitte zu referenzieren. Das sollte auch deine andere Frage beantworten, Polymorphie ist wahrscheinlich Overkill.</p>
<p>Gast1337 schrieb:</p>
<blockquote>
<p>Das mit dem bool flag hab ich nicht verstanden, wie du das anwenden willst.</p>
</blockquote>
<p>Ein <code>AnimatedSprite::SetLoop(bool loop)</code> sorgt mit <code>true</code> dafür, dass die Animation immer wieder abgespielt wird; hingegen ist <code>false</code> für einmalige Animationen geeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048929</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 13 Apr 2011 18:06:26 GMT</pubDate></item><item><title><![CDATA[Reply to AnimatedSprite Klasse Design-&#x2F;Umsetzungproblem on Wed, 13 Apr 2011 21:24:05 GMT]]></title><description><![CDATA[<p>Wie das mit SpriteSheets mit SFML genau geht, kann ich dir nicht sagen. Aber mit subrects haste natürlich den richtigen Riecher. Um SpriteSheets zu erstellen nehme ich das hier: <a href="http://spritesheetpacker.codeplex.com/" rel="nofollow">http://spritesheetpacker.codeplex.com/</a><br />
Sehr einfach zu parsen das Format.<br />
Und dann halt einfach das Bild wechseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049052</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 13 Apr 2011 21:24:05 GMT</pubDate></item></channel></rss>