c++/ SFML - Sterowanie (postacią)

0

Witajcie. Da się zrobić tak, że od razu przy wciśnięciu klawisza i trzymaniu postać (obiekt) będzie się przemieszczać? Jeżeli wcisnę np. strzałkę to obiekt się przesunie o daną ilość pikseli, a przy trzymaniu ruszy dopiero po ok. sekundy, to tak jak przytrzymać klawisz litery to znak się pojawi i po ok. sekundzie zacznie spamić. W grach jak przytrzymasz np. 'w' to biegniesz od razu do przodu, co chciałbym osiągnąć. Moja pętla główna wygląda mniej więcej tak:

while(okno.isOpen()){
while (okno.pollEvent(zdarzenie)){
if (Keyboard::isKeyPressed(Keyboard::Right)) sprite.move(1,0);
else if (Keyboard::isKeyPressed(Keyboard::Up)) sprite.move(0,-1);
else if (Keyboard::isKeyPressed(Keyboard::Left)) sprite.move(-1,0);
else if (Keyboard::isKeyPressed(Keyboard::Down)) sprite.move(0,1);
if (zdarzenie.type == Event::Closed) okno.close();
}
okno.clear(Color::White);
okno.draw(sprite);
okno.display();
}
Z góry dzięki za pomoc

1

Zrób zdarzenie na keyDown (czy jakoś tak się to będzie nazywało, chodzi o moment w którym klawisz jest wciśnięty, a nie naciśnięty i puszczony).Zczytaj kod klawisza i wrzuć go do tablicy. Następnie zdarzenie keyUp (klawisz zostaje puszczony) który będzie dany klawisz z tablicy usuwał. W pętli sprawdzaj jakie klawisze są wciśnięte (odczytaj tablicę) i na podstawie tych danych zmieniaj wartości obiektu postaci.

0

Zaraz spróbuję to rozkminić. Dzięki za pomoc

Edycja:

Zrobiłem tak i działa jak powinno. Może tak zostać?

while (app.isOpen())
{
if (kierunek[0]) sprite.move(0,1);
if (kierunek[1]) sprite.move(0,-1);
if (kierunek[2]) sprite.move (-1,0);
if (kierunek[3]) sprite.move(1,0);
sf::Event event;
while (app.pollEvent(event))
{
if (event.type == sf::Closed)
app.close();
if( sf::isKeyPressed( sf::Down ) ) kierunek[0]=true;
if (event.type == sf::KeyReleased && event.key.code == sf::Down ) kierunek[0]=false;
if( sf::isKeyPressed( sf::Up ) ) kierunek[1]=true;
if (event.type == sf::KeyReleased && event.key.code == sf::Up ) kierunek[1]=false;
if( sf::isKeyPressed( sf::Left ) ) kierunek[2]=true;
if (event.type == sf::KeyReleased && event.key.code == sf::Left ) kierunek[2]=false;
if( sf::isKeyPressed( sf::Right ) ) kierunek[3]=true;
if (event.type == sf::KeyReleased && event.key.code == sf::Right ) kierunek[3]=false;
}
app.clear();
app.draw(sprite);
app.display();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1