Szukałem wzoru do kreślenia (świat-> ekran) i wybierania myszy (świat-> ekran) płytek izometrycznych w świecie w kształcie rombu. Te, których próbowałem zawsze wydają się być, cóż, wyłączone. Jak to zwykle / poprawnie to zrobić?
Dokładna zastosowana metoda i wzór zależy nieco od kształtu twoich kafelków i prawdopodobnie trochę od tego, jak rysujesz mapę (na górze, dole lub jednej z boków mapy jest 0,0) Więcej szczegółów o twoim problemie pomogłoby.
thedaian
1
Płytki mają format 2: 1 (a dokładniej 64x32). Układ współrzędnych nie ma znaczenia, ponieważ piszę edytor. (0,0 u góry lub po lewej wydaje się jednak rozsądne.)
mpnk121
Bardzo późno na pytanie i nawet nie mam pełnej odpowiedzi, ale było bardzo dobre Google Tech Talk na ten precyzyjny temat. Ich konfiguracja obejmuje wybranie nieprzezroczystej części dowolnych obrazów (w javascript, nie mniej). youtube.com/watch?v=_RRnyChxijA
Seth Battin
Odpowiedzi:
21
W oparciu o twój komentarz, oto kod, którego używam do konwersji wartości kafelka x, y na współrzędne ekranu. Teraz nie bierze pod uwagę „kafelków 3D”, wszystko uważa się za znajdujące się na tej samej płaszczyźnie, więc jeśli piszesz grę, w której to ma znaczenie, ten kod nie będzie działać.
//this converts a map x/y coordinate into screen coordinates//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x,int y,int offsetX,int offsetY){
point screen;//calculate the screen coordinates//note: these will then be modified by the camera
screen.x = offsetX -(y * TILE_WIDTH/2)+(x * TILE_WIDTH/2)-(TILE_WIDTH/2);
screen.y = offsetY +(y * TILE_DEPTH/2)+(x * TILE_DEPTH/2);return screen;}
point jest po prostu strukturą zawierającą x i y ints, TILE_WIDTH to 64 w twoim przypadku, TILE_DEPTH jest trochę źle nazwane (w rzeczywistości jest to wysokość grafiki kafelkowej), ale w twoim przypadku będzie to 32. Przesunięcia mają miejsce, jeśli chcesz, aby mapa kafelków „zaczynała się” w innym miejscu x, y (np. Jeśli chcesz, aby kafelki znajdowały się powyżej innego zestawu kafelków). Zazwyczaj przesunięcie może wynosić 0,0.
Spowoduje to wygenerowanie mapy z 0,0 na górze, w środku, w następujący sposób:
0,00,11,00,21,12,1
Jeśli chodzi o znalezienie kafelka x, y kursora:
point selectedTile;int x = mX - camera.x;int y = mY - camera.y;
selectedTile.x =(y + x/2)/TILE_DEPTH;
selectedTile.y =(y - x/2)/TILE_DEPTH;
W tym fragmencie kodu mX i mY to współrzędne ekranu myszy, które łączymy z wartościami kamery, aby dowiedzieć się, gdzie jesteśmy w „współrzędnych świata”. Cała reszta jest taka sama jak w poprzednim przykładzie kodu.
Ponownie zakłada to płaską izometryczną mapę kafelków 2d. Jest trochę dodatkowej pracy, jeśli chcesz użyć widoku mapy 3D w pół-3d, a to wszystko zakłada, że i tak pracujesz w 2D.
Dziękuję Ci! - Działa to doskonale w przypadku płaskich map. Czy możesz mi teraz powiedzieć coś więcej o tym, jak mogę dodać płytki o dowolnej wielkości (tj. O głębokości Z), które znajdują się na innej warstwie? (Takich jak rekwizyty jak studnia lub
latarnia uliczna
2
Wtedy używasz wartości offsetY i offsetX. Jeśli latarnia ma rozmiar 64 x 64, to przekazanie ujemnej wartości 32 dla wartości offsetY powinno sprawić, że pojawi się ona we właściwym miejscu. Mam nadzieję, że to wystarczy, aby zacząć.
thedaian
6
Czy współrzędna „2,1” w twoim przykładzie nie powinna być „2,0”?
Odpowiedzi:
W oparciu o twój komentarz, oto kod, którego używam do konwersji wartości kafelka x, y na współrzędne ekranu. Teraz nie bierze pod uwagę „kafelków 3D”, wszystko uważa się za znajdujące się na tej samej płaszczyźnie, więc jeśli piszesz grę, w której to ma znaczenie, ten kod nie będzie działać.
point jest po prostu strukturą zawierającą x i y ints, TILE_WIDTH to 64 w twoim przypadku, TILE_DEPTH jest trochę źle nazwane (w rzeczywistości jest to wysokość grafiki kafelkowej), ale w twoim przypadku będzie to 32. Przesunięcia mają miejsce, jeśli chcesz, aby mapa kafelków „zaczynała się” w innym miejscu x, y (np. Jeśli chcesz, aby kafelki znajdowały się powyżej innego zestawu kafelków). Zazwyczaj przesunięcie może wynosić 0,0.
Spowoduje to wygenerowanie mapy z 0,0 na górze, w środku, w następujący sposób:
Jeśli chodzi o znalezienie kafelka x, y kursora:
W tym fragmencie kodu mX i mY to współrzędne ekranu myszy, które łączymy z wartościami kamery, aby dowiedzieć się, gdzie jesteśmy w „współrzędnych świata”. Cała reszta jest taka sama jak w poprzednim przykładzie kodu.
Ponownie zakłada to płaską izometryczną mapę kafelków 2d. Jest trochę dodatkowej pracy, jeśli chcesz użyć widoku mapy 3D w pół-3d, a to wszystko zakłada, że i tak pracujesz w 2D.
źródło