아이소 메트릭 렌더링 및 피킹?


23

다이아몬드 모양의 세계에서 등각 타일을 플롯 (세계-> 화면)하고 마우스 선택 (세계-> 화면)하는 공식을 찾고있었습니다. 내가 시도한 사람들은 항상 꺼져있는 것처럼 보입니다. 이 작업을 수행하는 일반적인 / 올바른 방법은 무엇입니까?


사용되는 정확한 방법과 공식은 타일 모양에 따라 다르며지도를 그리는 방법에 따라 약간 다를 수 있습니다 (지도의 상단, 하단 또는 측면 중 하나에 0,0). 문제에 대해 도움이 될 것입니다.
— thedaian

1
타일은 2 : 1 (보다 구체적으로 64x32)입니다. 에디터를 작성하고 있기 때문에 좌표계는 중요하지 않습니다. (그러나 상단 또는 왼쪽의 0,0은 합리적인 것으로 보입니다.)
— mpnk121

질문에 매우 늦었고 완전한 답변조차 얻지 못했지만이 정확한 주제에 대해 매우 좋은 Google Tech Talk가있었습니다. 그들의 설정에는 임의의 이미지의 불투명 부분을 선택하는 것이 포함됩니다 (자바 스크립트에서). youtube.com/watch?v=_RRnyChxijA
— 세스 바틴

답변:


21

귀하의 의견을 바탕으로 타일 x, y 값을 화면 좌표로 변환하는 데 사용하는 코드는 다음과 같습니다. 이제는 "3d 타일"을 고려하지 않고 모든 것이 동일한 평면에있는 것으로 간주되므로 중요한 게임을 작성하는 경우이 코드가 작동하지 않습니다.

//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는 단순히 x 및 y int를 포함하는 구조이며 TILE_WIDTH는 64 일 것이고 TILE_DEPTH는 이름이 잘못되어 있습니다 (실제로 타일 그래픽의 높이입니다). 그러나 32 일 것입니다. 타일 ​​맵이 다른 x, y 위치에서 "시작"되도록하려면 (예 : 타일을 다른 타일 세트 위에 배치하려는 경우) 오프셋이 설정됩니다. 일반적으로 오프셋은 0,0 일 수 있습니다.

다음과 같이 상단, 중앙에 0,0의 맵이 생성됩니다.

        0,0
    0,1     1,0
0,2     1,1     2,1

커서의 타일 x, y를 찾는 방법은 다음과 같습니다.

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;

이 코드에서 mX와 mY는 마우스 화면 좌표이며, "세계 좌표"의 위치를 ​​찾기 위해 카메라 값과 결합합니다. 다른 모든 것은 이전 코드 예제와 동일합니다.

다시 한번, 이것은 평평한 2D 등각 타일 맵을 가정합니다. 지도의 반 3D보기를 사용하려는 경우 추가 작업이 있으며,이 모든 것이 2d에서 작업하고 있다고 가정합니다.


1
고맙습니다! -평면지도에 적합합니다. 이제 다른 레이어에있는 임의의 크기 (예 : Z 깊이) 타일을 추가하는 방법에 대해 좀 더 말씀해 주시겠습니까? (우물이나 가로등 같은 소품)
— mpnk121

2
이때 offsetY 및 offsetX 값을 사용하십시오. 가로등이 64x64 인 경우 offsetY 값으로 음수 32를 전달하면 올바른 위치에 표시됩니다. 바라건대 시작하기에 충분합니다.
— thedaian

6
예제에서 좌표 "2,1"이 "2,0"이 아니어야합니까?
— Chris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.