질문
하드웨어에서 지원할 수있는 것보다 큰 이미지를 사용하는 2D 게임을 사용하는 경우 어떻게해야합니까? 어쩌면 전에 나에게 결코 발생하지 않은이 문제에 대한 흥미로운 해결책이있을 수 있습니다.
저는 기본적으로 일종의 그래픽 어드벤처 게임 메이커에서 일하고 있습니다. 목표 대상은 게임 개발 (및 프로그래밍) 경험이 거의 또는 전혀없는 사람들입니다. 이러한 응용 프로그램으로 작업하는 경우 "이미지를 분할하십시오"라고 말하는 대신 내부적으로 문제를 처리하기를 원하지 않습니까?
문맥
그래픽 카드는 사용할 수있는 텍스처의 크기에 제한을 가하는 것으로 잘 알려져 있습니다. 예를 들어, XNA로 작업 할 때 선택한 프로파일에 따라 최대 텍스처 크기는 2048 또는 4096 픽셀로 제한됩니다.
2D 게임에서는 대개 작은 개별 조각 (예 : 타일 또는 변형 된 스프라이트)으로 구성 할 수있는 레벨이 있기 때문에 이것은 큰 문제가되지 않습니다.
그러나 몇 가지 고전적인 point'n'click 그래픽 어드벤처 게임 (예 : Monkey Island)에 대해 생각해보십시오. 그래픽 어드벤처 게임의 객실은 일반적으로 풍경을 작업하는 화가처럼 반복 가능한 섹션이 거의 또는 전혀없는 전체로 설계됩니다. 또는 사전 렌더링 된 큰 배경을 사용하는 Final Fantasy 7과 같은 게임 일 수도 있습니다.
이 방들 중 일부는 꽤 넓어서 종종 3 개 이상의 너비의 화면에 걸쳐 있습니다. 이제 현대적인 고화질 게임의 맥락에서 이러한 배경을 고려하면 지원되는 최대 텍스처 크기를 쉽게 초과 할 수 있습니다.
이제 이에 대한 확실한 해결책은 배경을 요구 사항에 맞는 작은 섹션으로 나누고 나란히 그리는 것입니다. 그러나 당신 (또는 당신의 예술가)은 당신의 모든 질감을 나누는 사람이어야합니까?
높은 수준의 API로 작업하는 경우이 상황을 처리하고 내부적으로 텍스처를 분할하고 조립할 준비가되어 있지 않아야합니까 (XNA의 Content Pipeline과 같은 사전 프로세스 또는 런타임)?
편집하다
XNA 구현 관점에서 내가 생각한 것은 다음과 같습니다.
내 2D 엔진에는 아주 작은 Texture2D 기능의 하위 집합 만 필요합니다. 실제로이 인터페이스로 줄일 수 있습니다.
public interface ITexture
{
int Height { get; }
int Width { get; }
void Draw(SpriteBatch spriteBatch, Vector2 position, Rectangle? source, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth);
}
Texture2D에 의존하는 유일한 외부 메소드는 SpriteBatch.Draw ()이므로 확장 메소드를 추가하여 그들 사이에 브리지를 만들 수 있습니다.
public static void Draw(this SpriteBatch spriteBatch, ITexture texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth)
{
texture.Draw(spriteBatch, position, sourceRectangle, color, rotation, origin, scale, effects, layerDepth);
}
이렇게하면 전에 Texture2D를 사용할 때마다 ITexture를 서로 바꿔 사용할 수 있습니다.
그런 다음 RegularTexture와 LargeTexture와 같은 두 가지 다른 ITexture 구현을 만들 수 있습니다. 여기서 RegularTexture는 단순히 일반 Texture2D를 래핑합니다.
반면에 LargeTexture는 분할 된 전체 이미지 조각 중 하나에 해당하는 Texture2D 목록을 각각 유지합니다. 가장 중요한 부분은 LargeTexture에서 Draw ()를 호출하면 모든 변형을 적용하고 마치 하나의 연속 이미지 인 것처럼 모든 조각을 그릴 수 있어야한다는 것입니다.
마지막으로 전체 프로세스를 투명하게하기 위해 팩토리 메소드 역할을하는 통합 텍스처 로더 클래스를 작성합니다. 텍스처의 경로를 매개 변수로 사용하고 이미지 크기 제한을 초과하는지 여부에 따라 RegularTexture 또는 LargeTexture 인 ITexture를 반환합니다. 그러나 사용자는 어느 것을 알 필요가 없었습니다.
약간 과잉이거나 괜찮습니까?