컴포넌트 기반 아키텍처로 효과적인 게임 오브젝트 인터랙션 체계를 어떻게 디자인 할 수 있습니까? 수 있는지에 대한 예는

이것은 디자인 질문입니다 … 이것이 더 일반화 될 수 있다고 확신하지만 어려움을 겪고 있습니다. 게임 오브젝트 상호 작용을위한 디자인이 궁금합니다. 다음은 나의 예제입니다 (2D 퍼즐 플랫폼).

플레이어가 레벨을 진행하려고한다고 가정 해 봅시다. 다른 방향으로 지시 할 수있는 조명이 많이 있습니다. 이 가벼운 물체가 어떻게 상호 작용할 수 있는지에 대한 예는 다음과 같습니다.

  • 하나의 조명은 플레이어가 틈새를 넘을 수있는 플랫폼을 투사합니다.
  • 하나의 빛은 접촉하는 모든 것의 마찰 계수를 감소시키고 다른 빛은 증가시킵니다
  • 하나의 조명은 모든 조명의 효과를 무효화합니다. 이로 인해 조명이 켜져있는 동안 플랫폼이 사라지고 마찰 수정자가 무효화됩니다.
  • 기타…

구성 요소 아키텍처를 사용할 때이 문제에 접근하는 가장 좋은 방법은 무엇입니까? 각 주요 객체의 구성 요소는 분명하고 환경에 미치는 영향을 정의하는 명확한 방법입니다. 상호 작용을 “해결”하는 클래스 (그러면 빨리 혼란스러워 보일 수 있음)? 주어진 시간에 상호 작용하는 오브젝트에 대해 결합 된 오브젝트를 작성하기위한 데코레이터 패턴의 일부 사용? 이것에 적합한 데이터 구조?

또한 이러한 상호 작용에 오디오를 연결 하시겠습니까? 오디오를 시스템에 연결하는 것은 가시성 또는 플레이어 이동 / 충돌과 같은 다른 속성을 연결하는 것과 같습니다.

더 많은 구성 요소가 추가됨에 따라 수정 작업이 거의없는 새로운 시스템을 처리 할 수있는 강력한 시스템이 있다면 좋을 것입니다.

기타 정보 : 사용중인 엔진은 IceCream 이라는 XNA 엔진 입니다.



답변

