Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

repac3r

Frischling

  • »repac3r« ist der Autor dieses Themas

Beiträge: 9

Beruf: Schüler

  • Private Nachricht senden

1

29.12.2013, 17:05

SFML SpriteAnimation -> Geschwindigkeit setzen

Guten tag,

ich bin gerade dabei ein einfaches 2D rpg Spiel zu programmieren.
Ich möchte dabei die Animationsgeschwindigkeit einer Laufanimation diese ich aus einem Sprite für einen
Character habe, kontrollieren.

Hier ist mein bisheriger Code:

C-/C++-Quelltext

1
2
3
4
void Game::PlayerAnimation(int pDirection){ switch(pAnimationState) {   case 0:     mPlayer.setTextureRect(sf::IntRect(0, pDirection * 48, 32, 48));        break;  case 1:     mPlayer.setTextureRect(sf::IntRect(32, pDirection * 48, 32, 48));       break;  case 2:     mPlayer.setTextureRect(sf::IntRect(64, pDirection * 48, 32, 48));       break;  case 3:     mPlayer.setTextureRect(sf::IntRect(96, pDirection * 48, 32, 48));       break;  }

    if(pAnimationState < 3) {       pAnimationState++;  }   else    {       pAnimationState = 0;    }   
}


Hier habe ich einfach die Funktion TextureRect benutzt, um eine Laufanimation zu erstellen.
Nur das ganze geht viel zu schnell. Dann habe ich mir gedacht, könnte ich doch einfach dort
eine Schleife rein setzen, die einen Countdown runter zählt. Funktioniert leider auch nicht
richtig, es "laggt" ziemlich, außerdem wäre das sowie so eine sehr unschöne Methode, besonders
weil dann die Animation auf anderen PC`S, auch anders schnell laufen. Wie könnte ich, eine
"Animationsgeschwindigkeit" setzen, die auf allen Systemen gleich schnell laufen ?
Rein Theoretisch sollte das ja irgendwie mit sf::Clock/Time funktionieren oder ?

Für Tipps wäre ich dankbar.

lg, repac3r


Edit: Sry, aber die Formatierung will irgendwie nicht, egal wie oft ich es zurecht setze...

(Link)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »repac3r« (29.12.2013, 17:12)


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

29.12.2013, 17:18

Mit einer Clock bist du schon auf dem richtigen Weg, grundsätzlich willst du ja einen festen Abstand zwischen den Phasenwechseln.
Das heißt, du gibst vor, nach was für einer Zeitspanne gewechselt wird und sobald eine Zeitvariable diese Zeit überschreitet wird gewechselt.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

3

29.12.2013, 17:22

Du erstellst eine Variable, der du jedes Frame die Zeit hinzuaddierst, die im letzten Frame vergangen ist.
Wenn eine bestimmte Zeit erreicht ist versetzt du das Rechteck auf der Textur und setzt die Variable auf 0.

Ich kann dir später auch ein Code-Beispiel geben, ich bin ar gerade nicht am PC. :)

EDIT: Zu langsam :D

repac3r

Frischling

  • »repac3r« ist der Autor dieses Themas

Beiträge: 9

Beruf: Schüler

  • Private Nachricht senden

4

29.12.2013, 18:56

Okay, danke erstmal werde mir das Morgen mit der Clock mal anschauen, für Codebeispiele bin ich immer offen :)

Wahrscheinlich läuft das dann über elapsedtime oder ? (Hoffe die Funktion ist richtig geschrieben :D)

Lg, repac3r

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

5

29.12.2013, 19:25

Nimm lieber restart(), die gibt dir die elapsedTime seit dem letzten restart() zurück und startet die Clock neu.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

LeBusch

Frischling

Beiträge: 81

Beruf: Student B.Sc. Informatik

  • Private Nachricht senden

6

29.12.2013, 20:19

Ich weiß nicht, ob es eine Art "DateTime"-Struktur so auch in C++ gibt. In C# funktioniert diese Herangehensweise jedoch ganz wunderbar:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        public void Move()
        {

            if ((DateTime.Now >= _nexttime) && (_moving == true))
            {

                //Wenn die Zielzeit erreicht wurde, wird auf das nächste Bitmap geschaltet
                _animindex++;
                CalcNewPos();

                if (_animindex == _framecount)
                {

                    _animindex = 0;
                    _moving = false;

                }

                _nexttime = DateTime.Now.AddMilliseconds(_animdelay);

            }

        }

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LeBusch« (29.12.2013, 20:48)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

30.12.2013, 09:04

Du erstellst eine Variable, der du jedes Frame die Zeit hinzuaddierst, die im letzten Frame vergangen ist.
Würde ich dringend von abraten. Das ist numerisch instabil und außerdem überhaupt gar nicht notwendig, wenn man doch auch mit der verstrichenen Gesamtzeit arbeiten kann statt immer Deltas aufzuaddieren.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

repac3r

Frischling

  • »repac3r« ist der Autor dieses Themas

Beiträge: 9

Beruf: Schüler

  • Private Nachricht senden

8

30.12.2013, 13:01

Okay ich habe das jetzt hinbekommen. Habe einfach eine Clock benutzt und immer die bereits abgelaufene Zeit mit einer Zählerschleife heruntergezählt. Funktioniert jetzt soweit, danke für euer Hilfe.


Lg. Repac3r

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

9

30.12.2013, 13:43

Du erstellst eine Variable, der du jedes Frame die Zeit hinzuaddierst, die im letzten Frame vergangen ist.
Würde ich dringend von abraten. Das ist numerisch instabil und außerdem überhaupt gar nicht notwendig, wenn man doch auch mit der verstrichenen Gesamtzeit arbeiten kann statt immer Deltas aufzuaddieren.

Gut zu wissen :D

Werbeanzeige