UI 코드에서 물리와 게임 로직 분리 수 있습니다. UI는이 그리드를 가져 와서 논리

간단한 블록 기반 퍼즐 게임을 만들고 있습니다.

게임 플레이는 게임 영역에서 움직이는 블록으로 구성되어 있으므로 사소한 물리 시뮬레이션입니다. 그러나 내 구현은 이상과는 거리가 멀고 더 잘 수행하는 방법에 대한 조언을 줄 수 있는지 궁금합니다.

많은 퍼즐 게임에서와 마찬가지로 코드를 게임 로직과 UI의 두 영역으로 나누었습니다.

  • 게임 로직은 게임의 일반적인 규칙 (예 : 체스의 공식 규칙 시스템)을 담당합니다.
  • UI는 게임 영역과 조각 (예 : 체스 판 및 조각)을 표시하고 애니메이션 (예 : 체스 조각의 애니메이션 움직임)을 담당합니다.

게임 로직은 게임 상태를 논리적 그리드로 나타내며, 여기서 각 유닛은 그리드에서 하나의 셀 너비 / 높이입니다. 너비 6의 그리드의 경우 경계와 충돌 할 때까지 너비 2의 블록을 네 번 이동할 수 있습니다.

UI는이 그리드를 가져 와서 논리 크기를 픽셀 크기로 변환하여 (즉, 상수를 곱하여) 그립니다. 그러나 게임에는 게임 로직이 거의 없기 때문에 내 게임 로직 레이어 [1]는 충돌 감지 외에는 할 일이 없습니다. 작동 방식은 다음과 같습니다.

  1. 플레이어가 조각을 드래그하기 시작합니다
  2. UI는 게임 로직에 해당 부분의 법적 이동 영역을 요청하고 플레이어가 해당 영역 내에서 드래그하도록합니다.
  3. 플레이어는 조각을 놓을 수 있습니다
  4. UI가 조각을 그리드에 스냅합니다 (올바른 논리적 위치에 있도록)
  5. UI는 게임 로직에 새로운 논리적 위치를 알려줍니다 (돌연변이 방법을 통해)

나는 그것에 만족하지 않습니다.

  • 내 게임 로직 레이어에 대한 단위 테스트를 작성하고 있지만 UI는 아닙니다. 모든 까다로운 코드는 UI에 있습니다. 조각이 다른 사람이나 경계와 충돌하는 것을 막고 그리드에 스냅합니다.
  • UI가 게임 로직에 새로운 상태에 대해 알려주는 사실이 마음에 들지 않습니다. movePieceLeft()다른 게임과 마찬가지로 메소드 또는 이와 유사한 메소드를 호출하고 싶지만 그 접근 방식에 대해서는별로 멀지 않았습니다. 게임 로직은 UI에서 가능한 드래그 앤 스냅에 대해 아무것도 모릅니다.

가장 좋은 방법은 내 게임 로직 레이어를 없애고 대신 물리 레이어를 구현하는 것입니다. 나는 그것에 대해 몇 가지 질문이 있습니다.

  1. 이러한 물리 계층이 일반적입니까, 아니면 게임 논리 계층이이를 수행하는 것이 더 일반적인가요?
  2. 그리드 및 조각 끌기 코드에 스냅하는 것이 UI 또는 물리 계층에 속합니까?
  3. 그러한 물리 계층은 일반적으로 게임 크기와 같은 픽셀 크기 또는 어떤 종류의 논리 단위에서 작동합니까?
  4. 게임 코드베이스에서 이벤트 기반 충돌 감지를 한 번 보았습니다. 즉, 플레이어가 조각을 드래그하면 UI가이를 순종적으로 렌더링하고 물리 시스템에 알리고 물리 시스템은 onCollision () 메서드를 호출합니다. 충돌이 감지되면 조각에. 더 일반적인 것은 무엇입니까? 이 접근 또는 법적인 운동 영역을 먼저 요청?

[1] 레이어 는 아마도 내가 의미하는 바에 맞는 단어는 아니지만 각 레이어가 여러 클래스로 구성 될 수 있기 때문에 서브 시스템이 과장되어 클래스 가 잘못 안내됩니다.



답변

나는 아직도 배우기 때문에 게임 개발 경험이 많지 않지만 당신이 요구하는 것을 이해할 수 있기 때문에이 질문에 대답하려고 노력할 것입니다.

보시다시피 GUI 코드를 게임 논리 및 도메인 객체, 즉 퍼즐 조각과 분리해야합니다. 이것들은 실제로 세 개의 분리 된 레이어입니다. 그리고 그렇습니다 layer. 제 생각에는 적절한 용어입니다. 시스템의 각 오브젝트 레벨을 서로 독립적 인 서브 시스템으로 분리하는 개념을 설명하는 데 종종 사용됩니다.

객체 지향 프로그래밍과 관련하여 각 객체는 클래스입니다. 따라서 퍼즐의 각 조각은 자체 클래스와 게임 보드로 구성됩니다. 게임 보드는 플레이어에게주고 자하는 크기와 이동 용량에 따라 X 조각 퍼즐을 포함해야합니다 .

그래서,이 주제에 대한 나의 생각은 다음과 같습니다.

  1. GUI 레이어 :이 레이어에는 게임 자체와 플레이어 간의 상호 작용을 허용하기 위해 게임 보드에 조각을 표시하는 방법 만 포함되어야합니다.
  2. 게임 컨트롤러 레이어 : 플레이어의 입력을 담당합니다. 그것은 조각이 다른 방향으로 움직 이도록 지시하고, 게임 보드에 움직임 등에 대한 충돌이 있는지 여부를 묻는 층입니다.
  3. 비즈니스 계층 :이 계층에는 모든 비즈니스 클래스, 즉 게임 조각과 퍼즐 조각이 포함 된 게임 보드 개체가 포함됩니다.

이 아키텍처에서는 GUI 계층에 게임 상태의 플레이어, 각 퍼즐 조각의 위치를 ​​표시하게됩니다. GUI 레이어는 플레이어 입력을 가져 와서 기본 게임 컨트롤러 레이어로 전달하여 충돌 감지를 담당합니다. 없는 경우 조각을 해당 입력 방향으로 이동하도록 주문할 수 있습니다. 그렇게하려면 간단히이 조각을 호출하면됩니다 MoveLeft.MoveRight피스 등을 이동시키는 방법 등이 있습니다. 당신은 또한 게임 판에 당신이 어떤 조각을 움직이고 싶은지를 알려주고 나서 그 자체로 조각의 움직임을 주문한 다음 조각을 요구 된 방향으로 움직입니다. 이 아키텍처를 사용하면 각 코드를 다른 계층으로 쉽게 테스트 할 수 있으며 단위 테스트, 통합 테스트 및 기능 테스트가 가능합니다.

나는 이것이 시력에 약간 혼란스러워 보일 수 있음을 알고 있으며 그렇지 않은 경우 신에게 감사합니다! 더 자세한 내용과 도움이 필요하면 언제든지 문의하십시오. 게임 개발에있어 초보자이지만 최선을 다해 도와 드리겠습니다.

읽어 주셔서 감사합니다! =)


답변