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

Regulacja prędkości przetwarzania jednostek

Ostatnio zmodyfikowano 2024-05-19 23:22
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
Regulacja prędkości przetwarzania jednostek
» 2024-05-19 19:58:24
Za radą jednego użytkownika postanowiłem zwiększyć ilość FPS w mojej grze z 15 do 60. Potworki zaczęły się poruszać 4 razy szybciej więc skorzystałem z funkcji calculateCurrentFrame(dt), którą doradził mi pekfos. Prędkość potworków zmalała, ale atak nadal jest wyprowadzany z częstotliwością karabinu maszynowego i nie wiem jak się za to zabrać. Czy taki attackTimer będzie dobrym rozwiązaniem ?

C/C++
void calculateCurrentFrame( float dt ) {
   
countdown -= dt;
   
while( countdown <= 0.0f ) {
       
countdown += 1.0f / 12.0f; // 12 FPS
       
step += 1.0f;
   
}
   
}

void update( float dt ) {
   
   
float distance = 15.0f * stepSize * dt;
   
   
if( state == states::fight ) {
       
       
if( playerInAttackRange() ) {
           
           
if( step == 3 )
               
 player->takeDamage( 2 );
           
           
calculateCurrentFrame( dt );
           
           
step += 1.0f;
           
if( step > 3.0f )
               
 step -= float( step / 3 ) * 3.0f;
           
           
sprite->setTexture( * fightTextures[ direction * 4 + step ] );
       
}
       
else if( playerInViewRange() ) {
           
target_x = player->x;
           
target_y = player->y;
           
state = states::run;
           
step = 0;
       
}
       
else
       
{
           
state = states::idle;
           
step = 0;
       
}
    }
}
P-181108
DejaVu
» 2024-05-19 20:53:23
Coś słabo idzie Ci używanie ChatGPT, jeżeli z każdym prostym pytaniem lecisz na forum.

1. Mechanika gry ma mieć stałe 10-30 FPS (wedle preferencji - po prostu ustalasz jakąś stałą) i nazywasz to 'tickami'.
2. Renderowanie rozgrywki ma mieć interpolacje między klatkami wynikającymi z mechaniki gry (nie ważne więc czy będziesz miał 5 FPS czy 200 FPS, bo interpolacja zapewni płynną rozgrywkę).
3. Do obliczania 'kiedy' zdarzenie ma 'zajść' wykorzystujesz 'ticki'.

Przykładowo: pocisk nowy może powstać raz np. na 5 ticków. Jeżeli następuje strzał, to możesz zapisać sobie informację:
C/C++
void Unit::shoot()
{
   
if( m_colddown > 0 )
       
 return;
   
   
m_colddown = 5;
   
//TODO: implementacja strzału (np. zespanowanie pocisku)
}

Z kolei w metodzie update piszesz:
C/C++
void Unit::update()
{
   
//... istniejący kod
   
if( m_colddown > 0 )
       
 --m_colddown;
   
}
P-181109
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-19 21:23:27
zrobiłem coś takiego. Jak oceniasz pomysł ?
C/C++
void calculateCurrentFrame( float dt ) {
   
countdown -= dt;
   
while( countdown <= 0.0f ) {
       
countdown += 1.0f / 12.0f; // 12 FPS
       
step += 1.0f;
   
}
   
}

void update( float dt ) {
   
   
float distance = 15.0f * stepSize * dt;
   
   
if( state == states::fight ) {
       
       
if( playerInAttackRange() ) {
           
           
if( colddown == 0 ) {
               
player->takeDamage( 2 );
               
colddown = attackColddown;
               
step = 0.0f;
           
}
           
           
int frame =( colddown / attackColddown ) * 4.0f - 1.0f;
           
sprite->setTexture( * fightTextures[ direction * 4 + frame ] );
           
       
}
       
else if( playerInViewRange() ) {
           
target_x = player->x;
           
target_y = player->y;
           
state = states::run;
           
step = 0;
       
}
       
else
       
{
           
state = states::idle;
           
step = 0;
       
}
       
       
       
    }
   
   
if( colddown > 0.0f )
       
 colddown -= 1.0f;
   
}
P-181110
pekfos
» 2024-05-19 22:25:45
1. Mechanika gry ma mieć stałe 10-30 FPS (wedle preferencji - po prostu ustalasz jakąś stałą) i nazywasz to 'tickami'.
2. Renderowanie rozgrywki ma mieć interpolacje między klatkami wynikającymi z mechaniki gry (nie ważne więc czy będziesz miał 5 FPS czy 200 FPS, bo interpolacja zapewni płynną rozgrywkę).
3. Do obliczania 'kiedy' zdarzenie ma 'zajść' wykorzystujesz 'ticki'.
Ale żeś skomplikował sprawę. Nie robi gry sieciowej, nie ma sensu wprowadzać ticków i interpolacji. No chyba że bierzesz na siebie pytania ;)

C/C++
if( colddown > 0.0f )
   
 colddown -= dt;
Niech colddown (cooldown?) jest w sekundach i odejmuj sekundy (dt).
P-181111
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-19 22:52:31
dobra, poprawiłem nazewnictwo oraz odejmuję sekundy.

C/C++
void update( float dt ) {
   
   
float distance = 15.0f * stepSize * dt;
   
   
if( state == states::fight ) {
       
       
if( playerInAttackRange() ) {
           
           
if( cooldown <= 0 ) {
               
player->takeDamage( 2 );
               
cooldown = attackTime;
               
step = 0.0f;
           
}
           
           
int frame =( cooldown / attackTime ) * 4.0f - 1.0f;
           
sprite->setTexture( * fightTextures[ direction * 4 + frame ] );
           
       
}
       
else if( playerInViewRange() ) {
           
target_x = player->x;
           
target_y = player->y;
           
state = states::run;
           
step = 0;
       
}
       
else
       
{
           
state = states::idle;
           
step = 0;
       
}
       
       
       
    }
   
   
if( cooldown > 0.0f )
       
 cooldown -= dt;
   
}
P-181112
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-19 23:22:01
dobra wszystko działa :-)
P-181113
« 1 »
  Strona 1 z 1