Co jest lepsze do przechowywania map w grach

Co jest lepsze do przechowywania map w grach
C9
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:32
0

Hej, tak jak w tytule, w czym lepiej przechowywać dane do wczytywania mapy do gry, w JSON czy LUA? Jeśli to zależy to jakie są minusy i plusy obu rozwiązań?

hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:13 dni
5

Pliki binarne? Ogólnie porównujesz język programowania z formatem serializacji. Minusy i plusy to różnice między językiem programowania a formatem serializacji.


AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Postów:3561
5

Już rozmawialiśmy, dostałeś na tyle adekwatną odpowiedź, na ile dałeś szczegóły.

  1. Czy mapa wykonuje algorytmy? Nie wiem, bo gry dla mnie nie istnieją. Las rośnie, to czynność mapy? Pożar coś niszczy?
    Czy tylko inne obiekty wykonują swoje algorytmy uwzględniają mapę (kolonizator buduje zamek na mapie) ?

  2. Parsery JSON w niemal każdy języku są, i nie jest z tym dużo korowodu. Integracja z Luą jest dalece bardziej skomplikowana. jeśli ostatecznie ma chodzić o "dane", które "kod" wypluje, to jest overengeneering

  3. ilość typów obiektów (=klas przynajmniej w szerokim sensie) jest z góry określona, czy podlega rozbudowie? Czy użytkownik gry (czyli: nie producent) ma dodawać nowe typy?

  4. Powtórzę, co pisałem, ujęcie "dane" i ujęcie "kod" ma swoje zastosowania. Zobacz Excella: większość komórek to dane, nieliczne to formuły.
    Mapa w wersji Lua też będzie miała ogromną przewagę statycznych danych, też tzreba je jakoś zaimplementować, i kółko się zamyka.


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
hauleth
W większości gier mapa jest statyczna, bo to potem mechanika gry już decyduje o zmianach na mapie. Więc masz odpowiedź na 1 pytanie.
Patryk27
@hauleth: czasem jednak mapy są dynamiczne - np. mapy w Warcraft 3 mogą być oskryptowane za pomocą Lua właśnie :-)
hauleth
@Patryk27: sama mapa jest statyczna, ale można do niej dodać skrypty i np. spakować do tarballa. Sama gra nie zmienia plików map.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8400
0

JSON jest uniwersalny, więc jeśli będziesz kiedyś portować grę, to nie będzie problemu, żeby w jakimś innym języku odczytać JSON, bez potrzeby osadzania interpretera LUA.

Ale nie piszesz, jaka to gra. Czemu w LUA chcesz trzymać mapę? To jakieś proceduralnie generowane mapy, że potrzebowałyby języka skryptowego do ich zapisu?

Trzymanie gry w JSON (albo jakimkolwiek innym formacie danych, w odróżnieniu do skryptów) ma tę zaletę, że łatwo potem możesz zrobić sobie wizualne narzędzia do tego (np. wizualny edytorek, którym będziesz stawiać obiekty), ma również tę zaletę, że łatwo przekonwertować to na inny format albo z innego formatu. Czyli np. masz w JSON, to napiszesz prosty skrypt i przerabiasz to w trymiga na XML, czy dowolny inny format. Skrypty natomiast niekoniecznie możesz łatwo przekonwertować (choć nie jest to niemożliwe, są transpilatory jednych języków programowania na inny - np. możesz wziąć kod w C++ i przekonwertować do JSa).

Ale JSON ma te ograniczenia, że to tylko dane, bez logiki, chyba, że:

  • sam wymyślisz jakby metaformat oparty o JSON, który będzie zawierał logikę (ale łatwo można przekombinować - tzw. inner platform effect).
  • oddelegujesz logikę do skryptów czy core'a twojej gry, a w JSON będziesz tylko się odwoływać do logiki np. za pomocą jakichś parametrów (np. w JSON będziesz mieć parametr "prędkość rośnięcia lasu", a sama logika rośnięcia (co to znaczy, że las rośnie?) będzie w jakichś skryptach gdzie indziej zupełnie).

edytowany 3x, ostatnio: LukeJL
C9
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:32
0

Pytanie wzięło się stąd że przechowuje mapę w JSON, jest to mapa statyczna więc wnioskując po tym co piszecie jestt to dobry format do jej przechowywania, natomiast na internecie widziałem jak ludzie używają do tego Lua, co ja chce osiągnąć to w LUA przechowywać zachhowania NPC a do wczytywania samych NPC JSON, chciałem tylko wiedzieć czy takie mieszanki są dobra praktyką

AK
Każdy dostatecznie złożony program używa kilku technologii. Jak to dobrze zrobić, będzie OK
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:6 minut
  • Lokalizacja:Wrocław
  • Postów:498
0

