간단한 블록 기반 퍼즐 게임을 만들고 있습니다.
게임 플레이는 게임 영역에서 움직이는 블록으로 구성되어 있으므로 사소한 물리 시뮬레이션입니다. 그러나 내 구현은 이상과는 거리가 멀고 더 잘 수행하는 방법에 대한 조언을 줄 수 있는지 궁금합니다.
많은 퍼즐 게임에서와 마찬가지로 코드를 게임 로직과 UI의 두 영역으로 나누었습니다.
- 게임 로직은 게임의 일반적인 규칙 (예 : 체스의 공식 규칙 시스템)을 담당합니다.
- UI는 게임 영역과 조각 (예 : 체스 판 및 조각)을 표시하고 애니메이션 (예 : 체스 조각의 애니메이션 움직임)을 담당합니다.
게임 로직은 게임 상태를 논리적 그리드로 나타내며, 여기서 각 유닛은 그리드에서 하나의 셀 너비 / 높이입니다. 너비 6의 그리드의 경우 경계와 충돌 할 때까지 너비 2의 블록을 네 번 이동할 수 있습니다.
UI는이 그리드를 가져 와서 논리 크기를 픽셀 크기로 변환하여 (즉, 상수를 곱하여) 그립니다. 그러나 게임에는 게임 로직이 거의 없기 때문에 내 게임 로직 레이어 [1]는 충돌 감지 외에는 할 일이 없습니다. 작동 방식은 다음과 같습니다.
- 플레이어가 조각을 드래그하기 시작합니다
- UI는 게임 로직에 해당 부분의 법적 이동 영역을 요청하고 플레이어가 해당 영역 내에서 드래그하도록합니다.
- 플레이어는 조각을 놓을 수 있습니다
- UI가 조각을 그리드에 스냅합니다 (올바른 논리적 위치에 있도록)
- UI는 게임 로직에 새로운 논리적 위치를 알려줍니다 (돌연변이 방법을 통해)
나는 그것에 만족하지 않습니다.
- 내 게임 로직 레이어에 대한 단위 테스트를 작성하고 있지만 UI는 아닙니다. 모든 까다로운 코드는 UI에 있습니다. 조각이 다른 사람이나 경계와 충돌하는 것을 막고 그리드에 스냅합니다.
- UI가 게임 로직에 새로운 상태에 대해 알려주는 사실이 마음에 들지 않습니다.
movePieceLeft()
다른 게임과 마찬가지로 메소드 또는 이와 유사한 메소드를 호출하고 싶지만 그 접근 방식에 대해서는별로 멀지 않았습니다. 게임 로직은 UI에서 가능한 드래그 앤 스냅에 대해 아무것도 모릅니다.
가장 좋은 방법은 내 게임 로직 레이어를 없애고 대신 물리 레이어를 구현하는 것입니다. 나는 그것에 대해 몇 가지 질문이 있습니다.
- 이러한 물리 계층이 일반적입니까, 아니면 게임 논리 계층이이를 수행하는 것이 더 일반적인가요?
- 그리드 및 조각 끌기 코드에 스냅하는 것이 UI 또는 물리 계층에 속합니까?
- 그러한 물리 계층은 일반적으로 게임 크기와 같은 픽셀 크기 또는 어떤 종류의 논리 단위에서 작동합니까?
- 게임 코드베이스에서 이벤트 기반 충돌 감지를 한 번 보았습니다. 즉, 플레이어가 조각을 드래그하면 UI가이를 순종적으로 렌더링하고 물리 시스템에 알리고 물리 시스템은 onCollision () 메서드를 호출합니다. 충돌이 감지되면 조각에. 더 일반적인 것은 무엇입니까? 이 접근 또는 법적인 운동 영역을 먼저 요청?
[1] 레이어 는 아마도 내가 의미하는 바에 맞는 단어는 아니지만 각 레이어가 여러 클래스로 구성 될 수 있기 때문에 서브 시스템이 과장되어 클래스 가 잘못 안내됩니다.
답변
나는 아직도 배우기 때문에 게임 개발 경험이 많지 않지만 당신이 요구하는 것을 이해할 수 있기 때문에이 질문에 대답하려고 노력할 것입니다.
보시다시피 GUI 코드를 게임 논리 및 도메인 객체, 즉 퍼즐 조각과 분리해야합니다. 이것들은 실제로 세 개의 분리 된 레이어입니다. 그리고 그렇습니다 layer
. 제 생각에는 적절한 용어입니다. 시스템의 각 오브젝트 레벨을 서로 독립적 인 서브 시스템으로 분리하는 개념을 설명하는 데 종종 사용됩니다.
객체 지향 프로그래밍과 관련하여 각 객체는 클래스입니다. 따라서 퍼즐의 각 조각은 자체 클래스와 게임 보드로 구성됩니다. 게임 보드는 플레이어에게주고 자하는 크기와 이동 용량에 따라 X 조각 퍼즐을 포함해야합니다 .
그래서,이 주제에 대한 나의 생각은 다음과 같습니다.
- GUI 레이어 :이 레이어에는 게임 자체와 플레이어 간의 상호 작용을 허용하기 위해 게임 보드에 조각을 표시하는 방법 만 포함되어야합니다.
- 게임 컨트롤러 레이어 : 플레이어의 입력을 담당합니다. 그것은 조각이 다른 방향으로 움직 이도록 지시하고, 게임 보드에 움직임 등에 대한 충돌이 있는지 여부를 묻는 층입니다.
- 비즈니스 계층 :이 계층에는 모든 비즈니스 클래스, 즉 게임 조각과 퍼즐 조각이 포함 된 게임 보드 개체가 포함됩니다.
이 아키텍처에서는 GUI 계층에 게임 상태의 플레이어, 각 퍼즐 조각의 위치를 표시하게됩니다. GUI 레이어는 플레이어 입력을 가져 와서 기본 게임 컨트롤러 레이어로 전달하여 충돌 감지를 담당합니다. 없는 경우 조각을 해당 입력 방향으로 이동하도록 주문할 수 있습니다. 그렇게하려면 간단히이 조각을 호출하면됩니다 MoveLeft
.MoveRight
피스 등을 이동시키는 방법 등이 있습니다. 당신은 또한 게임 판에 당신이 어떤 조각을 움직이고 싶은지를 알려주고 나서 그 자체로 조각의 움직임을 주문한 다음 조각을 요구 된 방향으로 움직입니다. 이 아키텍처를 사용하면 각 코드를 다른 계층으로 쉽게 테스트 할 수 있으며 단위 테스트, 통합 테스트 및 기능 테스트가 가능합니다.
나는 이것이 시력에 약간 혼란스러워 보일 수 있음을 알고 있으며 그렇지 않은 경우 신에게 감사합니다! 더 자세한 내용과 도움이 필요하면 언제든지 문의하십시오. 게임 개발에있어 초보자이지만 최선을 다해 도와 드리겠습니다.
읽어 주셔서 감사합니다! =)