Tworzyłem małą strukturę heksadecymalną dla Unity3D i doszedłem do następującego dylematu. To jest mój układ współrzędnych (wzięty stąd ):
Wszystko działa całkiem ładnie, z wyjątkiem tego, że nie mam pojęcia, jak go przechowywać. Pierwotnie zamierzałem przechowywać to w tablicy 2D i wykorzystywać obrazy do generowania moich map.
Jednym z problemów było to, że miał ujemne wartości (można to łatwo naprawić przez nieco przesunięcie współrzędnych).
Jednak ze względu na ten układ współrzędnych taki obraz lub bitmapa musiałby mieć kształt rombu - a ponieważ te struktury mają kształt kwadratu, spowodowałoby to wiele bólów głowy, nawet jeśli zhakuję coś razem. Czy brakuje mi czegoś, co mogłoby to naprawić? Pamiętam, że widziałem post na forum na ten temat na forach jedności, ale nie mogę już znaleźć linku.
Czy pisanie zestawu tłumaczy współrzędnych jest tutaj najlepszym rozwiązaniem?
Jeśli uważacie, że byłoby to pomocne, mogę wysłać kod i zdjęcia mojego problemu.
źródło
Odpowiedzi:
Współrzędne równoległoboku, z których korzystasz, są łatwiejsze do pracy, ale mają tę wadę, że są dziwne w przypadku map prostokątnych. Jednym z podejść jest przechowywanie go ze współrzędnymi przesunięcia, ale w rzeczywistości używa się współrzędnych równoległoboku w logice gry.
Obserwacja: w każdym rzędzie mapy dane siatki są ciągłe. Cała zmarnowana przestrzeń znajduje się po lewej i prawej stronie.
Rozwiązanie: w tym wierszu przechowuj dane, zaczynając od lewej kolumny zamiast kolumny oznaczonej 0. Oblicz pierwszą kolumnę mapy prostokątnej w układzie współrzędnych , a następnie odejmij ją od współrzędnej kolumny, aby określić, gdzie w macierzy idzie. Działa to również w przypadku ujemnych współrzędnych kolumny.
Wykonaj konwersję w narzędziu pobierającym i ustawiającym dla mapy za pomocą czegoś takiego:
Musisz to zmodyfikować, aby działało z wyborem współrzędnych i mapy (zwróć uwagę na jedną różnicę). W niektórych układach będziesz chciał przesunąć kolumny o rząd zamiast na odwrót.
Możesz użyć tej samej sztuczki, aby tworzyć mapy innych kształtów; nie ogranicza się to do prostokątów.
Jeśli używasz C lub C ++, możesz użyć arytmetyki wskaźnika, aby przyspieszyć. Zamiast przechowywać tablicę wskaźników w tablicach, przechowuj tablicę wskaźników, które zostały dostosowane
first_column_in_row
. (To może nie być przenośne)źródło
yIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)
po kilku próbach i błędach. Nie mam pojęcia, jak to działa.yIndex = y-((x%2==0)?(-x/2):(-x/2)-1)
. x / 2 to btw oparte na liczbach całkowitych, więc nie ma potrzeby podłogowania.Osobiście wolałbym prostotę niż oszczędzanie pamięci. Nie optymalizuj, dopóki nie będzie potrzebny!
Jeśli nadal chcesz zaoszczędzić kilka bajtów, możesz to zrobić w następujący sposób:
Kod Python do mapowania współrzędnych prostokątnych na współrzędne równoległoboku i odwrotnie:
źródło
offsetY = Math.floor ( (x+1)/2 )
Nie trzeba zniekształcać mapy, ponieważ konwersja między prostokątnymi i „kanonicznymi” współrzędnymi jest szybka i łatwa. Oto link do wprowadzenia, jak to zrobić:
Konwersja między prostokątnymi i kanonicznymi współrzędnymi sześciokątnymi
Ta technika łączy leniwą ewaluację z buforowaniem obliczonych konwersji.
źródło