프로젝트/Infinite Cocktail

[IC] Isometric 타일맵 에디터 제작기 (3) - Isometric 타일 좌표 계산

어데이드 2018. 1. 5. 02:38

18.01.04

그리드 선 출력 구현 후 진행

그리드 타일 좌표 계산

그리드로 그려진 타일을 클릭시 그 좌표를 계산하는 것을 구현하였다.

Snap을 위한 준비 단계이다.


이것을 위해 선형대수학 강의 자료까지 뒤져보고 Sage (선형대수 계산기)까지 이용해 행렬계산을 했다....

변환을 좀더 제대로 배워놨다면 그걸 이용했을것 같은데 기억기 가물가물해서 결국 행렬 곱셈 노가다로 대강 계산후 수치가 잘 안맞아서 노가다로 조정 후 결국 식을 완성했다.

언젠가 선형대수학 복습도 필요할듯 흑


거기다 마우스 인식도 잘 안되서 이거했다 저거했다 결국 처음코드로 돌아왔다(...)


먼저 OnSceneGUI는 다음과 같이 바꾸었다.

void OnSceneGUI()
    {
        SceneView.RepaintAll();

        //그리드 상수 업데이트
        gridWidth = mapManager.gridSize * gridConst * 0.5f;
        gridHeight = mapManager.gridSize * gridConst * 0.25f;

        //마우스 입력 관련
        UpdateHitPosition();

        Event current = Event.current;

        if(UpdateGridSelected())
        {
            if (current.type == EventType.mouseDown || current.type == EventType.mouseDrag)
            {
                if (current.button == 0)
                {
                    //왼쪽 마우스 클릭
                    Debug.Log(mouseHitGridX.ToString() + ", " + mouseHitGridY.ToString());

                    current.Use();
                }
            }
        }
        //그리드 Draw
        DrawMapGrid();
    }


UpdateHitPosition은 마우스 좌표값을 갱신하는 함수,

UpdateGridSelection은 그리드 좌표계산 함수이다.

(전자는 마우스 정보가 변하면 true를, 후자는 클릭 위치가 그리드 내부일때 true를 반환한다)


UpdateGridSelection는 아래와 같다.

private bool UpdateGridSelected() { mouseHitGridX = Mathf.FloorToInt(-((mouseHitPosition.y - gridHeight) / gridHeight * 0.5f) + (mouseHitPosition.x / gridWidth * 0.5f)); mouseHitGridY = Mathf.FloorToInt(-((mouseHitPosition.y - gridHeight) / gridHeight * 0.5f) - (mouseHitPosition.x / gridWidth * 0.5f));

        //그리드 X좌표 범위 벗어나면 if(mouseHitGridX < 0 || mouseHitGridX >= mapManager.mapWidth) { return false; }

        //그리드 Y좌표 범위 벗어나면 if (mouseHitGridY < 0 || mouseHitGridY >= mapManager.mapHeight) { return false; } return true; }


화면에 표시되는 타일 좌표 문제로 mouseHitPosition.y에서 gridHeight만큼 빼서 조정하였다.



씬 뷰에서 내부 영역을 클릭하면 제대로 인식되고 있음을 확인할 수 있었다.