2011-02-03 6 views
0

어떻게 스크롤링 맵을 가지고 충돌을 감지합니까?스크롤링 게임에서 충돌 감지

나는 타일 맵을 시도했지만이 기술을 사용하고 싶지 않습니다.

게임 배경을 스크롤하고 오브젝트가 충돌을 감지하는 방법을 배우고 싶습니다.

예를 들면 this game이됩니다.

이 경우 타일 맵을 사용하지 않는 경우 캐릭터 스프라이트와의 충돌을 감지하는 실제 객체뿐만 아니라 스크롤 가능한 세계는 어떻게됩니까?

이 주제에 대한 올바른 방향을 알려주십시오.

+0

기술은 본질적으로 동일해야합니다 또는 타일 맵없이 ... –

답변

2

간단한 충돌 감지는 경계 상자 (또는 때로는 경계 원)가 겹치는 지 확인하여 수행됩니다. 즉, 객체 A와 객체 B가 주어진 경우 경계 상자가 겹치면 충돌이 발생했습니다.

멋지게하려면 개체의 다각형을 만들고 경계 다각형이 겹치는 지 확인하십시오. 그게 더 복잡하고 어렵게, 그리고 더 많은 처리가 포함됩니다.

타일 맵을 사용하는 것과별로 다르지 않습니다. 타일 ​​맵을 사용하면 타일에 대해 충돌 감지를 수행합니다. 타일 ​​맵이 없으면 개별 객체의 경계 상자에 대해 충돌 감지를 수행합니다. 논리는 거의 동일합니다.

추가 정보 : 나는 당신이 고민하고있는 문제는 당신이 화면의 측면에서 생각하고 있다는 생각

. 게임 월드의 개념 (모델)과 프레젠테이션 (화면)을 분리하는 게임을 작성할 때 중요합니다.

예를 들어 간단한 측면 스크롤러 게임은 정보로 가득 찬 많은 "화면"으로 구성 될 수 있습니다. 화면의 너비는 1000 유닛이지만 게임의 세계는 10,000 또는 100,000 유닛이 될 수 있습니다. 나는 "픽셀"보다는 "단위"라고 말합니다. 게임의 측정 단위는 인치, 센티미터, 마일 또는 기타 수 있습니다. 모든 게임 논리는 세계 좌표의 관점에서 작동해야합니다. 뷰 (화면)에 어떻게 투영하는지는 세상에서 일어나는 일과 관련이 없습니다.

세계의 모든 물체에는 세계 좌표가 인 위치가 할당됩니다. 여기에는 전 세계를 돌아 다니는 플레이어 스프라이트가 포함됩니다. 세계의 모든 충돌 감지 및 객체 상호 작용은 세계 좌표로 수행됩니다.

단순화하기 위해 세계 단위와 화면 단위간에 일대일 매핑이 있다고 가정합니다. 즉, 사용자의 세계는 10,000 픽셀이고 화면은 1,000 픽셀입니다. 세상은 크기가 "열 개의 스크린"입니다. 더 정확하게, 화면은 1/10의 세계를 볼 수 있습니다. 이 경우보기는 가장 왼쪽에있는 좌표로 정의 할 수 있습니다. 따라서 세계 좌표 2,000이 화면 왼쪽에 있으면 화면의 가장 오른쪽 픽셀 열이 세계 좌표 2,999가됩니다.

이것은 월드 와이드 스크린 변환과 스크린 투 월드 변환 기능이 필요하다는 것을 의미합니다. 이 경우 해당 함수는 매우 간단합니다. 수직 스크롤링이 없다고 가정하면 x 좌표 만보기 x 좌표에서 월드 x 좌표를 빼서 변환해야합니다. 즉, world.x - viewOrigin.x입니다. 따라서 위의 경우 world x 좌표 2,315에있는 객체의 화면 좌표는 (2,315 - 2,000) 또는 315가됩니다.이것은 화면상의 객체 위치의 x 좌표입니다. 현재보기에서.

화면 대 세계는 반대입니다. 객체의 화면 좌표를 뷰의 원점에 추가합니다 (315 + 2,000 = 2,315).

월드와 뷰 좌표 간의 분리를 유지하는 것이 얼마나 중요한지 강조 할 수 없습니다. 모든 게임 논리는 세계 좌표의 관점에서 작동해야합니다. 전 세계에서 일어나는 일을 보여주기 위해 뷰를 업데이트합니다. 사이드 스크롤러에서는 일반적으로 플레이어의 동작에 따라 좌우로 뷰를 이동합니다. 플레이어가 왼쪽으로 이동하면 뷰 원점을 왼쪽으로 이동합니다. 플레이어가 오른쪽으로 이동하면보기 원점을 오른쪽으로 이동합니다.

