2D 게임에 카메라 / 뷰포트 구현


20

2D 게임에 카메라 / 뷰포트를 구현하는 가장 실용적인 방법은 무엇입니까?

화면을 기준으로 한 위치 대신 객체 세계 위치 를 저장해야한다고 읽었습니다 .

현재 상황:

XML 파일에서 객체와 레벨을로드하는 간단한 2D 게임을 구현했습니다. 현재 레벨 XML 파일은 다음과 같습니다.

<map>
   <tile obj="ground" x="0" y="555" />
   <tile obj="ground" x="16" y="555" />
   <tile obj="ground" x="32" y="555" />
   ...
</map>

모든 객체에는 현재 위치를 화면에 저장하는 2D- 벡터 "위치"가 있습니다.

내가 원하는 것 :

뷰포트 / 게임 월드 일러스트레이션

사진 속에:

  • 카메라가 800x600 또는 640x480
  • 블록과 스프라이트는 16x16 픽셀입니다.
  • 세계 크기는 다를 수 있습니다
  • 좌표가 화면이 아닌 세계를 기준으로 정규화되어야합니까?
  • 플레이어의 x, y를 기준으로 한 뷰포트 위치이며 플레이어가 카메라 데드 존에 도달하면 움직입니다 ( 이 비디오 와 유사 ).

나는 의사 예제 / 기사를 요구하고 있지만 개발에 무엇을 사용 해야하는지 알고 싶다면 SDL & C / C ++.


1
여기에 의견에 세 번째 링크를 추가하면 질문에 추가 할 수 있습니다.
MichaelHouse

카메라 데드 존의 의미는 다음과 같습니다. youtube.com/watch?v=89TRXUm8jMI
bluekirai


안녕하세요 @Arthur Wulf White, 정교하게 관리 하시겠습니까? 감사.
bluekirai

언급 한 카메라는 뷰를 오프셋 (회전 및 확대 / 축소하지 않음)하는 데만 사용되는 일반 2D 카메라의 특정 버전입니다. 추적 거리는 플레이어 캐릭터와 카메라 사이의 거리를 확인하고 거리가 너무 큰 경우 카메라를 움직여 구현할 수 있습니다.
wolfdawn

답변:


19

스크린 대신 월드를 기준으로 모든 오브젝트를 배치해야합니다. 또한 카메라에는 월드의 상대 위치에 그릴 수 있도록 자체 월드 좌표가 있어야합니다. 카메라가 물체를 따라 가게하는 것이 편리 할 수도 있으므로 물체가 어디에 있더라도 카메라는 좌표를 사용합니다. 일반적으로 카메라 좌표는 왼쪽 위 모서리에서 배치합니다. 이는 카메라가 사진 에서 월드 위치가 대략 (0,24)임을 의미합니다 .

카메라가 실제로 볼 수있는 객체를 그리려면 카메라의 세계 좌표를 기준으로 모든 객체를 그려야합니다. 카메라를 기준으로 객체의 화면 위치를 계산하려면 다음을 수행하십시오.

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

분명히 일부 객체는 실제로 카메라에 보이지 않으므로 뷰 컬링 시스템을 구현할 수 있습니다.


2

CPU에서 객체를 그리는 위치를 수정하는 것이 아니라 World 및 View 행렬을 사용하여 GPU에서이 모든 작업을 수행하는 것이 가장 좋습니다 .

이렇게하면 카메라를 임의로 변경할 수 있으며 (확대 / 축소도 가능) 마술처럼 작동합니다. 여전히 컬링 뷰를 수행하여 드로우 시간을 절약 할 수 있습니다. 뷰와 월드 매트릭스를 올바르게 설정 한 후에 월드 그리기를위한 코드를 변경하지 않아도됩니다.

SDL에서는 glOrthoand 같은 OpenGL 호출을 인라인 할 수 있습니다 glTranslate.

이 스레드를 참조하십시오 .


누군가가 공감대를 설명 할 수 있습니까? 이것은 말이됩니다.
Hello World

1
나는 투표하지 않았지만 이것이 질문에 대답조차하지 않기 때문이라고 생각합니다. 문제는 GPU 대 CPU에서 수행하는 것이 더 효율적인지 아닌지 계산하는 방법에 관한 것입니다. OP는 심지어 의사 예제를 찾고 있다고 말했다. 카메라 / 월드 / 모델 매트릭스의 조합을 사용하는 것이 더 효율적일 것이라는 점에는 의심의 여지가 없으므로 mklingen은 최소한 포인트를 가지고 있습니다.
Dan Watkins

이 대답은 전혀 나쁘지 않습니다! OpenGL / DX 개발에 더 구체적이지만 카메라 좌표를 기반으로 변환 매트릭스를 계산하고 실제 위치를 변경하지 않고 캠 매트릭스를 통해 객체를 이동할 수 있으므로 올바른 접근 방식입니다.
nenchev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.