<?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[Bewegungen bei Mariospiel]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich arbeite im Moment an einem Mariospiel und habe schon ein paar Grundfunktionalitäten eingebaut.<br />
Bis jetzt hatte ich nur Bewegungen in der X-Achse implementiert (mit den Pfeiltaste) und bisher auch nur ohne Beschleunigung.<br />
Ich will jetzt aber Beschleunigung einbauen und der header sieht jetzt so aus:</p>
<pre><code class="language-cpp">class Mario : public Actor
{
	public:
		Mario(ImageManager&amp; manager, sf::RenderWindow&amp; app, float posX = 0.f, float posY = 0.f);
		virtual ~Mario(void);
		virtual bool isDead();
		virtual void doLogics(float delta);
		virtual void draw(sf::RenderTarget&amp; target);
		void setSpeed(float xSpeed, float ySpeed);
		sf::Vector2f getSpeed();
	private:
		sf::Sprite mySprite;
		sf::RenderWindow&amp; myWindow;
		bool myIsDead;

		float mySpeedX;   //vorzeichenbehaftet
		float mySpeedY;
		float myAccelerationX;  //vorzeichenbehaftet
		float myAccelerationY;
		float myMaxSpeedX;    //(vorerst) absolut
		float myMaxSpeedY;

		XDirection::XDirection myXDir;
		YDirection::YDirection myYDir;

		//Verschiedene Animationen, die je nach Situation gewechselt werden
		AnimationLoop* myActiveLoop;
		AnimationLoop myLeftLoop;
		AnimationLoop myRightLoop;
		AnimationLoop myStandLeftLoop;
		AnimationLoop myStandRightLoop;
		AnimationLoop myLeft2RightLoop;
		AnimationLoop myRight2LeftLoop;

		void updateDirections(); //setzt richtung basierend auf pfeiltasten
		void updateAcceleration(); //berechnet aus richtung die beschleunigung
		void updateSpeed(float delta); //berechnet aus beschleunigung die geschwindigkeit
		void updatePosition(float delta); //berechnet aus geschwindigkeit die neue position
		void updateAnimation(float delta); //berechnet aus richtung, geschwindigkeit und beschleunigung den animationFrame

		//Pfade zu den Bildern
		static const std::string IMG_PATH_LEFT_1;
		static const std::string IMG_PATH_LEFT_2;
		static const std::string IMG_PATH_LEFT_3;
		static const std::string IMG_PATH_RIGHT_1;
		static const std::string IMG_PATH_RIGHT_2;
		static const std::string IMG_PATH_RIGHT_3;
		static const std::string IMG_PATH_STAND_LEFT;
		static const std::string IMG_PATH_STAND_RIGHT;
		static const std::string IMG_LEFT_2_RIGHT;
		static const std::string IMG_RIGHT_2_LEFT;
};
</code></pre>
<p>ein paar implementierungen noch:</p>
<pre><code class="language-cpp">void Mario::updatePosition( float delta )
{
	mySprite.Move(mySpeedX * delta, mySpeedY * delta);
}

