Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [GRA] Kolizje na mapie
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Trzebu
Witam,
Potrzebuję pomocy co do kolizji na mapie 2d. Mapy mam takie same jak w grze Margonem, ale nie mam pojęcia jak zrobić kolizje, czyli jak zrobić żeby gracz nie mógł wchozić np na drzewa na mapie.
Za każdą pomoc dziękuję,
Pozdrawiam
//Proszę o przeniesienie do działu programowanie w PHP
404
Chodziło żebyś zobaczył algorytm i sposób implementacji kolizji.
Trzebu
Właściwie pomyślałem, że można zrobić to własnie tak:
MAP = [[2,2,2,2,2,2,2,2,2,2,2,2],
[2,1,1,1,1,2,1,1,1,1,1,2],
[2,1,1,1,1,2,1,1,1,1,1,2],
[2,1,1,1,1,2,1,1,2,1,1,2],
[2,1,1,1,1,2,1,1,1,1,1,2],
[2,1,1,2,2,2,1,1,1,1,1,2],
[2,1,1,1,1,1,1,1,1,1,1,2],
[2,1,1,1,1,1,1,1,1,1,1,2],
[2,1,1,1,2,2,2,2,2,1,1,2],
[2,1,1,1,1,1,1,1,1,1,1,2],
[2,1,1,1,1,1,1,1,1,1,1,2],
[2,2,2,2,2,2,2,2,2,2,2,2]]
Ale nasuwają się pytania jak to zrobić, bo u mnie mapą jest obraz png i wszystko trzeba podawać w px. Generalnie, to nie ogarniam jakim kodem wywołać kolizję na mapie i w tym tkwię od dłuższego czasu
Pyton_000
Dodajesz sobie do tablicy wsp. kwadratu opisującego obiekt kolizyjny, podczas ruchu sprawdzasz czy nowe koordynaty ruchu nie wchodzą w żaden kwadrat kolizji.
tzm
Śmiejemy się tu w pracy... pozdrowienia z Garmory.
Nie mogę Ci powiedzieć jak to jest w Margonem napisane ale..
W bazie trzymaj współrzędne stałych obiektów na mapie i je sobie do jakiejś globalnej zmiennej zapisuj.
No a potem to już przy każdym ruchu graczem musisz sprawdzać ifem czy może wejść na to pole czy akurat jest na nie blok założony.

edit: aha... i po stronie serwera za każdym razem sprawdzaj też czy gracz stoi tam gdzie stać może. Różnych magików widziałem.
Trzebu
Oo, jak miło. Padły o mnie słowa w Garmory, to zaszczyt dla mnie. Także pozdrawiam, wierny gracz Trzebu.
Ponieważ nie chce mi się na razie robić zapisywania pozycji gracza w bazie zrobiłem to chyba w najprostszy sposób:
  1. if((int)$_POST['x']==0 && (int)$_POST['y']==-32){
  2. echo false;
  3. }

Zrobiłem zaledwie 1/4 mapy w taki sposób i już odczuwa się, że php nie jest zbyt dobrym pomysłem na kolizje.
tzm
Zrób no jakiegoś print screena i rzuć mi na pw bo nie bardzo rozumiem o jakie kolizje Ci chodzi. Kolizje w margonem nie są takie jak na przykład w grach platformowych.
Wiesz co jestem w garmory tylko na stażu ale jakby Thinker rzucił temat zrobienia mini gierki ala margonem to bym to osobiście rozwiązał tak...
Masz X elementów i koordynatów na mapie pobranych z bazy danych, np market, albo karczmę i javascriptem dajesz możliwość kliknięcia w hrefa dopiero jak ktoś jest blisko, powiedzmy 32 pixele od obiektu - to jest pikuś żeby zrobić. Ale klikając w ten link i wysyłając ajaxem dane żądanie do serwera - MUSISZ sprawdzić czy gracz jest w odpowiednim miejscu żeby ten link kliknąć z tego powodu że JS łatwo oszukać.. z drugiego końca świata bym klikał na karczmę w mieście gdzieś w c* daleko. Mówię.. chcesz to dawaj PS na PW bo mam zajawe na pisanie gierek ostatnio.
zegarek84
by zoptymalizować całość mapę powinieneś podzielić na rejony by nie sprawdzać kolizji na całej mapie (zależy jak duża itd...), ogólnie powinieneś poczytać o algorytmach a zwłaszcza o sortowaniu kubełkowym by zminimalizować liczbę przeglądanych elementów na mapie względem odległości, potem możesz niemal wszystkie warunki przyrównywać jakie będziesz potrzebował... zależy co chcesz zrobić i jak bardzo zaawansowanego, jednak i tak celem optymalizacji powinieneś poczytać o algorytmach by wiedzieć jak w aplikacji ułożyć sobie dostęp do danych... np. przy dużej mapie jeśli masz współrzędne gracza i chcesz rzadziej pobierać elementy z bazy to gdy jest nałożony index na X i Y to obiekty możesz pobrać pomiędzy [(X_gracza - zasięg);(X_gracza + zasięg)] oraz [(Y_gracza - zasięg);(Y_gracza + zasięg)], oczywiście jeśli np. w JS masz zaciągniętą całą mapę musisz sobie zaimplementować właśnie odpowiednie algorytmy do przeszukiwania mapy względem pozycji gdyż jeśli ta mapka jest duuuuża to będzie cieło co każde sprawdzenie ruchu/akcji...
tzm
@zegarek84 , wystarczy że podzieli mapę na mniejsze czesci i poki jest w ich zasiegu bedzie to trzymal w zmiennej globalnej map - to czy se ja pan kowalski edytuje zeby sie teleportowac gowno mu da pod warunkiem ze serwer bedzie zabezpieczony przed tego typu akcjami. ja tu nie widze zadnej matematyki i algorytmow. proste ify w zasiegu jakiegos obszaru mapy ktore beda sie wykonywaly po stronie klienta, serwer jest zwolniony od niepotrzebnych przeliczen i kazdemu to pasuje. chocbys nie wiem jak duzy swiat mial to serwera nie zajedziesz przy tym rozwiazaniu. gdzies jak pisalem gre w zycie to mialem funkcje do sprawdzania elementu w tablicy XY.. poszukam tego potem.
zegarek84
Cytat(tzm @ 27.09.2014, 17:18:30 ) *
@zegarek84 , wystarczy że podzieli mapę na mniejsze czesci...

może nie potrzebnie rozpisałem się ale czego dotyczy algorytm sortowania kubełkowego [a o podzieleniu mapy to już pewnie skleroze miałem ;-D ;p)questionmark.gif algorytm ten polega na zatraceniu precyzji, wykorzystując to można efektywnie podzielić mapę i odnajdować sąsiednie kwadraty względem gracza... ale zapomnijmy to co pisałem, to przeszłość gry w plemiona przy intensywnym farmieniu (a znajomym jakoś pasowało udostępnić podobne dogodne narzędzia bez owijania w bawełnę jak to zrobić samemu ;p)...
Trzebu
tzm:
Wysłałem Ci na PV tego ss'a. Co do tego, że mam podzielić tą mapę na fragmenty, słyszałem o tej technice, tylko jak? Mam mapę podzielić na mniejsze kawałki i potem ją w bazie jakoś poskładać i dopiero wyświetlać?

To robimy coś z tymi kolizjami?
tzm
Nie mam czasu ostatnio stąd to milczenie...
Zobacz... Masz mapę 256 x 256 klocków.
Żeby nie pobierać całości od razu i nie zawalać pamięci nie potrzebnie pobieraj sobie 32x32 i zawsze jak jesteś przy granicy to rób sobie update z bazy. No nie wiem jak prościej Ci to wyjaśnić... kolizje kolizjami ale tutaj temat wchodzi na troszkę modelowanie świata gry.
Mam Ci to narysować i pokazać przykład jakbym to zrobił?
Trzebu
Jeżeli Ci się chce, to rozrysuj mi to
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.