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


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.