객체 지향 시스템에서 X를 수행하는 가장 좋은 방법에 대한 질문에 대한 유일한 실제 답변 은 무언가를 시작하고 실행할 때 생각할 수있는 가장 직접적인 방법으로 수행해야한다는 것입니다. 더 쉬운 표현이 분명해집니다. 코드를 작성하기 전에 올바른 패턴을 선택하는 것에 대해 고민하는 것은 시작부터 잘못된 답변으로 자신을 안장하는 좋은 방법입니다. 패턴과 컴포넌트에 대한 모든 생각이 사라지고 현재 단계부터 시작하여 다음 단계를 따르십시오 (가벼운 컴포넌트를 구현했다고 가정).

  1. 프로젝트 플랫폼에 광원 구성 요소에 코드를 추가하십시오. (이 작업을 수행하십시오.)
  2. 해당 구성 요소를 새 구성 요소에 복사하고 플랫폼을 제거하고 적절한 오브젝트의 마찰을 줄이기 위해 코드를 추가하십시오. (이 작업을 수행하고 # 1이 여전히 작동하는지 확인하십시오.)
  3. 해당 구성 요소를 새 구성 요소에 복사하여 “새”코드를 제거하고 다른 구성 요소의 효과를 비활성화하는 항목을 추가하십시오. (이 작업을 수행 한 다음 # 1과 # 2가 여전히 작동하는지 확인하십시오.)

이 시점에서, 아마도 많은 양의 중복 된 코드를 갖게 될 것입니다. 공통 코드를 함수 나 다른 클래스 (기본 클래스) 또는 적절한 것으로 추출하십시오. “라이트 컴포넌트”로 시작했다고해서 LightComponent가 적절한베이스라는 의미는 아닙니다. 라이트 컴포넌트를 구성하는 코드는 실제로 “컴포넌트”가 아니며 함수 세트 또는 새 컴포넌트에 집계 된 개별 클래스 (멤버 변수로 표시됨)로 가장 잘 표현 될 수 있습니다. ).


답변

일반적으로 A 유형의 오브젝트가 B 유형의 오브젝트와 상호 작용할 때 C에 영향을 미치려고합니다.이를 “이중 디스패치” 라고 하며 C와 같은 언어에서는 우아하게하기가 매우 어렵습니다.

효과적이지만 유지 관리하기 어려운 방법은 객체 유형에 따라 스위치와 if 문입니다. 글씨가 지저분하게 느껴지지만 작업이 완료됩니다.

Visitor 패턴은 불쾌한 형 스위칭 숨기고보다 강력한 해결책이지만 clumbersome가 설정 될 수있다.

일반적으로 코드의 모든 유형 스위치는 냄새이지만, 여기서는 일반적으로 단일 유형을 기준으로 함수를 전환하고 두 유형을 기반으로 함수를 전환하는 다형성을 일반화하려고합니다. 다형성은 OOP의 기초이므로 냄새가 아닙니다.


답변

보자 이것은 글을 쓰는 동안 머릿속에서 요리 한 것이므로 빠진 것이 있으면 죄송합니다.

친구 주변에서 적당한 거리에 모든 조명 노드를 설치하십시오.

각 조명에 대해 해당 효과 영역을 나타내는 다각형을 프레임 버퍼 객체에 렌더링합니다. 따라서 빛의 원뿔은 FBO에서 한 유형의 픽셀의 원뿔을 만듭니다. 각 노드 유형을 적절한 우선 순위로 패스에 렌더링하십시오. 초록색 채널은 마찰, 빨강, 중력, 파랑 및 알파와 같은 각 픽셀로 정보를 인코딩 할 수 있습니다.

그런 다음 영리한 색상 혼합 기술로 흥미로운 효과를 얻을 수 있습니다. 각 레벨마다 고유 한 블렌딩 규칙이있을 수 있으며, 맥동 중력 등과 같은 환각 동적 효과를 위해 조각 음영을 추가 할 수도 있습니다.

마지막으로, 남자 친구가 어떤 픽셀을 만지고 있는지 확인하고 미리 계산 된 영역의 가장자리에 가까워 질 때마다 비트 맵을 다시 계산하십시오.

내 아이디어를 설명하기 위해 2 분 안에 거친 스 캐치를 만들었습니다.

삽화

편집 : 실제로 이것은 당신이 필요로하는 것은 특정 색상을 방출하는 하나의 조명 구성 요소만을 의미합니다. 규칙은 다른 색으로 무엇을 할 수 있는지에 관한 규칙입니다. pr 픽셀이있는 32 비트로 많은 데이터를 인코딩 할 수 있습니다. 또는 서로 영향을 미치지 않는 다른 특성을 포함하는 여러 FBO를 가질 수 있습니다. 하나의 중력 / 마찰 FBO와 하나의 1 비트 충돌 FBO를 가질 수 있습니다. 이것을 선택한다면, 물론 어떤 FBO에 라이트를 렌더해야하는지 플래그를 지정해야합니다.


답변

관찰자 패턴 은 최상의 솔루션 중 하나입니다. 메시지는 실제로 관심이있는 개체 (구성 요소)로만 전송됩니다. 따라서 수신자는이 메시지 / 이벤트 유형을 구독해야합니다.

많은 신호 / 슬롯 구현이 있습니다. 예를 들어, C ++에는
sigslot 라이브러리가 있습니다

자세한 정보는 Qt 신호 및 슬롯 에 대해 읽으십시오 .


답변