void Mario::updateSpeed( float delta )
{
	mySpeedX += delta * myAccelerationX;
	mySpeedX = max(mySpeedX, -myMaxSpeedX);
	mySpeedX = min(mySpeedX, myMaxSpeedX);

	mySpeedY += delta * myAccelerationY;
	mySpeedY = max(mySpeedY, -myMaxSpeedY);
	mySpeedY = min(mySpeedY, myMaxSpeedY);
}
</code></pre>
<p>So, das problem ist jetzt</p>
<pre><code class="language-cpp">void updateAcceleration(float delta);
</code></pre>
<p>Also im Prinzip soll das so funktionieren:</p>
<p>-Wenn die Richtung rechts ist, wird die Beschleunigung erhöht (relativ problemlos)</p>
<p>-Wenn die Richtung links ist, wird die Beschleunigung niedriger (relativ problemlos) (niedriger heißt, dass es dadurch auch negativ werden kann)</p>
<p>-Wenn die Richtung STAND ist, muss je nach richtung entgegengesteuert werden.</p>
<p>Da sehe ich jetzt ein paar Probleme:<br />
- Bei STAND können (über)schwingungen entstehen<br />
- für die beschleunigungen bräuchte ich eigentlich auch maximalwerte</p>
<p>Ich vermute, dass das ganze irgendwie viel einfacher gehen muss, aber mir fällt nichts gutes ein.</p>
<p>Wenn ihr ansonsten noch Verbesserungsvorschläge zum bisherigen Aufbau usw. habt, immer her damit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Ich bin dankbar für jeden guten Vorschlag!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285448/bewegungen-bei-mariospiel</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 07:48:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285448.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Apr 2011 19:27:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bewegungen bei Mariospiel on Wed, 20 Apr 2011 19:27:30 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich arbeite im Moment an einem Mariospiel und habe schon ein paar Grundfunktionalitäten eingebaut.<br />
Bis jetzt hatte ich nur Bewegungen in der X-Achse implementiert (mit den Pfeiltaste) und bisher auch nur ohne Beschleunigung.<br />
Ich will jetzt aber Beschleunigung einbauen und der header sieht jetzt so aus:</p>
<pre><code class="language-cpp">class Mario : public Actor
{
	public:
		Mario(ImageManager&amp; manager, sf::RenderWindow&amp; app, float posX = 0.f, float posY = 0.f);
		virtual ~Mario(void);
		virtual bool isDead();
		virtual void doLogics(float delta);
		virtual void draw(sf::RenderTarget&amp; target);
		void setSpeed(float xSpeed, float ySpeed);
		sf::Vector2f getSpeed();
	private:
		sf::Sprite mySprite;
		sf::RenderWindow&amp; myWindow;
		bool myIsDead;

		float mySpeedX;   //vorzeichenbehaftet
		float mySpeedY;
		float myAccelerationX;  //vorzeichenbehaftet
		float myAccelerationY;
		float myMaxSpeedX;    //(vorerst) absolut
		float myMaxSpeedY;

		XDirection::XDirection myXDir;
		YDirection::YDirection myYDir;

		//Verschiedene Animationen, die je nach Situation gewechselt werden
		AnimationLoop* myActiveLoop;
		AnimationLoop myLeftLoop;
		AnimationLoop myRightLoop;
		AnimationLoop myStandLeftLoop;
		AnimationLoop myStandRightLoop;
		AnimationLoop myLeft2RightLoop;
		AnimationLoop myRight2LeftLoop;

		void updateDirections(); //setzt richtung basierend auf pfeiltasten
		void updateAcceleration(); //berechnet aus richtung die beschleunigung
		void updateSpeed(float delta); //berechnet aus beschleunigung die geschwindigkeit
		void updatePosition(float delta); //berechnet aus geschwindigkeit die neue position
		void updateAnimation(float delta); //berechnet aus richtung, geschwindigkeit und beschleunigung den animationFrame

		//Pfade zu den Bildern
		static const std::string IMG_PATH_LEFT_1;
		static const std::string IMG_PATH_LEFT_2;
		static const std::string IMG_PATH_LEFT_3;
		static const std::string IMG_PATH_RIGHT_1;
		static const std::string IMG_PATH_RIGHT_2;
		static const std::string IMG_PATH_RIGHT_3;
		static const std::string IMG_PATH_STAND_LEFT;
		static const std::string IMG_PATH_STAND_RIGHT;
		static const std::string IMG_LEFT_2_RIGHT;
		static const std::string IMG_RIGHT_2_LEFT;
};
</code></pre>
<p>ein paar implementierungen noch:</p>
<pre><code class="language-cpp">void Mario::updatePosition( float delta )
{
	mySprite.Move(mySpeedX * delta, mySpeedY * delta);
}

void Mario::updateSpeed( float delta )
{
	mySpeedX += delta * myAccelerationX;
	mySpeedX = max(mySpeedX, -myMaxSpeedX);
	mySpeedX = min(mySpeedX, myMaxSpeedX);

	mySpeedY += delta * myAccelerationY;
	mySpeedY = max(mySpeedY, -myMaxSpeedY);
	mySpeedY = min(mySpeedY, myMaxSpeedY);
}
</code></pre>
<p>So, das problem ist jetzt</p>
<pre><code class="language-cpp">void updateAcceleration(float delta);
</code></pre>
<p>Also im Prinzip soll das so funktionieren:</p>
<p>-Wenn die Richtung rechts ist, wird die Beschleunigung erhöht (relativ problemlos)</p>
<p>-Wenn die Richtung links ist, wird die Beschleunigung niedriger (relativ problemlos) (niedriger heißt, dass es dadurch auch negativ werden kann)</p>
<p>-Wenn die Richtung STAND ist, muss je nach richtung entgegengesteuert werden.</p>
<p>Da sehe ich jetzt ein paar Probleme:<br />
- Bei STAND können (über)schwingungen entstehen<br />
- für die beschleunigungen bräuchte ich eigentlich auch maximalwerte</p>
<p>Ich vermute, dass das ganze irgendwie viel einfacher gehen muss, aber mir fällt nichts gutes ein.</p>
<p>Wenn ihr ansonsten noch Verbesserungsvorschläge zum bisherigen Aufbau usw. habt, immer her damit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Ich bin dankbar für jeden guten Vorschlag!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052213</guid><dc:creator><![CDATA[Gast1337]]></dc:creator><pubDate>Wed, 20 Apr 2011 19:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to Bewegungen bei Mariospiel on Wed, 20 Apr 2011 19:43:26 GMT]]></title><description><![CDATA[<p>Ich würde eher eine (betragsmäßig) konstante Beschleunigung verwenden. Gegen das Überschwing-Verhalten und für eine Maximalgeschwindigkeit brauchst du eine Fallunterscheidung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052226</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 20 Apr 2011 19:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Bewegungen bei Mariospiel on Wed, 20 Apr 2011 20:57:22 GMT]]></title><description><![CDATA[<p>ok, danke, habs jetzt hinbekommen, hab zwar einige switch, if und else gebraucht, aber jetzt läufts.</p>
<p>Als nächstes sind dann bewegungen an der y-Achse dran <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Ich überlege noch, ob ich irgendwas mit Basisklassen da machen könnte, weil ja so ziemlich jede Spielfigur ein zumindest halbwegs ähnliches verhalten haben wird, aber trotzdem muss die Möglichkeit da sein, das Verhalten anzupassen, evtl. ne Basisklasse und man kann bei Bedarf überschreiben?<br />
Nur dann müsste man in der Basisklasse auch festlegen, was es alles an Animationen gibt usw. glaube ich...</p>
<p>Wenn noch jemand Vorschläge hat, bitte her damit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052254</guid><dc:creator><![CDATA[Gast1337]]></dc:creator><pubDate>Wed, 20 Apr 2011 20:57:22 GMT</pubDate></item><item><title><![CDATA[Reply to Bewegungen bei Mariospiel on Wed, 20 Apr 2011 21:07:35 GMT]]></title><description><![CDATA[<p>Ich würd die Animationen von der Bewegung trennen. Mache ein Sprite und ein AnimationSprite davon durch Komposition und die jeweiligen Spielfiguren verweisen dann wiederum auf die animierten Sprites (kann ja auch ein Mapping über nen Namen sein, ist ja egal). Du wirst ja auch mehrere Mauerstücke etc. haben. Dann hast Du mehrere Spielelemente mit gleichem Sprite.</p>
<p>Vererbung für Spielobjekte klingt gut, auch wenn Du die dann zusammen in einen Container packen kannst. Da die Spielfiguren sich gegenseitig nicht kennen sollen, macht auch ein Bereich Sinn, in dem so was wie Bewegungen mit Kollisionsabfragen gehandelt werden. So was wie &quot;Environment&quot; oder &quot;PhysicalWorld&quot; oder so was. Da kannst Du dann bewegen, Kollisionsabfragen machen und auch noch irgendwelche physikalischen Spielchen global für alle Figuren einbauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052263</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 20 Apr 2011 21:07:35 GMT</pubDate></item><item><title><![CDATA[Reply to Bewegungen bei Mariospiel on Thu, 21 Apr 2011 08:32:02 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Ich würd die Animationen von der Bewegung trennen. Mache ein Sprite und ein AnimationSprite davon durch Komposition und die jeweiligen Spielfiguren verweisen dann wiederum auf die animierten Sprites (kann ja auch ein Mapping über nen Namen sein, ist ja egal). Du wirst ja auch mehrere Mauerstücke etc. haben. Dann hast Du mehrere Spielelemente mit gleichem Sprite.</p>
</blockquote>
<p>Ich bin mir nicht ganz sicher, wie du das meinst.<br />
Also erstmal möchte ich darauf hinweisen, dass SFML zwischen images und sprites unterscheidet, images speichern einfach nur ganz dumm bilddaten und ein Sprite hat einen Pointer auf ein image, ein subrect, positionen usw..<br />
Also auch wenn ich mehrere Mauern mit dem gleichen Bild habe, habe ich insgesamt nur 1 Bild im speicher liegen, weil die Sprites nur pointer speichern.</p>
<p>Erübrigt das dann deinen Vorschlag, oder hab ich nen wichtigen Punkt außer acht gelassen?<br />
Falls letzteres der Fall ist, dann wäres ganz gut, wenn du deinen Vorschlag nochmal ein wenig ausführen kannst bitte.</p>
<p>Ich beschreib nochmal wie ich das im Moment handhabe:<br />
Jede Figur hat einige AnimationLoops (bei ner wand kann es auch einfacher sein, aber bei mario ist das zumindest so), zwischen denen gewechselt werden kann.<br />
Jede Animationloop hat einen vector von einem Triples, die jeweils<br />
-nen Pointer aufn image<br />
-nen subrect<br />
-ne dauer des frames<br />
speichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052372</guid><dc:creator><![CDATA[Gast1337]]></dc:creator><pubDate>Thu, 21 Apr 2011 08:32:02 GMT</pubDate></item><item><title><![CDATA[Reply to Bewegungen bei Mariospiel on Thu, 21 Apr 2011 16:37:46 GMT]]></title><description><![CDATA[<p>So, ich bin jetzt bei der Y-Achse dran, also springen und fallen.</p>
<p>Ich habe mir jetzt folgendes überlegt:<br />
Ich benutze auch für die y-achse eine konstante beschleunigung.<br />
Je nachdem, ob gerade ein sprung gemacht wird oder nicht, ist die YRichtung<br />
YDirection::UP oder YDirection::DOWN<br />
(sowas wie stehend gibt es bei y nicht nach meinem bisherigen entwurf).<br />
Dann wird dadurch die position umgesetzt.<br />
Jetzt kann man denken - man fällt doch immer weiter nach unten, dafür hab ich dann folgendes erdacht:<br />
Ich mache ja sowieso immer kollisionsprüfungen und wenn ich dann merke, dass mario in einem block hängt, wird er nen stück nach oben gesetzt, so, dass er aufm block drauf ist.</p>
<p>Findet ihr das so ok, oder habt ihr bessere Vorschläge?<br />
Sollte man vielleicht nicht nach, sondern vor der Bewegung überprüfen, ob man auf einem Untergrund steht?</p>
<p>Bei meinem Ansatz fällt mir spontan ein Problem auf:<br />
Wenn man das mit allen Figuren so macht, und bei Kollisionen die Koordinaten umsetzt, dann kann die Reihenfolge der Kollisionsüberprüfung das verhalten bestimmen, weil dann ja während der Kollisionsüberprüfung Koordinaten umgesetzt werden...<br />
Aber vll ist das nicht so schlimm, weil ich das im moment so eingerichtet hab, dass man immer 100 Logikframes pro sekunde hat und deswegen die Bewegungen von frame zu frame sehr gering sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052607</guid><dc:creator><![CDATA[Gast1337]]></dc:creator><pubDate>Thu, 21 Apr 2011 16:37:46 GMT</pubDate></item><item><title><![CDATA[Reply to Bewegungen bei Mariospiel on Thu, 21 Apr 2011 18:39:45 GMT]]></title><description><![CDATA[<p>Beschleunigung auf der Y-Achse ist ok, aber nicht nach oben. Beim Springen beschleunigt man doch nicht. Ich würde stattdessen immer eine bestimmte Beschleunigung nach unten machen (Gravitation) und beim Sprungstart der Figur ein einmaliges Geschwindigkeitsplus nach oben geben. Die Gravitation sorgt dann dafür, dass der Sprung negativ beschleunigt, irgendwann anhält und die Figur wieder nach unten fällt.</p>
<p>Zum Untergrund: vorher prüfen geht nicht, wenn man sich im Sprung bewegen können soll, ist aber auch nicht nötig. Zur Zeit prüfst du, ob er in einen Block gefallen ist und setzt ihn gegebenenfalls wieder hoch. Warum prüft du nicht stattdessen, ob er in einen Block fallen würde und lässt ihn gegebenenfalls nicht fallen (bzw. nur maximal bis auf den Block)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052648</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 21 Apr 2011 18:39:45 GMT</pubDate></item><item><title><![CDATA[Reply to Bewegungen bei Mariospiel on Thu, 21 Apr 2011 21:42:03 GMT]]></title><description><![CDATA[<p>bisher läuft das bei mir nach dem schema ab (geplant, aber noch nicht wirklich umgesetzt):</p>
<pre><code class="language-cpp">for(unsigned int i = 0; i &lt; actors.size(); ++i)
{
   actors[i].doLogics(delta);  //führt unter anderem bewegungen durch
}
for(unsigned int i = 0; i &lt; actors.size(); ++i)
{
   for(unsigned int j = i; j &lt; actors.size(); ++j)
   {
      if(detectCollision(actors[i], actors[j]))
      {
          actors[i].collideWith(actors[j]);
          actors[j].collideWith(actors[i]);
      }
   }
}
</code></pre>
<p>Das mit collideWith soll dann irgendwie mit double dispatch funktionieren.</p>
<p>Wenn ich bei jeder bewegung überprüfe, dann müsste ich das zu sowas ändern:</p>
<pre><code class="language-cpp">for(unsigned int i = 0; i &lt; actors.size(); ++i)
{
    actors[i].doLogics(delta);
    for(unsigned in j = i /*oder 0?*/; j &lt; actors.size(); ++j)
    {
        if(detectCollision(actors[i], actors[j]))
        {
            actors[i].collideWith(actors[j]);
            actors[j].collideWith(actors[i]);
        }
    }
}
</code></pre>
<p>Nur dann würde die reihenfolge wieder ne rolle spielen, aber evtl kann man das aufgrund der kurzen zeitdifferenzen vernachlässigen...<br />
Oder hat wer ne bessere Idee vielleicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052708</guid><dc:creator><![CDATA[Gast1337]]></dc:creator><pubDate>Thu, 21 Apr 2011 21:42:03 GMT</pubDate></item></channel></rss>