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

Snake - odczytywanie pozycji / opóźnienie

VPS Starter 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ź 224 wizyt
pytanie zadane 31 stycznia 2017 w JavaScript przez Weenter Użytkownik (830 p.)
0 głosów
3 odpowiedzi 589 wizyt
pytanie zadane 25 lutego 2018 w JavaScript przez Yashe Dyskutant (7,720 p.)
0 głosów
1 odpowiedź 246 wizyt
pytanie zadane 22 października 2019 w JavaScript przez DeaDHanter Nowicjusz (210 p.)

92,347 zapytań

141,148 odpowiedzi

318,723 komentarzy

61,781 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...