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

[SDL2 OpenGles2] Animowanie Sprajtów

Ostatnio zmodyfikowano 2024-01-30 20:41
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SDL2 OpenGles2] Animowanie Sprajtów
» 2024-01-30 20:28:00
Witam.
Piszę grę i zastanawiam się jak poprawnie animować bohatera w grze.

Klasa bohatera:
C/C++
enum class direction { N, S, W, E };

class unit
{
public:
   
float x, y; // pozycja jednostki
   
float rx, ry; // promienie elipsy do kolizji
   
float s; // skala wielkości jednostki
   
float tw, th; // szerokość oraz wysokość textury
   
float cx, cy; // punkt środkowy jednostki na teksturze
   
   
int time; // czas ?!?!
   
   
bool run; // czy jednostka się porusza
   
direction dir; // w którą stronę skierowana jest jednostka
   
float speed; // prędkość piksele na sekundę
   
    // frames
   
float distance; // dystans pikseli które przemierzy jednostka między
    // ostatnią a pierwszą klatką animacji
   
float currentFrame; // obecnie wyświetlana klatka animacji
   
    // klatki
   
GLuint tex_N[ 4 ]; // 4x Północ
   
GLuint tex_S[ 4 ]; // 4x Południe
   
GLuint tex_W[ 4 ]; // 4x Zachód
   
GLuint tex_E[ 4 ]; // 4x Wschód
   
   
unit();
   
~unit();
   
void move( direction ); // ustawia run na true i wyznacza kierunek ruchu
   
void setPosition( float, float ); // usta
   
void update( int time ); // wykonuje ruch i ustawia nową klatkę
   
void render( camera * ); // rysowanie postaci
};

No i dorzucę jeszcze całkowicie błędną funkcję update. Nie rozumiem w ogóle jak przetwarzać czas i jak wyznaczyć obecną klatkę animacji i z tym właśnie zwracam się do was.
C/C++
void unit::update( int time )
{
   
if( time / FPS > this->time / FPS )
   
{
       
if( run )
       
{
           
if( dir == direction::N ) y += speed * s;
           
           
if( dir == direction::S ) y -= speed * s;
           
           
if( dir == direction::W ) x -= speed * s;
           
           
if( dir == direction::E ) x += speed * s;
           
           
currentFrame += 1;
           
           
if( currentFrame >= 4.0f )
               
 currentFrame = 0;
           
           
this->time = time;
           
run = false;
       
}
    }
}
P-180630
tBane
Temat założony przez niniejszego użytkownika
» 2024-01-30 20:41:22
Jednak rozwiązałem sam ten problem. Działa.

C/C++
currentFrame +=( speed * s ) /( distance * s ); // distance - przebyty dystans pomiędzy pierwszą a ostatnią klatką, s - skala
P-180631
« 1 »
  Strona 1 z 1