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

Snake - odczytywanie pozycji / opóźnienie

Object Storage Arubacloud
0 głosów
209 wizyt
pytanie zadane 27 lutego 2018 w JavaScript przez Yashe Dyskutant (7,720 p.)

Witam serdecznie

Mój snake posiada pewne koordynaty (zawsze są podzielne przez 10) np. 

snakeX = 200
snakeY = 300

Funkcja głowy tego snake'a powtarzana jest co 100ms. Gdy trafia na jedzenie, chciałbym aby ogon utworzył się w miejscu 100ms wcześniej gdzie była głowa. I powtarzać tak cały czas... czyli trafiamy kolejny raz na jedzenie to kolejna część ciała maluje się na pozycji 100ms wcześniej niż poprzedni ogon.
Jak takie coś napisać.. czy to w ogóle możliwe ?

1 odpowiedź

0 głosów
odpowiedź 27 lutego 2018 przez ShiroUmizake Nałogowiec (46,300 p.)
Jeżeli zapisujesz jego pozycje w ostatnim elemencie plus przesunięcie to tak.
komentarz 27 lutego 2018 przez Yashe Dyskutant (7,720 p.)
edycja 27 lutego 2018 przez Yashe
Jest zmienna która ustala pozycje oraz dodaje do niej przesunięcie w zależności od kierunku.

Jak zatem mam malować kolejny element i odnosić się do niego w kolejnych fragmentach skryptu?  Funkcja setTimeout() opóźniona o dwa razy bardziej niż głowa snak'a nie zadziała, gdyż ta opóźnia jest względem realnego czasu wykonania skryptu, a nie względem innej funkcji. A to byłaby najlepsza opcja... aby ogon przyjmował pozycję o 100ms wcześniejszą niż głowa węża
komentarz 27 lutego 2018 przez Alwox Gaduła (4,840 p.)

Funkcja setTimeout() opóźniona o dwa razy bardziej niż głowa snak'a nie zadziała, gdyż ta opóźnia jest względem realnego czasu wykonania skryptu, a nie względem innej funkcji.

setTimeout() opóźnia wykonanie funkcji od momentu jej wywołania - to "względem" czego zależy tylko od miejsca w jakim ją wywołasz

A to byłaby najlepsza opcja... aby ogon przyjmował pozycję o 100ms wcześniejszą niż głowa węża

milisekundy nie są jednostką odległości ;p żeby ustawić mu pozycję taką jak była prędzej musisz mieć ją również zapisaną żeby mieć się do czego odwołać. Opisz konkretniej z czym masz problem bo nie bardzo rozumiem. Samo poruszanie się nim jest ok, problem jest tylko z jedzeniem i rośnięciem? Czy na razie masz samą głowę i problem jest z resztą? Podziel sobie to na takie jak najmniejsze etapy i podaj z którym konkretnie masz problem. 

komentarz 27 lutego 2018 przez Yashe Dyskutant (7,720 p.)

Ohh oczywiście !

To co działa:

  • Malowanie kwadratu 10px na 10px, który jest głową snake'a 
  • Poruszanie się snake'a na osi za pomocą dodawania/odejmowania 10px w osiach X/Y.. oczywiście w zależności od klikniętej strzałki na klawiaturze
  • Losowe generowanie jedzenia za pomocą Math.random (do tego, zawsze wypada ono we współrzędnych podzielnych przez 10)

 Np.:

  1. x: 310, y: 240
  2. x: 10, y:440
  3. x: 11 y: 154 // nie uświadczymy
  • Sprawdzenie czy głowa dotknęła jedzenie, jeżeli tak dodajemy 1 punkt to scoreboardu (sprawdzenie polega na porównaniu współrzędnych jedzenia, wraz z głową <czy są te same> i jeżeli tak to... jedzenie pojawia się w nowym miejscu...
  • ... i tutaj mam problem. Chodzi o dodawanie części ciała po zjedzeniu
  • Powtarzanie wszystkich funkcji w odstępie 100ms (malowanie planszy, snake'a, jedzenia) - aby stworzyć imitację poruszania się / animacji

Przed ostatni punkt powoduje u mnie problemy gdyż nie wiem jak:

  1. Sprawić aby to co zjemy zawsze trafiało na ostatni człon ciała
  2. Aby poruszało się to jak w prawdziwym snake'u, czyli głowa daje kierunek, a ciało podąża za głową

Jedyne na co wpadłem to właśnie.. logiczna koncepcja, że każda część ciała będzie znajdowała się tam gdzie wcześniej była głowa sad Niestety nic mi nie przychodzi do głowy z implementacją.. 

1
komentarz 28 lutego 2018 przez Alwox Gaduła (4,840 p.)
Możesz na przykład zrobić dwuwymiarową tabelę w której każda para będzie określała położenie jednego fragmentu węża. W trakcie poruszania zmieniasz położenie przesuwając te wartości np załóżmy, że głowa to tab[0], wtedy do niej podajesz wartość nowych koordynat, a później lecisz od końca tab[x] = tab[x-1]. Żeby zrobić rośnięcie dodajesz na końcu tabeli nową parę. Oczywiście sposobów na zrobienie tego będzie całkiem sporo ale ten powinien być najprostszy do zrozumienia.

Podobne pytania

0 głosów
1 odpowiedź 242 wizyt
pytanie zadane 31 stycznia 2017 w JavaScript przez Weenter Użytkownik (830 p.)
0 głosów
3 odpowiedzi 614 wizyt
pytanie zadane 25 lutego 2018 w JavaScript przez Yashe Dyskutant (7,720 p.)
0 głosów
1 odpowiedź 250 wizyt
pytanie zadane 22 października 2019 w JavaScript przez DeaDHanter Nowicjusz (210 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...