2D 타일 기반 게임에서 스크롤하는 좋은 방법은 무엇입니까?


9

D3DXSPRITE 래퍼와 함께 Direct3D를 사용하여 타일을 화면에 그립니다. 충돌 및 타일 유형과 같은 멤버를 포함하는 타일 클래스가 있으며 타일 배열이 있습니다.

타일 ​​그리드 [256] [256];

어느 것이 더 나은 방법입니까?

-화면 중앙에 플레이어를 그리고 맵이 그려지는 위치를 그립니다.

-다음과 같은 카메라로 플레이어를 움직입니다.

첫 번째 방법을 사용하고 있었지만지도의 왼쪽 상단 가장자리에 도착했을 때와 다른 플레이어 / 에미가지도에 있고 동시에 움직일 때 정말 복잡해졌습니다.

카메라가 플레이어를 따르도록 만들면 화면에 몇 개만 들어갈 수 있지만 모든 단일 그리드 타일에 대해 spriteBatch-> Draw (...)를 호출해야합니까?

답변:


4

"실제"세계 단위로 모든 업데이트 및 계산을 수행하고 카메라를 이동하는 것이 가장 좋습니다. spriteBatch는 컬링 자체를 수행 할 수 있지만 너무 느리면 화면에 표시 할 타일을 결정하고 그릴 만 할 수 있습니다.


특히 그리드의 크기를 늘려야하는 경우에 보이는 스프라이트 만 그리도록 코드를 작성하려고 할 것입니다.

2

세계 좌표에서 카메라를 이동하고 캐릭터를 전 세계로 이동시키는 것이이 문제에 접근하는 가장 쉬운 방법입니다. 세계 좌표에서 작업하면 다른 모든 시스템에서 작동 할 때 추가 계산을 수행 할 필요가 없습니다. 상대 좌표계와 월드 좌표의 위치를 ​​이해합니다.

2D에서 작업하는 또 다른 좋은 팁은 가상 세계 그리드 시스템을 만드는 가장 쉬운 방법은 일부 공간 분할을 수행하는 것이므로 스프라이트와 기타 리소스를 타일별로 연결하여 각 타일을 개별적으로 관리 할 수 ​​있습니다. 본질적으로 프로세스는 다음과 같습니다.

  • 타일의 경계 좌표와 특정 타일에 필요한 리소스 (스프라이트, 적 등)를 보유 할 수있는 타일 클래스를 만듭니다.

  • 세계의 크기를 결정하고 모든 관련 리소스가있는 세계의 비트를 나타내는 각 타일의 2D 배열 (1 차원을 사용하고 2D로 액세스 할 수 있음)을 만듭니다.

  • 플레이어가있는 타일과 그 이웃에서만 리소스를 가져옵니다.

격자를 사용하면 격자의 시작에 상대적인 위치를 기준으로 플레이어가있는 타일을 쉽게 찾을 수 있습니다.

카메라에 대해 언급 한 문제를 해결하려면 플레이어와 카메라를 카메라가 가장자리 타일의 중심보다 더 멀리 이동하지 않는 두 개의 독립적 인 시스템으로 만들어야하므로 플레이어가 해당 타일로 이동할 때 여전히 타일을 통해 이동할 수 있습니다 월드 좌표에 구속되어 (즉, 더 이상 화면 중앙에 위치하지 않음) 카메라가 잠겨 있습니다.


0

나는 표면을 사용합니다. 화면 바깥 표면에 전 세계를 만들고 x와 y 좌표를 유지합니다. 플레이어가 움직일 때 이것을 변경하고 각 프레임은 x와 y를 사용하여 표면에서 백 버퍼로 1028 x 768 사각형을 그립니다.

다른 사람들에 관해서는 x와 y를주고 그들이 원하는대로 세상을 움직일 수있게합니다. 그릴 때 x와 y가 1028 x 768 사각형에 있는지 확인하고 그렇게하면 그립니다 (사람들에게 텍스처를 사용합니다) .

