Regulacja prędkości przetwarzania jednostek
Ostatnio zmodyfikowano 2024-05-19 23:22
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 ? void calculateCurrentFrame( float dt ) { countdown -= dt; while( countdown <= 0.0f ) { countdown += 1.0f / 12.0f; 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; } } }
|
|
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ę: void Unit::shoot() { if( m_colddown > 0 ) return; m_colddown = 5; }
Z kolei w metodzie update piszesz: void Unit::update() { if( m_colddown > 0 ) --m_colddown; }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-19 21:23:27 zrobiłem coś takiego. Jak oceniasz pomysł ? void calculateCurrentFrame( float dt ) { countdown -= dt; while( countdown <= 0.0f ) { countdown += 1.0f / 12.0f; 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; }
|
|
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 ;) if( colddown > 0.0f ) colddown -= dt; Niech colddown (cooldown?) jest w sekundach i odejmuj sekundy (dt). |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-19 22:52:31 dobra, poprawiłem nazewnictwo oraz odejmuję sekundy. 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; }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-19 23:22:01 dobra wszystko działa :-)
|
|
« 1 » |