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

[SFML] Poruszanie Sprita przy pomocy strzałek wolne działanie

Ostatnio zmodyfikowano 2012-11-14 20:34
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[SFML] Poruszanie Sprita przy pomocy strzałek wolne działanie
» 2012-11-14 15:33:06
Poniżej prezentuję kod programu którego zadaniem jest przemieszczanie obiektu przy pomocy strzałek w prawo i lewo. Program działa tak jak działa... Proszę zwrócić uwagę na zmienną statx w instrukcjach if. Zmienna statx jest zwiekszana co pięć jednostek ale porusza się z taką prędkością jaką można w SFML 1.6 osiągnąć pisząc statx+=0.5. Jednym słowem bardzo "muli". Czy to jest normalne zachowanie w SFML 2.0 Czy jakieś niedorobienie? Czy może wina mojego komputera? Co więcej w czasie przesuwania obiektu strzałką np w lewo i naciśnięciu w między czasie innego klawisza np spacji, powoduje nagłe zatrzymanie obiektu. Dopiero ponowne naciśniecie strzałki i zwolnienie spacji pozwala na dalsze przesuwanie obiektu... Czym to wszystko co opisałem wyżej, może być spowodowane? Kod wydaje mi się że jest napisany poprawnie...!? więc gdzie "pies pogrzebany"? Co robić?  Pomocy!

C/C++
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow App( sf::VideoMode( 640, 480, 32 ), "Klawisze strzalek poruszanie" );
    sf::Texture statek;
    statek.loadFromFile( "statek.png" );
    sf::Sprite Statek( statek );
   
    float statx = 320, staty = 420;
   
    while( App.isOpen() )
    {
        App.clear();
        sf::Event Event;
       
        while( App.pollEvent( Event ) )
        {
           
            if(( Event.type == sf::Event::Closed ) ||( Event.type == sf::Event::KeyPressed ) &&( Event.key.code == sf::Keyboard::Escape ) )
           
            {
                App.close();
            }
            else if(( Event.type == sf::Event::KeyPressed ) &&( Event.key.code == sf::Keyboard::Left ) )
           
            {
                statx -= 5.0;
               
            }
            else if(( Event.type == sf::Event::KeyPressed ) &&( Event.key.code == sf::Keyboard::Right ) )
            {
                statx += 5.0;
            }
           
        }
       
        Statek.setPosition( statx, staty );
        App.draw( Statek );
        App.display();
       
    }
    return EXIT_SUCCESS;
}
P-69240
bingo009
» 2012-11-14 18:33:51
Co do pierwszego to nie wiem, bo sam mam z tym problem, ale z drugim mogę ci powiedzieć. Jeżeli chcesz obsłużyć więcej, niż jeden klawisz, to nie opieraj tego na Eventach. Teraz jak naciśniesz też Spację, to Eventy pokrywają się i nic z tego nie wychodzi. Odwołuj się bezpośrednio do klawiatury, to rozwiąże problem.
P-69256
RazzorFlame
» 2012-11-14 18:36:07
Nie wiem czy to jest w SFML 2 ale w 1.6 jest bezpośredni dostęp do sprzętu typu klawiatura, joy itd. Zainteresuj się sf::Input w SFML 1.6 i metodą klasy sf::RenderWindow::GetInput(). Jest poza tym dokumentacja na oficjalnej stronie.

BTW. Wiesz co to opóźnienie klawiszy? W zwykłych eventach tak jest. Jest to przydatne powiedzmy w EditBox-ie bo klawisze zaczynają powtarzać się dopiero po ustalonym w opcjach klawiatury (w panelu sterowania) opóźnieniu.
P-69257
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-11-14 18:37:01
A jakby to odwołanie miało z grubsza wyglądać? Mogę prosić o kawałek kodu?
P-69258
RazzorFlame
» 2012-11-14 18:42:19
Moge ci podać w sfml 1.6 bo z niego korzystam:
C/C++
while( app.IsOpened() )
{
    while( app.GetEvent( appEvent ) )
    {
        jakiestam zdarzenia
    }
    const sf::Input & in = app.GetEvent();
    if( in.IsKeyDown( id keya np sf::Key::Up ) wykonaj costam;
    //wyswietlanie okna itd
}
P-69259
bingo009
» 2012-11-14 19:20:20
Jest napewno bezpośrednie odwoływanie się do klawiatury, bo sam to używałem, tylko skasowałem kod. Poszukaj na stronie SFML, w Tutorialach i Dokumentacji.
P-69264
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-11-14 20:34:29
Już wszystko gra i buczy. Bardzo wam dziękuję za rozwiązanie problemu.
P-69270
« 1 »
  Strona 1 z 1