“실제 단위”를 픽셀로 스케일링하는 일반적인 패턴? 있는지 알고

이것은 이 다른 질문에 대한 후속 질문 입니다.

세계의 표현 (현재 160Kmx160Km) 을 그림 영역 (현재 800×600 픽셀) 에 맞게 스케일링하는 공통 / 일반 / 최상의 패턴이 있는지 알고 싶습니다 .

적어도 네 가지 접근법을 생각할 수 있습니다.

순진한 사람 (내가 지금까지 한 방식). sc(vector)전달 된 벡터의 축소 된 복사본을 반환 하는 전역 함수 를 구현 했습니다. 물론 작동하지만 다음과 같은 코드를 작성해야합니다.

drawCircle(sc(radius), sc(position))

랩핑 기능 . 여러 기능을 정의 할 수 있는데, 각각의 기능은 원래 미들웨어를 랩핑합니다. 예를 들어, myDrawCircle먼저 스케일링이 필요한 인수를 스케일링 drawCircle하고 후자 를 호출 하도록 정의 할 수 있습니다. 이렇게하면 코드를 더 읽기 쉽고 유지 관리하기가 쉬워 지지만 어리석게 들리는 많은 줄 바꿈 기능을 작성해야합니다.

함수 데코레이터 . 기존 미들웨어 함수를 간단히 장식하여 클래스의 인스턴스화되는 모든 매개 변수에 대한 자동 스케일링을 제공 할 수는 Vector3D있지만 문제는 해당 함수가 동일한 매개 변수와 함께 작동 list하거나 해당 매개 변수와도 작동 Vector2D하므로 데코레이터는 알 방법이 없다는 것입니다 어떤 목록은 축척이 필요한지 (예 : 반지름) 어떤 목록이 아닌지 (RGB 값)

표면 초기화 . 그릴 표면을 정의 할 때 스케일링 팩터를 정의 할 수 있습니다 (그래서 픽셀이 아닌 미터를 매개 변수로 사용하도록). 이것은 나를 위해 투명하게 작동하고 선택하는 솔루션 일 것입니다. 물론 미들웨어로 구현해야하므로 실제 옵션이 아닙니다.

… 어쨌든 : 이것은 매우 일반적인 문제이므로 찾지 못한이 문제를 우아하게 해결하는 확립 된 패턴이 있는지 궁금합니다.

추신 :이 프로젝트에서는 python ( pygame )을 사용하고 있지만 Python / pygame 관련 답변은 높이 평가되지만 구체적인 구현보다는 패턴의 일반적인 / 높은 수준의 설명에 더 관심이 있습니다.

시간과 전문 지식을 미리 감사드립니다.



답변

이를 수행하는 표준 방법은 렌더링 중에 변환을 수행 할 변환 매트릭스를 설정하는 것입니다. 3D 렌더링의 경우 카메라를위한 뷰 변환 매트릭스입니다.

대부분의 2D API에는 뷰 변환도 2×3 매트릭스 또는 별도의 스케일, 변환 및 회전으로 지정하는 방법이 있습니다.

파이 게임 문서를 간단히 살펴보면 뷰 변환 매트릭스를 직접 구현해야합니다. 표면 클래스에서 자신의 클래스를 파생시켜 해당 기능을 추가 할 수 있습니까?


답변

이것은 매우 일반적인 문제이므로 찾지 못한이 문제를 우아하게 해결하는 기존 패턴이 있는지 궁금합니다.

일반적으로 사람들은 2D 게임에서 런타임 스케일링을 시도하지 않습니다. 나는 그것이 일반적인 문제라는 것에 동의하지 않습니다. 사람들이 미니 맵이나 다른 고정 크기 조정을 원한다면,이 목적을 위해 새로운 그래픽 세트가 종종 있습니다. 2D 게임에서 2 가지 확대 / 축소 수준으로 실행하려면 단일 루틴이 필요한 경우는 거의 없습니다.

3D API를 사용하는 경우 카메라 / 뷰포트 매개 변수를 변경하기 만하면이 기능을 무료로 사용할 수 있습니다.

PyGame은 매우 오래된 API이며 불행히도 2D에만 적합합니다. 다른 줌 레벨에 적합한 스케일링 시스템을 개발할 수 있어도 성능이 충분하지 않으며 외관이 용납 될 수 없을 정도로 나빠질 수 있습니다.

확대 / 축소를 많이하려면 최대한 빨리 최신 3D API로 전환하는 것이 좋습니다. 나는 피그렛 을 추천 하지만 다른 것들도있을 것입니다.