두 등각 타일의 충돌을 감지하는 데 문제가 있습니다.
타일의 각 지점 사이에 선을 플로팅 한 다음 작동하지 않는 선 절편을 확인하려고했지만 (아마도 잘못된 수식으로 인해)
오늘 이것을 잠시 살펴본 후에 나는 그것에 대해 많이 생각하고 있으며 더 쉬운 방법이 있어야한다고 생각합니다.
중복을 감지하는 가장 좋은 방법에 대한 조언 만 코드를 찾고 있지 않습니다.
두 등각 타일의 충돌을 감지하는 데 문제가 있습니다.
타일의 각 지점 사이에 선을 플로팅 한 다음 작동하지 않는 선 절편을 확인하려고했지만 (아마도 잘못된 수식으로 인해)
오늘 이것을 잠시 살펴본 후에 나는 그것에 대해 많이 생각하고 있으며 더 쉬운 방법이 있어야한다고 생각합니다.
중복을 감지하는 가장 좋은 방법에 대한 조언 만 코드를 찾고 있지 않습니다.
답변:
나는 똑바로 나와 질문에 설명 한 문제를 해결하는 방법을 모른다고 말하지만 (iso-tile-shaped 사각형 사이의 충돌 감지) 다른 사람들이 과거에 어떻게 그것을 해결했는지 말할 수 있습니다. :
다른 게임에서 수행되는 방식은 게임 세계 를 화면 세계 와 분리하는 것 입니다 . 시작할 때, 그것들이 같은 것을 상상하는 것이 일반적이지만, 그것은 당신이 묘사하는 것과 같은 문제를 야기합니다.
일반적인 아이디어는 게임 세계 가 메모리 뒤에 완전히 저장되어 있고, 그 뒤에는 숫자, 참조 및 논리 일뿐입니다. 게임 세계를 등각 투영하고 있다는 사실은 관련이 없습니다. 게임 세계에는 등각 투영법 또는 정사각형 또는 화면이 3D로 그려지는 개념이 없어야합니다. 게임 세계를 화면 (일명 화면 세계 )으로 그릴 때이 모든 것이 처리됩니다 . 게임 세계는 게임에 가장 적합한 방식으로 저장되고 유지되어야합니다. 아이소 메트릭 게임에서는 일반적으로 iso라는 사실을 완전히 무시하고 대신 축 정렬 그리드를 사용하는 것처럼 위치를 저장합니다. 대부분의 게임은 두 세계 사이의 좌표를 변환하는 방법이있을 것이다, 난 내 전화 ScreenToWorld(x, y)
및WorldToScreen(x, y)
. 변환은 종종 매트릭스 수학으로 수행되지만 다른 방법으로도 수행 할 수 있습니다. 마우스를 사용할 때는 ScreenToWorld를, 그리고 그릴 때는 WorldToScreen을 사용합니다.
게임 세계 와 화면 세계 를 분할하면 몇 가지 장점이 있습니다 . 장점 중 하나는 충돌 감지 및 이동이 모두 게임 세계에서 발생한다는 것입니다. 따라서 기울어 진 격자 또는 기울어 진 좌표를 처리하지 않거나 화면이있는 위치 등을 다루지 않기 때문에 일반적으로 매우 간단합니다. 축 정렬 사각형과 사각형을 다루게됩니다. 게임 세계가 업데이트되면 게임 세계의 표현을 키워드 : representation으로 화면에 그립니다. 처음에는 직관적이지 않은 것처럼 보일 수 있지만 화면은 게임 세계에서 일어나는 일을 나타내는 것일뿐입니다. 이를 통해 전용 서버 및 터미널과 같은 클라이언트가 가능합니다.
FreeCiv 는 실제로 이러한 모든 것의 훌륭한 예입니다. 정사각형 노스 / 사우스 그리드, 등각 투영 또는 16 진수와 같은 정확한 세계를 볼 수 있습니다. 당신이 실행하는 모든 게임은 백그라운드에서 실행되는 전용 서버를 가지고 있으며, 싱글 플레이어 게임에서도 클라이언트는 디스플레이 포트 일뿐입니다.
긴 이야기를 짧게 : 화면의 세계에서 게임 세계와 로직을 분리는, 게임 로직을 간단하게 게임을 줄여 <-> 디스플레이 커플 링은 , 차례로, 쉽게 처리 할 수 시각화하기 쉬운 "ISO"타일 사이에 충돌 감지한다.
John의 대답은 옳지 만 다른 방법으로 설명하려고 노력할 것입니다.
아이소 메트릭 충돌 감지는 없습니다.
충돌 감지는 투영 매트릭스 / 변환이 어떻게 보이는지 신경 쓰지 않습니다. 물체를 렌더링하는 경우 충돌 감지가 중요하지 않습니다. 결국 화면 밖에있는 물체는 여전히 충돌 할 수 있습니까?
더 철학적 인 질문입니다. 숲에 쓰러진 나무가 아무도 없을 때 실제로 땅과 충돌합니까?
기존의 지혜는 다음과 같이 말할 것입니다. 당신이 그것을 어떻게 보는지는 중요하지 않습니다. 시야 공간이 아닌 월드 공간에서 사물이 충돌합니다.
각 개별 픽셀의 각 getRGB () 값의 비트 맵을 구성하는 픽셀 배열을 할당 할 수 있습니다. 타일의 경계가 타일이 나타내는 것 (물, 모래, 잔디)과 다른 색상 값이므로 if 문과 값을 비교합니다. 기본 아이소 메트릭 그리드의 경우입니다. 또는지도 자체의 두 레이어를 가질 수 있습니다. 충돌하는 객체의 각 대표의 개요를 그리는 녹색 화면과 같은 종류의 레이어가 있고 다른 레이어는 맵 자체가됩니다.
맵 레이어의 각 픽셀의 비트 맵 배열을 구성하지 않고 객체가 유지 색상 값의 경계와 충돌 / 교차 할 때의 효과를 나타내는 색상 세트를 계산하려고합니다. 값이 감소하거나 물체가 움직이는 속도를 증가 시키려고합니다. 이동하는 각 객체는 다른 지점에 저장된 메모리의 복제본입니다.
나는 완벽한 픽셀 충돌과 비트 맵 배열에 대한 이해를 살펴볼 것입니다. 각 사각형은 객체가 위치 또는 벡터에서 렌더링되는 위치에 따라 각 이벤트가 트리거되는 각인 메모리와 같은 복제 데이터 종류를 포함하는 범위입니다. 화면의 모든 점은 2D 평면에 있으며 그림자의 깊이는 객체 자체가 3D로 표현되는 환상을 제공합니다. 비뚤어진 모양의 변형은 물체가 비스듬한 느낌을줍니다. 카메라가 카메라를 제시하는 중심점이 있으며, 중심에서 멀어 질수록 크기가 줄어들거나 크기가 커질수록 가까이 이동합니다.