좋은 질문! 질문에 대한 구체적인 질문을하기 전에 다음과 같이 말씀 드리겠습니다. 단순성의 힘을 과소 평가하지 마십시오. Tenpn이 맞습니다. 이러한 접근 방식으로 수행하려는 모든 것은 함수 호출을 연기하거나 호출자와 수신자를 분리하는 우아한 방법을 찾는 것입니다. 나는 코 루틴을 이러한 문제의 일부를 완화시키는 놀랍도록 직관적 인 방법으로 추천 할 수 있지만, 주제가 약간 다릅니다. 때로는 함수를 호출하고 엔티티 A가 엔티티 B에 직접 연결되어 있다는 사실에 따라 생활하는 것이 좋습니다. YAGNI를 참조하십시오.
즉, 간단한 메시지 전달과 결합 된 신호 / 슬롯 모델에 만족했습니다. 매우 빡빡한 일정을 가진 상당히 성공적인 iPhone 타이틀을 위해 C ++과 Lua에서 사용했습니다.
신호 / 슬롯 사건의 경우, 엔티티 A가 엔티티 B가 한 일에 응답하여 무언가를하도록하려면 (예 : 무언가가 죽으면 문을 잠금 해제) 엔티티 A가 엔티티 B의 사망 이벤트에 직접 가입하도록 할 수 있습니다. 또는 엔터티 A는 엔터티 그룹 각각을 구독하고, 발생한 각 이벤트에서 카운터를 증가시키고, N 개가 사망 한 후 도어를 잠금 해제 할 수 있습니다. 또한 "엔터티 그룹"및 "N 중 하나"는 일반적으로 레벨 데이터에 정의 된 디자이너입니다. (제외 적으로, 이것은 코 루틴이 실제로 빛날 수있는 영역입니다. 예를 들어 WaitForMultiple ( "Dying", entA, entB, entC); door.Unlock ();)
그러나 C ++ 코드와 밀접하게 결합 된 반응이나 본질적으로 임시 게임 이벤트 : 손상 처리, 무기 재 장전, 디버깅, 플레이어 중심 위치 기반 AI 피드백과 관련하여 번거로울 수 있습니다. 메시지 전달이 공백을 채울 수있는 곳입니다. 기본적으로 "이 지역의 모든 개체에게 3 초 안에 피해를 입히도록 지시하십시오"또는 "물리학을 완료 할 때마다 내가 총을 쏜 사람을 알아낼 때마다이 스크립트 기능을 실행하도록 지시합니다."와 같이 요약됩니다. 발행 / 구독 또는 신호 / 슬롯을 사용하여이를 잘 수행하는 방법을 알아내는 것은 어렵습니다.
이것은 쉽게 과잉 일 수 있습니다 (tenpn의 예와 비교). 많은 행동을 취하면 비효율적 일 수 있습니다. 그러나 단점에도 불구하고이 "메시지 및 이벤트"접근 방식은 스크립트 게임 코드 (예 : Lua)와 매우 잘 맞습니다. 스크립트 코드는 C ++ 코드를 전혀 고려하지 않고 자체 메시지와 이벤트를 정의하고 반응 할 수 있습니다. 또한 스크립트 코드는 레벨 변경, 소리 재생 또는 무기가 TakeDamage 메시지가 얼마나 많은 피해를 주는지 등 C ++ 코드를 트리거하는 메시지를 쉽게 보낼 수 있습니다. luabind로 끊임없이 속일 필요가 없었기 때문에 시간이 많이 절약되었습니다. 그리고 그것은 내 많은 luabind 코드를 한곳에 보관할 수있게 해주었습니다. 제대로 연결되면
또한 유스 케이스 # 2에 대한 나의 경험은 다른 방향으로 이벤트로 처리하는 것이 더 낫다는 것입니다. 개체의 건강 상태를 묻지 않고 건강이 크게 변경 될 때마다 이벤트를 시작하거나 메시지를 보냅니다.
btw의 인터페이스 측면에서 EventHost, EventClient 및 MessageClient라는 세 가지 클래스로이 모든 것을 구현했습니다. EventHosts는 슬롯을 만들고 EventClients는 구독 / 연결하며 MessageClients는 대리자를 메시지와 연결합니다. MessageClient의 대리자 대상이 반드시 연결을 소유 한 동일한 개체 일 필요는 없습니다. 즉, MessageClient는 메시지를 다른 객체로 전달하기 위해서만 존재할 수 있습니다. 그러나 호스트 / 클라이언트 은유는 부적절합니다. 소스 / 싱크가 더 나은 개념 일 수 있습니다.
미안, 나는 거기에서 약간 으르렁 거렸다. 그것은 나의 첫 번째 대답입니다 :) 나는 그것이 이해되기를 바랍니다.