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ć?
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ć?
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ć.
//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,0
0,1 1,0
0,2 1,1 2,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.