2D 게임을 만들려고합니다..
적오브젝트가 보고있는 시야을 부채꼴로 나타낼려고합니다..
장애물이 있음면 그뒤는 못보는것으로 표시할려고합니다. 우선 알고리즘을 잘모르니
제일먼저 떠오르는것은 라인긋기 알고리즘으로 선을 촘촘히 그리는건대
당연히 중간에 구멍도 뚫리고 느리내요..
이것을 깔끔히 해결할 방법이 없을까요?
고수님들의 답변 꼭부탁드립니다
[email protected]
적 오브젝트의 시야처리
Moderator: 류광
-
- Posts: 17
- Joined: 2006-05-26 12:13
- Location: Eya
부채꼴 충돌.
부채꼴 충돌은 속도도 빠르고 간단합니다.
일단 2D이므로.
플레이어와 적오브젝트를 위치를 playerPos, EnemyPos 라고 하고.
적 오브젝트의 시선방향을 EnemyDir 이라 한다면.
적 오브젝트의 감지부체꼴을 detectFan ( center<중심>, range<거리>, angle<각도> ) 만들고
palyerPos에서 EnemyPos 까지 거리가 detectFan.range 보다 작고,
적 오브젝트에서 플레이어를 연결하는 벡터 vecTest 와
EnemyDir 과의 각도가 detectFan.angle 안에 들어오는지 확인 하면 됩니다. ( 내적:DotProduct 활용 )
일단 2D이므로.
플레이어와 적오브젝트를 위치를 playerPos, EnemyPos 라고 하고.
적 오브젝트의 시선방향을 EnemyDir 이라 한다면.
적 오브젝트의 감지부체꼴을 detectFan ( center<중심>, range<거리>, angle<각도> ) 만들고
palyerPos에서 EnemyPos 까지 거리가 detectFan.range 보다 작고,
적 오브젝트에서 플레이어를 연결하는 벡터 vecTest 와
EnemyDir 과의 각도가 detectFan.angle 안에 들어오는지 확인 하면 됩니다. ( 내적:DotProduct 활용 )
새로운 게임 개발은 즐겁다..!
-
- Posts: 31
- Joined: 2007-08-29 14:51
-
- Posts: 11
- Joined: 2009-10-14 18:30
이런방법은 어떨지.
질문보고 재밋어서 저도 좀 생각해봤는데요. ^^
미니맵같이 작은 공간에 표시하는 거라면 이런방법은 어떨까 합니다.
1. 우선 중점과 부채꼴의 양끝점을 모두 포함하는 최소한의 사각형 버퍼를 만듭니다.
2. 이곳에 장애물이 될 영역을 그립니다. 특정색의 단색이면 되겟죠.
3 이제 사각형영역의 모든픽셀에 대해서 아래 검사를 해서 걸러내며 찍습니다
3.1 픽셀위치가 장애물영역이다. -> 걸러냄
3.2 중점과 특정거리이상 떨어져있다. -> 걸러냄
3.3 부채꼴 양끝점의 각도(기울기)와 비교해서 벗어나있다 -> 걸러냄
3.4 중점에서 해당픽셀로 이어지는 기울기로 로 거슬러올라가며 픽셀을 찍다가 장애물색을 만나면 중지한다.
3.5 픽셀을 찍으면서 이미 그자리에 시야픽셀로 찍혀있으면 3.4를 건너뛴다(시야에서 먼쪽부터 그리는게 낫겟죠?)
3.6 부채꼴에 해당하는 모든픽셀에 대해서 3.1~3.5를 반복한다.
부채꼴크기가 풀스크린단위면 비교해야할 픽셀이 너무 많아져서 곤란하겠다 싶기도 한데요
미니맵같이 작은영역이라면 이렇게 해도 크게 속도저하가 없지 않을까 싶네요?
상상으로만 해본거라 제대로 될진 모르겟습니다 ㅋ. 걍 힌트로만 활용하셔도...
미니맵같이 작은 공간에 표시하는 거라면 이런방법은 어떨까 합니다.
1. 우선 중점과 부채꼴의 양끝점을 모두 포함하는 최소한의 사각형 버퍼를 만듭니다.
2. 이곳에 장애물이 될 영역을 그립니다. 특정색의 단색이면 되겟죠.
3 이제 사각형영역의 모든픽셀에 대해서 아래 검사를 해서 걸러내며 찍습니다
3.1 픽셀위치가 장애물영역이다. -> 걸러냄
3.2 중점과 특정거리이상 떨어져있다. -> 걸러냄
3.3 부채꼴 양끝점의 각도(기울기)와 비교해서 벗어나있다 -> 걸러냄
3.4 중점에서 해당픽셀로 이어지는 기울기로 로 거슬러올라가며 픽셀을 찍다가 장애물색을 만나면 중지한다.
3.5 픽셀을 찍으면서 이미 그자리에 시야픽셀로 찍혀있으면 3.4를 건너뛴다(시야에서 먼쪽부터 그리는게 낫겟죠?)
3.6 부채꼴에 해당하는 모든픽셀에 대해서 3.1~3.5를 반복한다.
부채꼴크기가 풀스크린단위면 비교해야할 픽셀이 너무 많아져서 곤란하겠다 싶기도 한데요
미니맵같이 작은영역이라면 이렇게 해도 크게 속도저하가 없지 않을까 싶네요?
상상으로만 해본거라 제대로 될진 모르겟습니다 ㅋ. 걍 힌트로만 활용하셔도...
-
- Posts: 1044
- Joined: 2003-02-18 10:29
- Contact:
경험에 입각한 답변 하나
온라인 게임 서버 엔진 ProudNet
http://www.nettention.com
http://www.nettention.com