[SFML 2.1] Timer aktualizujący sie co 1sec.
Ostatnio zmodyfikowano 2014-02-07 20:19
marcin107 Temat założony przez niniejszego użytkownika |
[SFML 2.1] Timer aktualizujący sie co 1sec. » 2014-02-07 14:53:35 Witam, bawiłem się ostatnio SFML'em i przyszła w grze pora na zrobienie cooldown'ów na atak fizyczny. Wszystko by było fajnie, gdyby zegar nie odświeżał się co 1 sec. #include <SFML/Graphics.hpp> #include <SFML/System.hpp> #include <iostream>
using namespace std;
int main() { float attackspeedplayer = 1.5; float attackspeedtotal = 1 / attackspeedplayer; sf::RenderWindow window( sf::VideoMode( 200, 200 ), "SFML works!" ); sf::CircleShape shape( 100.f ); shape.setFillColor( sf::Color::Green ); sf::Clock clock; sf::Time elapsed; while( window.isOpen() ) { elapsed = clock.getElapsedTime(); cout << attackspeedtotal - elapsed.asMilliseconds() / 1000 << endl; if( attackspeedtotal - elapsed.asMilliseconds() / 1000 == 0 ) { cout << "CD minal!"; } sf::Event event; while( window.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) window.close(); } window.clear(); window.display(); } return 0; }
Objaśnienia: Po wykonaniu działania wartość początkowa zegara to: 0,666666667 i chcę żeby cooldown zakończył się na 0, lecz nie jest to możliwe, bo następną aktualizacją zegara jest dopiero -0,333333333. Czy można to zrobić inaczej tak, żeby odliczyło tylko to 0,6666667 i coś się stało? Proszę o pomoc. |
|
MrPoxipol |
» 2014-02-07 14:59:15 Pewnie chodzi ci o reset zegara: sf::Clock::restart(). |
|
marcin107 Temat założony przez niniejszego użytkownika |
» 2014-02-07 15:00:05 chodzi mi o to, że żeby coś się stało, to i tak muszę poczekać 1 sec, zamiast 0,66666667. W tym wypadku warunek się nie spełni, ale jeśli zmienimy warunek logiczny na <= to poczekamy wtedy cała sekundę, zamiast 0,666667 |
|
marcin107 Temat założony przez niniejszego użytkownika |
» 2014-02-07 20:19:15 Gdyby kogoś to interesowało, to na forum SFML otrzymałem taką odpowiedź, która działa: sf::Time cooldown; cooldown = sf::seconds( 0.5f ); sf::Clock frameclock; sf::Time elapsedtime; while( window.isOpen() ) { elapsedtime += frameclock.restart(); if( elapsedtime >= cooldown ) { elapsedtime = sf::Time::Zero; } }
|
|
« 1 » |