Autor Wątek: Generowanie planszy do gry 2D i jej rysowanie  (Przeczytany 2992 razy)

Offline nilphilus

  • Użytkownik
    • wordpress

# Lipiec 04, 2007, 19:55:14
Witam, od paru dni próbuje zrobić jakiś ciekawy generator planszy do gry 2D.
Sama gra ma 2 rodzaje pul podstawowych: Ziemia i Woda i generowanie tego jako tako mi wychodzi i połączenie graficzne w tym wypadku nie było by najtrudniejsze, ale dochodzą jeszcze 4 typy dodatkowe.
Ogień, Roślinność, Powietrze (chmury), Lód, część oczywiście się ze sobą nie łączy i nie może występować w swoim pobliżu (Ogień i woda, Lód i Roślinność/Ogień) ale reszta jak najbardziej. No i wiadomo, nie mogę ustawić jednej bitmapki dla środka lasu i końcówki lasu bo będzie to wyglądać mało realistycznie, a wpisywanie kilkunastu ifów mnie jakoś się nie podoba.
Myślałem czy by nie zrobić jakiś 'masek', i przy końcach je wrzucać tak żeby nie rysowała się część tego obrazka przystająca do końcówki. Ale szczerze powiedziawszy, nie wiem czy to jest najlepsze rozwiązanie, dlatego też prosił bym o jakieś rady osób bardziej doświadczonych ;-)

Dodam jeszcze że szukałem jakiś artykułów na necie, ale niestety nie znalazłem niczego dla 2D. Jedynie 3D, lub czegoś co miałoby małe zastosowanie dla mnie.

PS. nie wiem czy to jest odpowiedni dział na forum dla takiego tematu, ale wydaje mi się że trochę z matematyką ma wspólnego (jakieś tam przeliczniki ^_^)

Pozdrawiam.
« Ostatnia zmiana: Lipiec 04, 2007, 20:36:23 wysłana przez nilphilus »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Moriturius

  • Użytkownik

# Lipiec 04, 2007, 20:11:48
Prawde mowiac, nie zrozumialem ani slowa z wyjasnienia! :P

Napisz w 1 krotkim zdaniu z czym masz problem :)

Offline nilphilus

  • Użytkownik
    • wordpress

# Lipiec 04, 2007, 20:14:56
w wygenerowaniu mapy składającej się z 6 pól (2 podstawowe 4 dodatkowe) tak żeby wyglądała na realistyczną. No i jak poradzić sobie z faktem 'łączenie' się kafelków mapy tak żeby to wyglądało porządnie.

btw. wybaczcie, ja czasami strasznie plącze XD

Offline krajek

  • Użytkownik

# Lipiec 04, 2007, 20:22:40
Moje skojarzenie : automaty komórkowe.
Tylko tak : ja nic praktycznie o nich nie wiem tylko widze efekty ich działania.
Myśle że mogą ci się przydać(ale to tak tylko na chłopski rozum wywnioskowałem :P)

http://www.warsztat.gd/articles.php?x=view&id=4
To artykuł na początek o tych automatach.

Te teksturki z artykułu skojarzyły mi sie z planszą, bo takie kształty prawie jak teren się układają :).

Offline Moriturius

  • Użytkownik

# Lipiec 04, 2007, 20:25:44
Aaaa chodzi Ci o przejscia pomiedzy kafelkami, zeby wygladaly tak jak w np. w AOE pomiedzy ladem a woda?

Gdzies kiedys widzialem art o tym wlasnie. Tam zrobili cos takiego, ze oprocz kafelka z sama woda, zrobili dodatkowe kilka kafli reprezentujacych stany przejsciowe. Oczywiscie gora, dol, lewo, prawo i narozniki dla 2 przypadkow - kiedy woda jest `w srodku` kiedy jest `na zewtnatrz`.

I potem jakos na podstawie samej mapy wyznaczone bylo co gdzie i jak powinno byc wyswietlone.

Czyli sposob w pewnym stopniu podobny do Twojego z maskami.

@UP: tytul topicu jest mylacy ;)

Vipa

  • Gość
# Lipiec 04, 2007, 20:29:41
To w końcu chcesz generować losowo plansze czy odczytywać maski z plików?

Jak generować to generuj plamami (losowo  x, y na planszy i od tego losowo 20 pól w okolicach od -5 do +5 od tego wylosowanego pola).
Jak odczytywać to lepiej z pliku tekstowego rozpisz sobie tablicę 100 na 100 i 1 to drzewko, 2 to ogień, 3 to murek...).


Offline nilphilus

  • Użytkownik
    • wordpress

# Lipiec 04, 2007, 20:35:57
To w końcu chcesz generować losowo plansze czy odczytywać maski z plików?

Jak generować to generuj plamami (losowo  x, y na planszy i od tego losowo 20 pól w okolicach od -5 do +5 od tego wylosowanego pola).
Jak odczytywać to lepiej z pliku tekstowego rozpisz sobie tablicę 100 na 100 i 1 to drzewko, 2 to ogień, 3 to murek...).


