Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++][SFML] Animacja

Ostatnio zmodyfikowano 2015-01-03 16:47
Autor Wiadomość
Amedos
Temat założony przez niniejszego użytkownika
[C++][SFML] Animacja
» 2015-01-01 20:59:37
Witam.
W jaki sposób tworzy się animacje w SFML'u ?
Mam arkusz sprite,no i wiem jak wybrać odpowiedniego sprite'a itd.
1. W pętli głównej program mam umieścić rysowanie tego sprite? Czy może jakiś wątek?
2. Co jaki czas ma zmieniać klatke?
3. Gdzie poczytać o fizyce w grach 2d?
P-123821
lectre
» 2015-01-01 21:17:49
Animacje możesz stworzyć poprzez setTexture(). Co jakiś odstęp czasu zmieniaj tekstury wedle uznania. Sam sprite i jego rysowanie się nie zmienia. A do stworzenia timera użyj sf::Clock i sf::Time.
P-123822
1aam2am1
» 2015-01-01 21:24:21
3. Zależy jaką gre tworzysz. Widok z góry, z boku. Platformówkę, itp...
Morzesz stworzyć własną, albo skorzystać choćby z box2d
P-123824
Amedos
Temat założony przez niniejszego użytkownika
» 2015-01-01 21:28:17
P-123825
RazzorFlame
» 2015-01-03 13:39:29
1. W pętli głównej program mam umieścić rysowanie tego sprite? Czy może jakiś wątek?
To już zależy od Ciebie, generalnie rysowanie spritów się nie zmienia.
2. Co jaki czas ma zmieniać klatke?
To także zależy od Ciebie. Jeżeli chcesz by animacja, która ma np. 10 klatek wyświetliła się cała w 60 sekund to klatke zmieniasz co 6 sekund. Kiedy ja pisałem w SFML to robiłem np. 6 klatek animacji chodzenia w danym kierunku i przełączałem klatke co 1/6 sekundy tak by pełna animacja trwała całą sekundę.
3. Gdzie poczytać o fizyce w grach 2d?
Sam temat fizyki jest dość skomplikowany. W fizyce jest dużo różnych pojęć. Głównym źródłem wiedzy powinno być dla Ciebie google.pl Możesz też skorzystać z Wikipedii, bo często są tam różne wzory (zazwyczaj na angielskiej wiki). Jeżeli nie chcesz się bawić sam z tymi wzorami (bo nie ma co się oszukiwać - jest to ciężka i czasochłonna robota) to skorzystaj np. z Box2D.

Co do animacji to zadałeś mało precyzyjne pytania. Animacje możesz zrobić w ten sposób:
a) Jeżeli Twoja animacja mieści się w jednej teksturze (klatki są np. poukładane po kolei w prawo)
Używasz funkcji sf::Sprite::setTextureRect(sf::IntRect&);
Dzięki niej przy rysowaniu spritów wyświetlony będzie tylko taki kawałek jaki podasz w argumencie.
b) Jeżeli klatki Twojej animacji to oddzielne tekstury
Używasz funkcji sf::Sprite::setTexture(sf::Texture&);
Dzięki niej ustawisz określoną teksturę Spritowi.

Ogólne informacje:
Powinieneś używać powyższych funkcji wtedy gdy chcesz zmienić klatkę, przykładowo:
C/C++
double zmianaKlatki = 1 /( double )( 2 ); // zmiana co pol sekundy
int aktualnaKlatka = 0; // dajmy na to ze masz 2 klatki animacji - 0 i 1
sf::Clock zegarAnimacji;
sf::Sprite spriteDoWyswietlenia;
sf::Texture zestawAnimacji;
zestawAnimacji.loadFromFile( "animacja.png" );
spriteDoWyswietlenia.setTexture( zestawAnimacji );

while( warunek_glownej_petli )
{
   
    //przy wyswietlaniu
    if( zegarAnimacji.getElapsedTime().asSeconds() >= zmianaKlatki )
    {
        zegarAnimacji.restart();
       
        if( klatkaAnimacji == 0 )
        {
            klatkaAnimacji = 1;
            spriteDoWyswietlenia.setTextureRect( sf::IntRect( 40, 0, 80, 40 );
        }
        else if( klatkaAnimacji == 1 )
        {
            klatkaAnimacji = 0;
            spriteDoWyswietlenia.setTextureRect( sf::IntRect( 0, 0, 40, 40 );
        }
    }
    // Wyswietl sprite
}
P-123911
NopeDotAvi
» 2015-01-03 15:24:09
C/C++
if( klatkaAnimacji == 1 ) klatkaAnimacji = 0;
else if( klatkaAnimacji == 0 ) klatkaAnimacji = 1;

można zapisać
klatkaAnimacji = !klatkaAnimacji;
P-123931
RazzorFlame
» 2015-01-03 16:10:13
Niezłe spostrzeżenie :) W sumie to się nigdy nie zastanawiałem nad tym.
P-123938
kubawal
» 2015-01-03 16:47:21
A o Box2D po polsku najlepiej poczytać tu: [C++] Box2D w pigułce
P-123944
« 1 »
  Strona 1 z 1