화면 중앙에 플레이어가 있고 세계 가장자리가 화면 가장자리에 도달했는지 확인합니다. 이 상황에서 플레이어는 화면을 중심으로 세계의 가장자리로 이동하고 다시 중앙으로 이동 한 다음 세계가 다시 움직이기 시작합니다. 힘들고 시간이 걸렸지 만 나쁘지 않습니다.

64 x 64 타일을 사용하고 지금까지 사용한 가장 큰 세계는 50 x 60 타일입니다.

이것은 모두 C ++로 직접 x에서 수행됩니다.


1
이것은 거대한 메모리 호 그처럼 보입니다. 세계를 화면 밖으로 화면에 그려두면 세상에 여러 개의 (애니메이션 된) 레이어를 만들고 현재보다 더 확장하는 것과 같은 작업을 시작하기 시작하면 메모리 문제가 발생합니다. 세상에 관한 정보를 유지하고 그려야 할 때 그려야 할 부분 / 물체 만 그리는 것이 훨씬 좋습니다. 그냥 내 2 센트. :)
Richard Marskell-Drackir

@Drackir 당신이 오해하는 것 같아요. 오직 세상 만이 화면에서 벗어나고, 다른 사람들과 같은 것들은 필요할 때 후원자 버퍼에서 추적되고 그려집니다. 또한 나 자신이 70 x 70 이상의 세계를 수행하는 것을 보지 못합니다. 내가 세계를 의미한다고 말할 때, 이것은 던전이나 집안의 마을이 될 수 있습니다. 플레이어가 그들 사이를 이동할 때 화면 외부 표면이 재구성됩니다. 그렇습니다. 메모리가 필요하지만 현대 테라 비트 드라이브의 2D 타일은 무시해도 좋으며 몇 초만 걸리면 부드러운 스크롤링과 애니메이션 비용을 지불 할 수 있습니다. 그러나 네, 더 좋고 어려운 방법이 있습니다 :)
Skeith

표면은 하드 드라이브가 아닌 GFX 카드 메모리에 저장해야합니다. 그러나 GFX 카드 메모리가 너무 크면 표면이 HD로 이동하여 속도가 상당히 느려집니다. 틀림없이, 내가 그 물건을 다루고 나서 오랜 시간이 지났으므로 어떻게 작동했는지 정확하게 기억하지 못하지만 너무 큰 세계를 그리지 않는 한 괜찮을 것 같습니다. :)
Richard Marskell-Drackir

@Drackir 알고있는 것이 흥미 롭습니다. 이 방법을 사용하면 동적으로 새 타일을 그릴 때 적합하다고 생각하지만 그 점을 살펴 봐야한다는 부드러운 스크롤을 제공합니다.
Skeith

나는 31x31의 맵을 가진 게임을 만들고 있었지만 나란히 붙어있었습니다. 나는 다른 사람의 엔진에서 일하려고 노력하고 있었고 플레이어가 있던 곳을 둘러싼 모든지도를 그렸습니다. 총 9 개의지도가 있습니다. 각 맵에는 여러 개의 (6이라고 생각합니다) 레이어가 있습니다. 따라서 사용자가 맵을 전환 할 때마다 31x31x9x6 = 51894 타일이 그려지는 것처럼 (최대 물론 모든 타일이 가득 찬 것은 아님). 그것은 저에게 큰 속도 저하였습니다. 그래서 나는 화면의 가장자리를지나 1 타일까지만 움직이는 주변 타일을 그리기 위해 그리기 루틴을 다시 작성했습니다 (이동하는 동안 부분 타일을 처리하기 위해).
Richard Marskell-Drackir

0

코드가 타일 세계의 구석에서 약간의 고통을 겪을 때, 어떤 틸을 그릴 지, 동시에 카메라가 '세계 외'가되지 않도록하는 것은 매우 정상적인 일입니다. 이러한 엣지 케이스는 기본적으로 화면 해상도보다 큰 2D 타일 기반 세계를 구현하는 데있어 가장 경쟁력있는 것입니다. 확대 및 커서 확대 / 축소를 지원하면 훨씬 더 복잡해집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.