To i to, generowanie w pewnym stopniu mam rozwiązane (ale tylko w pewnym i wolał bym to ulepszyć), a rysowanie to już w ogóle kicha ^_^

Trochę nie rozumiem o co chodzi z generowaniem 'plamami' ?
mam 'tworzyć' coś w rodzaju obszaru z danym typem pola? W sumie to i ciekawe rozwiązanie ;-]

a z zapisem nie będzie problemu, jedno pole jest reprezentowane przez char. Każdy bit informuje czy tam jest ziemia z drzewkiem czy, woda z lodem itd.

Offline counterClockWise

  • Użytkownik

# Lipiec 05, 2007, 10:57:55
Kwestia jest czy chcesz stworzyć efektywny algorytm wielokrotnie odpalany realtime, czy po prostu wygenerować stałą ilość map.
Bo jeśli to drugie, to twórz jakieś heurystyki i próbuj je w praniu aż efekt będzie satysfakcjonujący (w końcu wystarczy, że wyjdzie pare razy :)
A jeśli chodzi o rysowanie to przychodzi mi do głowy, żeby przygotować dodatkowe teksturki złączeń dla każdego typu sąsiedztwa terenu (czyli para dwóch rodzajów terenów oraz typ krawędzi - wiem, że dużo tego będzie, ale c'est la vi) albo za pomocą alfa-map + interpolacji liniowej kolorów (np. interpolujesz kolory między dwoma przejściami w pewnym wąskim pasie, ale bez pewnych wyróżnionych w alfa-mapie fragmentów.

p.s.
W heurystykach możesz narzucić np. minimalną ilość wystąpień każdego rodzaju terenu, tendencje do tworzenia się terenu tego samego typu obok siebie, współczynnik "odpychania" dwóch konkretnych rodzajów terenu, jeżeli nie powinny być obok siebie, warunki na tworzenie nowych pól, modyfikacji starych i przeróżne inne czynniki
Wszystko może być zmienne w czasie (iteracji).
« Ostatnia zmiana: Lipiec 05, 2007, 11:03:56 wysłana przez counterClockWise »

Offline spacja

  • Użytkownik

# Lipiec 06, 2007, 13:56:27
cześć
tu http://www.unit1.pl/224,idx widziałem kilka artów o dość zbliżonym temacie. Gość pisze o gigantycznych mapach- planszach w świecie 2D Omawia jak zrobić plansze rzędu 2500x2500 kafli FPS jaki uzyskuje to w granicach 200. Omawia mapę świata prostokątnego jak i izometrycznego


Offline Humman

  • Użytkownik

# Lipiec 06, 2007, 14:24:12
Zeby uzyskać płynne przejście między różnymi typami terenów wystarczy sprwdzić dla każdego widocznego kafla jaki typ terenu znajduje się w jego sąsiedztwie( 8 kierunków dla prostokątów i izometrii, 6 dla map hexagonalnych ) i narysować po właściwej graficee tego kafla odpowiedni rodzaj grafiki przejscia tego kafla który przylega z kolorem kluczowym.
Każdy typ terenu terenu oprócz tego najniżej w hierarchi powinien mieć ileś typów pełnego wypełnienioa i 8,czy 6 rodzajów obrazków z przejśćiami, hierarchia typów terenu jest potrzebna gdy z jednym polem sąsiaduje kilka o innych, różnych od siebie typów terenu. W grach 2D używa się raczej podobnych metod niż interpolacji przeżroczystości miedzy polami, gdyż key color działa nawet na starych API-tylko do 2D.   

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Lipiec 07, 2007, 11:40:10
Nic dziwnego, że nie możesz znaleźć dobrego tekstu na ten temat - taki chyba po prostu nie istnieje. Widziałem wiele argorytmów tego typu i każdy jest zupełnie inny, wymyślony i napisany do konkretnej sytuacji. Gdybym miał napisać o tym cokolwiek ogólnie, podzieliłbym te algorytmy wg podejścia do sprawy (można te podejścia ze sobą łączyć):

1. Podejście globalne.
Wymyślasz taki algorytm na całość generowania, o którym możesz powiedzieć w bardziej lub mniej formalny sposób (jakiś dowód? :) że jest poprawny i da od razu taki wynik jakiego oczekujesz. To raczej niełatwe.

2. Wiele przebiegów.
Przetwarzasz mapę wiele razy, a w każdym przebiegu inny algorytm wykonuje swoje zadanie. Na przykład najpierw generowane są ogólne kształty, potem wprowadzana jest losowość, potem wykonujesz wygładzanie, potem na wygenerowanym terenie wstawiasz rośliny itp.

3. Podejście lokalne.
Wymyślasz funkcję, która wykonywana dla każdego jednego pola, biorąc pod uwagę na przykład pola sąsiednie da w sumie taki wynik jakiego chcesz - tak jak we wspomnianych automatach komórkowych.

Wcześniej zanim weźmiesz się za wymyślanie tego algorytmu powinieneś sobie jasno powiedzieć jakie masz wymagania, tzn. co chcesz otrzymać - np. że wyspy na wodzie mają być duże, zaokrąglone, że muszą się ze sobą łączyć itp. Pomyśl także jakimi parametrami chciałbyś sterować - np. średnia wielkość wysp.

Offline Kuba®'79™

  • Użytkownik

# Sierpień 20, 2007, 10:09:38
(Przede wszystkim nie wiem, czy jestem „bardziej doświadczony”...  ;) )

