• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Grid aligned movement z delta time - Snake

42 Warsaw Coding Academy
0 głosów
191 wizyt
pytanie zadane 27 sierpnia 2019 w C i C++ przez niezalogowany

 Witam, ostatnio postanowiłem ulepszyć moją implementację Snake'a o delta time. Mój problem polega na tym, że gracz porusza się po gridzie. Wcześniej movement polegał na przesuwania gracza o rozmiar "komórki" co klatke, więc wartości x i y były całkowite, teraz gdy mnożę prędkość gracza przez timestep wszystko się posypało i już nie jest dopasowane do grid'a. Byłbym wdzięczny, gdyby ktoś mógł mnie naprowadzić na rozwiązanie tego problemu.

const int BOARD_CELL = 20;

const float snakeSpeed = 0.5;

float timeStep;
float lastFrameTime;

void Run()
{
	while (!gameOver)
	{
		float time = (float)al_get_time() * 1000.0;
		timeStep = time - lastFrameTime;
		lastFrameTime = time;

		Input(timeStep);

                //reszta głównej pętli gry
        }
}

void Input(float timeStep)
{
			switch (game->keys)
			{
				case UP:
					position.y -= (snakeSpeed * timeStep);
					break;

				case DOWN:
					position.y += (snakeSpeed * timeStep);
					break;

				case LEFT:
					position.x -= (snakeSpeed * timeStep);
					break;

				case RIGHT:
					position.x += (snakeSpeed * timeStep);
					break;
			}
		}
}

Wcześniej było np. position.x += BOARD_CELL;

1 odpowiedź

0 głosów
odpowiedź 27 sierpnia 2019 przez tangarr Mędrzec (155,180 p.)
wybrane 30 sierpnia 2019
 
Najlepsza

Dodałbym dwie zmienne: next_position i direction;
Na podstawie prędkości ustaliłbym ile czasu trwa jedno przesuniecie o pełną komórkę (timeMoveCell).
W funkcji Input ustawiałbym zmienną direction (up={0,-1} down={0,1} left={-1,0} right={1,0})
Dodałbym po inpucie dodałbym pętlę przesuwającą węża:

while (timeStep > timeMoveCell) {
    position = next_position;
    TestCollision();
    next_position = position + direction;
    timeStep -= timeMoveCell;
}

I na koniec dałbym funkcję wyznaczającą pozycję do narysowania (interpolacja od position do next_position bazująca na (float)timeStep/timeMoveCell)

komentarz 28 sierpnia 2019 przez niezalogowany
Dziękuję za odpowiedź. Jeszcze jedno pytanie, sam wymyśliłeś tą metodę czy może jest możliwość gdzieś poczytać o tym?
komentarz 28 sierpnia 2019 przez tangarr Mędrzec (155,180 p.)
Dopasowałem znane pojęcie (animacja bazująca na ujęciach kluczowych) do twojego problemu.

Podobne pytania

0 głosów
0 odpowiedzi 170 wizyt
pytanie zadane 19 sierpnia 2017 w Java przez ThunderEagle Nowicjusz (200 p.)
0 głosów
1 odpowiedź 503 wizyt
pytanie zadane 31 sierpnia 2019 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 15 stycznia 2019 w JavaScript przez MrxCI Dyskutant (8,260 p.)

93,379 zapytań

142,380 odpowiedzi

322,533 komentarzy

62,734 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...