일단이 아이디어를 내면화하면 훨씬 간단 해집니다. 게임 세계에서 이루어진 모든 일은 에서 발생합니다. 당신은 세계의 상태가 일관성이 있는지 확인한 다음 세계의 시각을 표시하는 것에 대해 걱정합니다.

화면보다 큰 게임을 만드는 더 쉬운 방법은 없습니다. 아무리 당신이 그것을 구축하더라도, 당신은 세상의 일부를 그 시각에 보여 주어야한다는 개념을 가져야 만합니다. 이를 형식화함으로써 프레젠테이션을 게임 논리와 분리하면 상황이 훨씬 간단 해집니다.

+0

좋습니다. 타일 ​​맵에서 오브젝트가 미리 배치되어 콜리 전 오브젝트로 설정된다는 사실에 혼란이 있습니다. 그런 다음 스크롤이 발생하면서 객체 (타일로 구성)가 검사됩니다. 소위 지역 알려져 있습니다. 타일 ​​맵을 사용하지 않을 때 이것을 어떻게 알 수 있습니까? 예를 들어 그래픽에 있으며 울타리가 있어야합니다. 타일 ​​맵을 사용하는 대신 코드에서 어떻게 설정합니까? 타일 ​​맵은 미리 그려진 환경을 허용하며, 게임 영역은 충돌 가능으로 표시됩니다. 예 : 마리오. 선반과 바닥은 미리 알려져 있습니다. 코드를 위치를 사용하여 어떻게 설정합니까? – jarryd

+0

개체를 만들고 위치를 설정하고 충돌 개체 목록에 배치합니다. 충돌을 확인할 때마다 개체 목록에 대해 확인합니다. 타일과의 충돌을 확인하는 것과 근본적으로 다른 것은 아닙니다. 나는 당신이 묻고 싶어하는 것이 더 근본적이라고 생각하지만 그것이 무엇인지 모른다. –

+0

그래서 충돌 목록이 생성되면 어떤 위치가 사용됩니까? 하나는 전체 직위를 차지합니까? (160, 1050) 또는 하나의 스크린 위치 (160, 70)만을 사용하는 등의 3 가지 스크린 위치에 오브젝트 위치를 배치 할 수 있습니까? 그런 다음 어떻게 사용중인 화면을 추적하고 그에 따라 객체를 생성합니까? 그렇다면 내 다른 질문은, 그것이 스폰 가능한 객체와 고정 된 객체가 아닌 경우, 충돌을 탐지하기위한 정확한 위치를 얻는 방법은 무엇인가? 어떤 물체가 여러 화면에 걸쳐 있고 어떤 위치가 사용됩니까? 고마워요, 임마 조금 혼란 스러워요. – jarryd

1

카메라 크기를 렌더링하려는 수준의 크기로 설정하려고합니다. 당신은 당신의 영웅을 말하면서 카메라가 고정되어야하는 것에 따라 레벨 좌표를 얻을 수 있습니다.

스프라이트 충돌이 비교적 쉽습니다. 두 스프라이트 사용하여 '당신이에 대해 테스트하고 높이/폭을 (적인 Cocos2D에 대해 IDK 있지만, 대부분의 API의 스프라이트'위치는 스프라이트의 왼쪽 상단 모서리에있는) :

if(player.Pos.x <= (object.Pos.x + object.width) || (player.Pos.x + player.width) >= object.Pos.x) 
{ 
    if(player.Pos.y >= (object.Pos.y - object.height) || (player.Pos.y - player.height) <= object.Pos.y) 
     //collision detected 
} 
+0

감사합니다. 충돌 부분 나는 괜찮아. 내 문제는 실제 게임 영역의 개념입니다. 게임 영역에있는 물체의 스폰 또는 탐지 충돌을 장면/카메라보기로 스크롤하는 방법은 무엇입니까? 예를 들어 이미지가 사전 제작 된 경우 어떻게 될까요? 새로운 지역이 등장 할 때 게임 지역 전체에 걸쳐 존재하는 바위 또는 산맥의 무리. 이 산맥은 대상으로 어떻게 설정되고 카메라가 볼 때 수정되는 현재 간격은 어떻게됩니까? 이게 말이 돼? :) – jarryd

+0

이것은 다소 해결책이되는 광범위한 주제입니다. 그것은 게임 엔진을 어떻게 디자인 하느냐에 달려 있습니다. 파일 (xml 또는 .txt 또는 w/e ..)에서 레벨 객체를 읽을 수 있으며 위치, 스프라이트 파일 경로 등 필요한 정보를 저장/검색 할 수 있습니다. 각 레벨을로드 할 때 객체를 메모리에로드하고 자유롭게로드합니다. 마지막 레벨의 메모리를 올리십시오. 카메라보기에서 물체와 충돌합니다. 희망이 당신에게 몇 가지 아이디어를 제공합니다 :) –