Kiedyś widziałem prostą planszę 2D ziemia/las/woda rysowaną przy użyciu masek: las „nachodził” na wszystkie sąsiednie pola (nie będące lasem rzecz jasna), ziemia „nachodziła” na sąsiednią wodę. „Nachodzenie” było realizowane zgodnie z maską: jeżeli bit (czy bajt jeśli byłoby wygodniej zakodować) maski był 1, piksel nachodzonego pola był nadpisywany pikselem pola nachodzącego, jeżeli 0 pozostawiany bez zmian. Pole było nachodzone kolejno od wszystkich swoich sąsiadów, więc z jednej strony potrzeba było tylko 8 masek (dla każdego kierunku sąsiedztwa – mówimy o planszy podzielonej na kwadratowe kafle jak sądze), ale z drugiej mogłoby być to problemem do wydajności.
Bitmapy pól nie były w tym przykładzie szczególnie wyszukane, więc maski mogły być jakiekolwiek. Gdyby np. w lesie były narysowane małe drzewka, trzebaby zadbać, żeby wszystkie maski były „kompatybilne” z ich kształtami.
Efekt był całkiem-całkiem (jak na tak prymitywną grafikę), jedyne co dawało się dostrzec, to pewna „powtarzalność” linii brzegowej – ten problem możnaby rozwiązać przygotowując zestawy masek i każdemu polu przypisać losowy (albo jakiś wystarczająco pseudolosowy, wygenerowany na podstawie np. współrzędnych) zestaw.

Jeśli mapa miałaby tylko dwa rodzaje pól (ziemia/woda) to możnaby użyć zestawu (bodajże) 46 masek na zasadzie „jeżeli pole jest wodą sąsiadującą (jakkolwiek) z ziemią, to na podstawie całego sąsiedztwa obliczamy maskę i rysujemy bit ziemi jeśli maska jest 1 a w przeciwnym wypadku bit wody” (każdy bit pola jest nadpisywany jednokrotnie, pewien zysk dla wydajności – numer  maski zależy tylko od sąsiedztwa, można go więc wyliczyć razem z mapą). Dlaczego 46 masek? Bo jesli – dajmy na to – północny sąsiad danego pola jest lądem, to maska bedzie taka sama, niezależnie jakie są północno-wschodni i północno-zachodni (przynajmniej jeśli mamy zasadę, że ląd „nachodzi” na wodę). (Ale jeśli kogoś to interesuje, to niech sam sobie policzy, ja to zrobiłem tak „na oko” ;).) Można również usunąć powtarzalność kształtów linii brzegowej analogicznie stosując zestawy masek.

Pomyślę trochę nad rozszerzeniem metody „z jedną maską” na mapy z wieloma rodzajami pól...

Metoda „osobna bitmapa dla każdego rodzaju sąsiedztwa” ma wady i zalety. Zaletą jest chyba przede wszystkim wydajność (rysowanie pola byłoby zawsze tylko jednym kopiowaniem bez żadnych warunków), ale to nie jest jakieś takie „porażające” na współczesnych komputerach IMVHO... Wadą jest ilość bitmap: w Twoim przykładzie (6 typów pól) zakładając brak warunków wykluczających pewne układy dostajesz ponad 10mln bitmapek... Nawet jesli uwzględnimy pominięcie wykluczonych układów to i tak będzie ich IMVHO za duzo, żeby każdą z osobna narysować, więc pozostanie ich generowanie, więc może można generować je „w locie”?

Offline Humman

  • Użytkownik

# Sierpień 22, 2007, 00:47:39
Metoda „osobna bitmapa dla każdego rodzaju sąsiedztwa” ma wady i zalety.
Ma tylko jedną zaletę ,w API nie obsługującego mapowania kanału alfa a jedynie keycolor można dzięki temu zrobić w przogramie graficznym właśnie to i potem wyświetlać.
Istnieje jeszcze inna metoda rysowania map z przejściami za pomocą jedynie 12 obrazków + tło dla miejsc gdzie jakiś teren z niczym nie sąsiaduje, wadą jest to że obrazki muszą być 2 razy większe niż rozmiar kafla, stąd można zapełniać mapę polami 2x2 i ich wielokrotnością. Cała grafika mapy jest przesunięta w stosunku do brzegu ekranu o rozmiar kafla.