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

[SFML 2.1] Timer aktualizujący sie co 1sec.

Ostatnio zmodyfikowano 2014-02-07 20:19
Autor Wiadomość
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.

C/C++
#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.
P-104173
MrPoxipol
» 2014-02-07 14:59:15
Pewnie chodzi ci o reset zegara: sf::Clock::restart().
P-104175
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
P-104176
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:
C/C++
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;
        // cooldown finished
    }
}
P-104194
« 1 »
  Strona 1 z 1