Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

게임을 만듭니다.

홀스 충돌검증 본문

old_Horsnake

홀스 충돌검증

인카고 2016. 4. 13. 01:17


말은 펜스와 같은 장애물 혹은 자기 몸에 머리가 부딪히면 죽는다(?)

1.장애물 부딪힘 검증

말은 다음 틱에 자신의 머리가 어디에 있을지 알고 있다.

그럼 움직이기 전에 그곳에 무엇이 있는지 확인하면 된다.

블럭매니져에서는 이럴 때를 대비해 GetGrid(x,y) 함수를 가지고 있다.

리턴 값은 해당 그리드의 벨류

0은 그리드가 존재하지 않음, 1은 빈공간(말이 움직일 수 있는) 2는 장애물(펜스 등)으로 지정해 놓았다.

여기서 문제

각각의 블럭은 10*10그리드를 가지고 있다.

그러니깐 GetGrid(35, 24) 이렇게 하면 (3,2)블럭의 (5,4)그리드 정보를 가져오는거다. 블럭이 아예존재하지 않으면 0을 리턴해버리고

그런데.... 나는 음수 인덱스를 가지는 그리드를 가정했다.

양수는 계산이 간단하다. x, y값을 10으로 나누면 블럭에 대한 인덱스 값이 나오고 10으로 모듈러연산을하면 그리드 값에 대한 인덱스가 나온다.

음수는 조금 생각을 해야한다.

GetGrid(0,0)은 (0,0)블럭의 (0,0)그리드를 가져온다 : 심플

GetGrid(-4,-8)은 (-1,-1)블럭의 (6,2)그리드를 가져와야한다 : 왓????

거두절미하고 결론은 다음과 같다.


public int GetGrid(int x, int y)
        {
            //Debug.Log("GetGrid("+x+", "+y+")");
            int blockX = x > -1 ? x / Block.Width : (x - 9) / Block.Width;
            int blockY = y > -1 ? y / Block.Height : (y - 9) / Block.Height;
            Block block = GetBlock (blockX, blockY);
            if (block == null)
                return 0;
            else {
                return block.gridData [x > -1 ? x % Block.Width : (x % Block.Width + 10) % Block.Width, 
                    y > -1 ? y % Block.Height : (y % Block.Height + 10) % Block.Height];
            }
        }

'old_Horsnake' 카테고리의 다른 글

Done is better than perfect.  (0) 2016.04.16
UI 작업 조금....  (0) 2016.04.13
ui만 조금 변경....  (0) 2016.04.11
시각적인 느낌이 유쾌하진 않다  (0) 2016.04.10
모델 추가  (0) 2016.04.09
Comments