일반적으로 메시지를 사용하여 수행됩니다. 당신 같은이 사이트에 다른 질문에 세부 정보를 많이 찾을 수 있습니다 여기에 또는 이를 .
구체적인 예를 들어,가는 방법은 Message
객체가 처리 할 수 있는 작은 클래스 를 정의하는 것입니다 .
struct Message
{
Message(const Objt& sender, const std::string& msg)
: m_sender(&sender)
, m_msg(msg) {}
const Obj* m_sender;
std::string m_msg;
};
void Obj::Process(const Message& msg)
{
for (int i=0; i<m_components.size(); ++i)
{
// let components do some stuff with msg
m_components[i].Process(msg);
}
}
이런 방식으로 Obj
클래스 관련 인터페이스를 "오염"시키지 않습니다 . 일부 구성 요소는 메시지를 처리하도록 선택할 수 있으며 일부 구성 요소는 메시지를 무시할 수 있습니다.
다른 객체에서이 메소드를 직접 호출하여 시작할 수 있습니다.
Message msg(obj1, "EmitForce(5.0,0.0,0.0)");
obj2.ProcessMessage(msg);
이 경우, obj2
의는 Physics
메시지를 선택하고, 처리는 할 필요가 무엇이든지 할 것입니다. 완료되면 다음 중 하나입니다.
Position
컴포넌트가 선택 하도록 "SetPosition"메시지를 자신에게 보냅니다 .
- 또는
Position
수정을 위해 구성 요소에 직접 액세스하십시오 (모든 객체에 Position
구성 요소 가 있다고 가정 할 수는 없지만 Position
구성 요소는의 요구 사항 일 수 있음 Physics
).
일반적으로 메시지의 실제 처리를 다음 구성 요소의 업데이트 로 지연 시키는 것이 좋습니다 . 즉시 처리한다는 것은 다른 객체의 다른 구성 요소로 메시지를 보내는 것을 의미하므로 한 메시지 만 보내면 불가분의 스파게티 스택을 의미 할 수 있습니다.
비동기 메시지 대기열, 객체 그룹에 메시지 전송, 구성 요소 별 메시지 등록 / 등록 취소 등 나중에 고급 시스템을 사용해야 할 것입니다.
Message
위,하지만 런타임에 문자열을 처리하는 것은 정말 비효율적이기 때문에 클래스는 단순한 문자열을 일반 용기가 될 수 있습니다. 문자열, 정수, 부동 소수점 등 일반 값의 컨테이너를 사용할 수 있습니다. 이름이나 더 나은 ID를 사용하여 다른 유형의 메시지를 구별 할 수 있습니다. 또는 특정 요구에 맞는 기본 클래스를 파생시킬 수도 있습니다. 귀하의 경우 원하는 힘 벡터 EmitForceMessage
에서 파생 Message
되고 추가 되는 RT를 상상할 수 있지만 RTTI 의 런타임 비용에주의하십시오 .