Piszę grę 2d mmorpg opartą o canvas i mapę z JSON'a zaciągam. Masz darmowe programy do mapek jak Tiled i oprócz samej mapy możesz też dodawać warstwy obiektów, a do samych obiektów możesz dodawać właściwości, więc raczej można przechowywać zachowania NPC. Ja tam przechowuje dialogi razem z informacją, które metody mają się wykonać po wywołaniu dialogu, więc może sprosta twoim oczekiwaniom. Wiadomo, że musisz napisać własny parser, ale to chyba przy każdym rozwiązaniu.


Programować muszę, bo się uduszę
Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:15 minut
  • Postów:6628
0

Kiedyś kombinowałem z grą w stylu Dungeon Keeper i arkusz kalkulacyjny radził sobie całkiem dobrze :]
Możesz eksportować do CSV i importować w grze. Każda komórka ma dane dla swojego tile'a.


🕹️⌨️🖥️🖱️🎮
edytowany 1x, ostatnio: Spine
C9
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:32
0

A jak to jest z wysyłaniem obiektów z c++ do skryptu Lua, dla mnie ciężki temat czytałem ze muszę stworzyć meta dane w lua albo użyć gotowej biblioteki np. Sol. Czy da się to jakoś prosto zrobić bez bibliotek czy lepiej ją jednak użyć albo czy wgl. takie przesyłanie obiektów jest dobrą praktyką?

AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Postów:3561
0
cplusplus94 napisał(a):

A jak to jest z wysyłaniem obiektów z c++ do skryptu Lua, dla mnie ciężki temat czytałem ze muszę stworzyć meta dane w lua albo użyć gotowej biblioteki np. Sol. Czy da się to jakoś prosto zrobić bez bibliotek czy lepiej ją jednak użyć albo czy wgl. takie przesyłanie obiektów jest dobrą praktyką?

  1. Nie będzie miodowo w żaden sposób. Trochę wiedzy i roboty trzeba, samo się nie zrobi. Biblioteki tak/nie, zależy
  2. Metadane w Lua mają specyficzny sens - na pytanie nie da się odpowiedzieć bez szczegółów. tak/nie, zależy. Ale nieprawdą jest, że zawsze programista integrujący musi zapewnić metadane.
  3. Nie sposób wygooglac biblioteki Sol, daj link.
  4. "Jakieś" przesyłanie obiektów jest istota integracji języka Lua z hostem. Ogólnie Tak, czasem /nie / zależy

Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
C9
https://sol2.readthedocs.io/en/latest/ Ogólnie to myślę że da sie obejść wysłanie całego obiektu do Lua żeby go o skryptowwc, zawsze lua może zwracać jakieś parametry konkretne typu zmiana koordynatów, hp itd i zmienienie ich potem w c++
AK
zrozum, że NIE MA ogólnej odpowiedzi
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 15 godzin
  • Postów:3277
0

@cplusplus94: Bitmapa, to ile bitów/bajtów na "pixel" zależy już od ciebie, podobnie jak decyzja jakie rzeczy będą tam przechowywane - wysokość terenu, roślinki, dostępność dla "ludzika" itd. Dlaczego tak, a nie jakieś JSON? Otóż, ponieważ, bo:

  • bitmapę możesz bezpośrednie wczytać, bez dekodowania czegokolwiek
  • możesz sobie w prosty sposób wybrać dowolny fragment, który chcesz załadować do pamięci
  • struktury bitmapowe da się obsługiwać bez najmniejszego problemu z każdego języka programowania, włączając w to asm, CUDA, OpenCL, czy co tam przyjdzie do głowy
  • bitmapę można bardzo łatwo zrobić w jakimś Gimpie, PS, itp, a jak potrzeba to i pociąć na kawałki i robić inne cuda. Albo po prostu wyświetlić i będzie to dużo bardziej "human readable" niż dowolny format tekstowy
AK
dla sprecyzowania słownictwa, jeśli mówimy o mapie użytecznej dla algorytmów, to: bitmapa!=mapa, ale zarazem bitmapa~=mapa (nie ma mapy bez bitmapy)
piotrpo
Rozumiem, że "mapa" o która pyta autor wątku to mapa świata gry - tu smok, tam rycerz. Nie mówimy o mapie jako strukturze danych klucz - wartość. Co to jest "użyteczne dla algorytmów"?
AK
smok (jaskinia smoka) na bitmapie nie za bardzo jest przeszkodą, na mapie "logicznej" owszem
piotrpo
Rysujesz sobie świat gry, dzielisz na kwadraty, potrzebujesz mieć na mapie wysokość terenu, typ (las, łąka, rzeka.....), obiekty (smoki, księżniczki, artefakty itp). Robisz sobie plik .bmp gdzie każdy piksel jest kodowany na 3 bajtach i opisuje pojedynczy "kafelek" świata gry. Chcesz dorobić "logikę", żeby nie dało się przechodzić przez zbyt strome tereny, to albo w grze sprawdzasz na pierwszej warstwie czy różnica pomiędzy sąsiednimi pikselami nie jest za duża, albo generujesz dodatkowy plik z wykrytymi krawędziami.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)