Pokaż wyniki od 1 do 7 z 7

Wątek: Chodzenie po mapie, wyświetlanie jej.

  1. #1
    Aktywny
    Dołączył
    Dec 2011
    Posty
    273

    Domyślnie Chodzenie po mapie, wyświetlanie jej.

    Witajcie.

    Zrobiłem edytor map (http://imageshack.us/a/img24/3972/pve9.png) który działa bardzo dobrze, zapisuje mi mapę w takiej formie:
    Kod:
    Tabela `maps`:
    
    ╔═════╦═══╦═══╦═══════╗
    ║ map ║ x ║ y ║ image ║
    ╚═════╩═══╩═══╩═══════╝
    (sam robiłem, mam nadzieję, że ładnie się prezentuje )

    Gdzie kolumna `image` to nie 1, 2, 3, 4, [...]. Wszystkie kafelki są w jednym wielkim obrazie, ta technika nazywa się sprite'ami czy jakoś tak. Czyli mam np. `0123:0456`, gdzie `0123` to pozycja `y` obrazka a `0456` to `x` czy tam na odwrót, domyśleliście się już na pewno jak to działa. Łatwo to w JS rozdzielić i wyświetlić.

    Teraz przy wyświetlaniu planowałem zrobić tak, że z bazy pobieram te kafelki które gracz widzi, a co ruch wczytuje nowe itd. ale przy 30 ruszających się graczach, zbyt dobrym rozwiązaniem to nie będzie. :| Nawet przy 2 będzie kiepsko.
    Potem myślałem, żeby zapisać mapę jako obrazek, ale wtedy musiałbym zmieniać cały edytor map, a potem zastanawiać się jak go zmodyfikować... Następnie wpadłem na pomysł, że mogę zostawić edytor taki jak jest a zmienić tylko sposób wczytywania mapy. Wcześniej już czytałem o canvas'ie no to jeszcze trochę przejrzałem podstawy i pomyślałem, że mógłbym przy wczytywaniu mapy pobrać od razu wszystkie dane dotyczące kafelek i w canvas'ie stworzyć z tego obrazek, potem co ruch po prostu bym nim ruszał. Na pewno byłoby to lepsze, tym bardziej, że wczytanie kafelek byłoby tylko jednym zapytaniem.

    Teraz na szybko napisałem taką funkcję:
    http://jsfiddle.net/Vcvua/14/

    To tylko szkic, wszystko zostanie zmienione, jeżeli będę wczytywał mapy tym sposobem.

    Tak więc, jak wy wczytalibyście mapy wiedząc, że musicie później móc je edytować od razu na stronie?
    Co myślicie o 1 rozwiązaniu (co ruch wczytuje nowe kafelki...)?
    A o 2 (za pomocą canvas'u tworzenie obrazka)?

    Nie chcę abyście mi tylko odpowiedzieli na pytania, wolałbym abyśmy o tym podyskutowali.
    Ostatnio edytowane przez Bartek ; 10-07-2013 o 18:54

  2. #2
    Zarejestrowany Awatar writen
    Dołączył
    May 2010
    Posty
    54

    Domyślnie

    Wczytywanie mapy w canvasie i robienie całej gry opartej o canvas jest według mnie najlepszym sposobem.

    Ja wczytuję do canvasa całą mapę bo nie jest ona duża. - przenaczona dla ok. 20 graczy.

    Teraz przy wyświetlaniu planowałem zrobić tak, że z bazy pobieram te kafelki które gracz widzi, a co ruch wczytuje nowe itd. ale przy 30 ruszających się graczach, zbyt dobrym rozwiązaniem to nie będzie. :| Nawet przy 2 będzie kiepsko.
    Najlepiej na samym początku wczytać całą mapę z bazy (tylko raz), a dopiero później ją wyświetlać. Można ją (pozycje kafelków) wczytać do zmiennych tablicowych lub też do drugiego, niewidocznego canvasa, z którego będzie ona kopiowana na canvas główny.

    Edytor mam wykonany bardzo prymitywny, ale jeszcze się zastanawiam czy nie zrobić go również na canvasie.
    Na początku mapa miała u mnie postać pliku JSON, ale teraz zapisuję ją w bazie podobnie jak ty.

  3. #3
    Zasłużony Awatar Rodkan
    Dołączył
    Mar 2011
    Posty
    1,465

    Domyślnie

    Dla małych map rozwiązanie może i będzie dobre, ale jak będziesz miał większą liczbę pół, ładowanie mapy może stanowić problem. Moim zdaniem lepiej będzie jak będziesz wczytywał kawałkami, np. logując się wczytuje kwadrat 50x50. Gdy znajdujesz się blisko krawędzi, tzn. linii za którą mapa nie jest wczytana doczytuje ci kolejny kwadrat 50x50 lub trochę mniejszy (zależy jak z lagami).

  4. #4
    Zarejestrowany Awatar writen
    Dołączył
    May 2010
    Posty
    54

    Domyślnie

    Mówię, trzeba to rozwiązać tak jak to jest w grach desktopowych. Wszystkie elementy (w tym mapa) są ładowane przed ich wyświetleniem i zapisywane w kodzie pod postacią zmiennych. Jest to taki bufor. Wtedy widzimy ekran ładowania.

    Łączenie się za każdym razem z bazą, żeby wczytać kolejny fragment mapy mija się z celem. Będziemy to już robić w przypadku aktualizacji pozycji graczy, więc samo to może być już dość obciążające.

    Więc tak:
    Inicjalizacja gry - tylko raz, na początku:
    Kod:
    init() {
        pobranie mapy i zapisanie jej w buforze;
    }
    Główna pętla - odtwarzana co jakiś (bardzo krótki) czas:
    Kod:
    main() {
         wyświetlenie fragmentu lub całej mapy (z bufora);
         aktualizacja pozycji graczy;
    }
    Z aktualizacją pozycji graczy rozwiązałem to zupełnie inaczej, bo korzystam z nodeJS i socket.io.
    Dzięki czemu informacja o zmianie pozycji jest wysyłana przez serwer do klienta(przeglądarki).
    No i podczas rozgrywki ani razu nie łączę się z bazą(nie wykonuje żadnych zapytań). - Nie mam potrzeby zapisywania pozycji graczy.

  5. #5
    Zasłużony Awatar Rodkan
    Dołączył
    Mar 2011
    Posty
    1,465

    Domyślnie

    Jak napisałem - twoje rozwiązanie wydaje mi się rozsądne, ale dla ilu pól? Wyobraźmy sobie, że mamy rozbudowaną mapę i wczytujemy 10 000 pól. Co z tego, że na danym logowaniu połowy, ba, ćwiartki tego nie zwiedzimy, ale wczytujemy, bo po co wczytywać później, skoro od razu możemy. I nie sądzę aby w grach na PC wczytywane były obszary które nie są w danym momencie potrzebne, bo to wydaje mi się po prostu głupie. Siedzisz sobie w dolinie i bijesz potwory? Wczytajmy więc region z drugiego krańca mapy, aby potem nie musieć łączyć się z bazą!

  6. #6
    Zarejestrowany Awatar writen
    Dołączył
    May 2010
    Posty
    54

    Domyślnie

    [..]I nie sądzę aby w grach na PC wczytywane były obszary które nie są w danym momencie potrzebne, bo to wydaje mi się po prostu głupie. [...]
    Nie, wyświetlanie tych obszarów byłoby głupie, bo po co skoro ich nie widzimy. Ale żeby je później szybko wyświetlić w razie konieczności muszą być wcześniej wczytane do bufora pamięci.

    Ale wiadomo, każde z tych rozwiązać ma swoje wady i zalety. A w grach wykorzystuje się te, które twórcy gry uznają za najbardziej wygodne. To wszystko przecież zależy od tego ile danych trzeba przetworzyć.

  7. #7
    Programista Awatar Aravorn
    Dołączył
    Apr 2011
    Posty
    343

    Domyślnie

    Wczytuje się sąsiednie obszary, jeszcze niewidoczne.
    Można zbudować system przewidywania, co nie jest takie trudne wbrew pozorom, który na podstawie przewidywanego kierunku ruchu gracza, np. gracz idzie na północ rozszerzy wczytywanie fragmentów z północy, a zawęzi lub zaprzestanie wczytywania chwilowo fragmentów z innych stron - to bardziej zaawansowana taktyka stosowana w wielu bardziej zaawansowanych projektach (nawet naszych rodzimych projektach - jak ktoś przegląda źródła JS, dekompresuje te skompresowane, jak natrafi na frazy w nazwach obiektów / klas: Fuzzy logic, fuzzy control, Mamdani to często chodzi właśnie o to), łączona z geometrią - zamiast dużego kwadratu, przekraczającego widoczność gracza lepiej wczytać dane dotyczące okręgu zbudowanego na sąsiedztwie, a system przewidywania pozwala to zoptymalizować. Tak więc jest to dynamiczne wczytywanie obiektów
    Ale.. jeżeli mapa jest mała, czasami nie ma sensu wczytywać krok po kroku, jak można od razu załadować całość.

    Tekstur wiadomo jest ograniczona liczba, warto je buforować a nawet trzeba. I można w sumie od razu zbuforować wszystkie tekstury z danej mapy (poza innymi postaciami innych graczy) a potem tylko na podstawie danych z bazy ładować co potrzeba. Z drugiej strony to co wspomniałem - trzeba rozważyć, co będzie kosztowniejsze: wczytanie całości danych o mapie czy wczytywanie dynamiczne.

    No i wracając do samej mapy można to było spokojnie zrobić na 3 polach, o czym nie raz wspomniałem, po przemyśleniu sprawy - elastyczny rozwój i optymalizacja.. I rozwinięcie nawet tego co robisz - wygląda to u Ciebie tak, że za każdym razem, nawet przy powtarzaniu się tekstur na nowo je tniesz, co jest jak dla mnie bez sensu (chyba że przeglądarka jakoś fajnie cache'uje po współrzędnych, w co wątpię). Wystarczy raz pociąć i przeprowadzić asocjację z jakąś flagą reprezentującą typ pola, a nie za każdym razem przesyłać współrzędne, z których będzie następowało wycinanie.

    A z resztą lepiej zrobić tak jak napisał writen: koszt jednorazowego wczytania mapy będzie przy odpowiedniej konstrukcji struktury lżejszy niż pobieranie dynamiczne :P Oczywiście dane te wtedy warto trzymać w ramie. No ale jeżeli mapa jest przeogromna to wiadomo - na etapie projektowania trzeba to przewidzieć
    Ostatnio edytowane przez Aravorn ; 11-07-2013 o 10:05

Informacje o wątku

Użytkownicy przeglądający ten wątek

Aktualnie 1 użytkownik(ów) przegląda ten wątek. (0 zarejestrowany(ch) oraz 1 gości)

Podobne wątki

  1. Wyświetlanie graczy na mapie razem z animacją.
    Przez kawus121 w dziale Problemy przy tworzeniu własnej gry
    Odpowiedzi: 1
    Ostatni post / autor: 16-10-2012, 16:36
  2. chodzenie po mapie
    Przez sazian w dziale Budowa gry via www
    Odpowiedzi: 37
    Ostatni post / autor: 30-04-2012, 15:50
  3. Wyświetlanie potworów na mapie
    Przez Zent w dziale Budowa gry via www
    Odpowiedzi: 2
    Ostatni post / autor: 24-03-2012, 10:06
  4. Wyświetlanie grafik postaci na mapie.
    Przez Croos w dziale Problemy przy tworzeniu własnej gry
    Odpowiedzi: 16
    Ostatni post / autor: 16-11-2011, 21:28
  5. Chodzenie po mapie
    Przez marcelol w dziale Budowa gry via www
    Odpowiedzi: 2
    Ostatni post / autor: 04-07-2010, 09:42

Zakładki

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •