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

[SFML] Problem z mierzeniem czasu ile sekund wciśnięty jest przycisk.

Ostatnio zmodyfikowano 2013-09-07 20:18
Autor Wiadomość
domin568
Temat założony przez niniejszego użytkownika
[SFML] Problem z mierzeniem czasu ile sekund wciśnięty jest przycisk.
» 2013-09-07 13:28:44
Witam , mam problem jak dobrze obliczyć jak długo wciśnięta jest spacja , na potrzeby obliczania siły strzału . Mój kod to :
C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) )
{
    sf::Clock clock;
    sf::Time elapsed1 = clock.getElapsedTime();
    std::cout << elapsed1.asMilliseconds() << std::endl;
   
   
}
Jednak gdy wciskam spacje to pokazuje mi 0 . Jak można to poprawnie zrobić ??
P-91620
MrPoxipol
» 2013-09-07 13:43:55
C/C++
if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space )
{
    clock.restart();
}

if( event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Space )
{
    sf::Time t = clock.getElapsedTime();
    std::cout << t.asSeconds() << std::endl;
}
gdzie clock to globalny obiekt klasy sf::Clock.

Czy było to takie trudne? Wystarczy przemyśleć jak to ma działać i wszystko widać w kodzie. W powyższym kodzie mogą być błędy, bo z jest z głowy.

Co do Twojego kodu, to wystarczy zerknąć w dokumentacje i zobaczysz co robi metoda restart() ;)
P-91622
domin568
Temat założony przez niniejszego użytkownika
» 2013-09-07 14:45:06
Ta metoda niby działa , ale działa co jakieś 50 -te kliknięcie przycisku . Tak jakby bardzo trudno by mu było załapać to .
Gracz.cpp
C/C++
bool Pilka::strzalPilki( float predkosc, sf::RenderWindow & okno )
{
   
   
    while( okno.pollEvent( event ) )
    {
        if( event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::C )
        {
            cout << "AAAA" << endl;
            clockk.restart();
        }
       
        if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::C )
        {
            cout << "AAAA " << endl;
            sf::Time t = clockk.getElapsedTime();
            std::cout << t.asSeconds() << std::endl;
        }
    }
   
    return true;
   
   
}
Gra.cpp
C/C++
while( okno.pollEvent( zdarzenie ) )
{
    Pilka.strzalPilki( 10, okno );
}
P-91626
killjoy
» 2013-09-07 14:49:43
Rób to na bezpośrednim dostępie do klawiatury, zamiast na eventach.
P-91627
Bimbol
» 2013-09-07 15:14:43
C/C++
#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;

int main()
{
    enum Key { PRESSED, RELEASED };
    Key Space = RELEASED;
    sf::Clock clock;
    sf::RenderWindow Window( sf::VideoMode( 800, 600 ), "Czasomierz" );
    while( Window.isOpen() )
    {
        sf::Event Event;
        while( Window.pollEvent( Event ) )
        {
            if( Event.type == sf::Event::KeyPressed )
            if( Event.key.code == sf::Keyboard::Space )
            {
                if( Space != PRESSED )
                {
                    clock.restart();
                    Space = PRESSED;
                    cout << "Wcisnieto spacje" << endl;
                }
            }
            if( Event.type == sf::Event::KeyReleased )
            if( Event.key.code == sf::Keyboard::Space )
            {
                Space = RELEASED;
                cout << "Trzymales spacje przez: " << clock.restart().asSeconds() << endl;
            }
        }
    }
    return EXIT_SUCCESS;
}

Masz przykład, o ile o to Ci chodziło :)
P-91629
domin568
Temat założony przez niniejszego użytkownika
» 2013-09-07 15:32:01
Bimbol dzięki za pomoc , jeżeli ten kod skopiuje na czysty projekt to mi działa , ale jak chce to wykorzystać w mojej grze to już jest źle . Jak wykorzystuje go w grze :
metoda w klasie :
C/C++
bool Pilka::strzalPilki( float predkosc, sf::RenderWindow & okno, sf::Clock clock )
{
    enum Key { PRESSED, RELEASED };
    Key Space = RELEASED;
    while( okno.pollEvent( event ) )
    {
       
       
       
       
        if( event.type == sf::Event::KeyPressed )
        if( event.key.code == sf::Keyboard::Space )
        {
            if( Space != PRESSED )
            {
                clock.restart();
                Space = PRESSED;
                cout << "Wcisnieto spacje" << endl;
            }
        }
        if( event.type == sf::Event::KeyReleased )
        if( event.key.code == sf::Keyboard::Space )
        {
            Space = RELEASED;
            cout << "Trzymales spacje przez: " << clock.restart().asSeconds() << endl;
        }
    }
    return true;
   
   
}

Gra.cpp miejsce wywołania :
C/C++
sf::Clock clock;
while( okno.isOpen() )
{
   
   
   
   
    gracz[ 0 ].graczMove( 1 );
    gracz[ 1 ].graczMove( 2 );
    Pilka.poruszajPilka();
    gracz[ 0 ].kolizjaGraczGracz( gracz );
    Pilka.kolizjaGraczPilka( gracz[ 1 ], 1 );
    Pilka.kolizjaGraczPilka( gracz[ 0 ], 0 );
    gracz[ 0 ].poruszajGracz( gracz[ 0 ].getPredkosc() );
    gracz[ 1 ].poruszajGracz( gracz[ 1 ].getPredkosc() );
    Pilka.isPilkaInBoisko( oknoKolizje );
    gracz[ 0 ].isInBoisko( oknoKolizje );
    gracz[ 1 ].isInBoisko( oknoKolizje );
   
   
    while( okno.pollEvent( zdarzenie ) )
    {
        Pilka.strzalPilki( 10, okno, clock );
    }
P-91631
MrPoxipol
» 2013-09-07 16:00:18
Masz podwójnie pollEvent()..
P-91634
domin568
Temat założony przez niniejszego użytkownika
» 2013-09-07 16:30:33
Mimo usunięcia tego nic mi to nie dało . A poza tym można tak robić .
P-91642
« 1 » 2
  Strona 1 z 2 Następna strona