Opóźnienie ruchu gracza, SFML

0

Witam, piszę gre w bibliotece SFML i nie wiem jak spowodować opóźnienie ruchu gracza.

Tzn, steruje pająkiem, który generuje nitkę. Strzalkami wybieram kierunek(dostępne tylko 4 - nie można na skos) a pająk po jednym naciśnięciu porusza się sam w wybranym kierunku(nie musze trzymac przycisku). Gdy klikam bardzo szybko, generowana nitka i pozycja pająka moze zmienić się nawet tylko o jeden piksel w osi OY lub OX. Ja chcę, by wykonanie zmiany kierunku odbyło po jakimś minimalnym czasie od ostatniej zmiany kierunku, tzn nawet jakbym klikał bardzo szybko na strzałki(co teraz powoduje zmiany o 1,2 piksele) to pająk skręcałby dopiero po pokonaniu tej minimalnej wymaganej odległości. Czyli, opóźnił bym jego zakręt, powodując tworzenie równych minimalnych odcinków z nitki.

Oczywiscie chciałbym by zapamiętał mi wciśnięty przycisk, i aby utworzyła się 'kolejka' wcisnietych przycisków, jeśli wstukamy ich na tyle dużo, że potem pająk nie będzie nadążał.

Jak uzyskać taki efekt?

moje metody, odpowiedzialne za ruch sprajta:


void sterowanie()
	{
		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
		{
			doGory = true;
			doDolu = false;
			wLewo = false; 
			wPrawo = false;
		}

		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
		{

			doDolu = true;
			doGory = false;
			wLewo = false;
			wPrawo = false;
		}

		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
		{
			wLewo = true;
			doGory = false;
			wPrawo = false;
			doDolu = false;
		}
		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
		{

			wPrawo = true;
			doGory = false;
			doDolu = false;
			wLewo = false;
		}

	}
	sf::Vector2f ruch(RenderWindow &oknoAplikacji)
	{

		v.x = 0;
		v.y = 0;
		if (doGory)
		{
			v.y -= predkosc;
			animacje(oknoAplikacji);
		}
		else if (doDolu)
		{
			v.y += predkosc;
			animacje(oknoAplikacji);
		}
		else if (wLewo)
		{
			v.x -= predkosc;
			animacje(oknoAplikacji);
		}

		else	if (wPrawo)
		{
			v.x += predkosc;
			animacje(oknoAplikacji);
		}
		return v;

	}

0

http://gameprogrammingpatterns.com/
zapoznaj się, zastosuj i wtedy wróć

0

To do czasu kliknięcia, tylko podmien sobie klawisz.
Co do kolejkowania to tak jak powiedział @spartanPAGE obczaj sobie tego linka i obiekt Command

sf::Clock click_clock;
bool buttonHold(int n_msec)
{
    sf::Time time_button_hold;
    if( sf::Mouse::isButtonPressed(sf::Mouse::Left) )
    {
        time_button_hold += sf::Time(click_clock.getElapsedTime());
        if( time_button_hold > sf::milliseconds(n_msec) )
        {
            time_button_hold = sf::Time::Zero;
            click_clock.restart();
            return true;
        }
        else return false;
    }
    else
    {
        time_button_hold = sf::Time::Zero;
        click_clock.restart();
        return false;
    }
}

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