โดยปกติจะใช้ข้อความ คุณจะพบจำนวนของรายละเอียดในคำถามอื่น ๆ บนเว็บไซต์นี้เช่นที่นี่หรือมี
ในการตอบตัวอย่างเฉพาะของคุณวิธีที่จะไปคือการกำหนด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
's Physics
จะรับข้อความและทำสิ่งที่การประมวลผลจะต้องทำ เมื่อเสร็จแล้วก็จะ:
- ส่งข้อความ "SetPosition" ไปที่ตนเองซึ่ง
Position
ส่วนประกอบนั้นจะเลือก;
- หรือเข้าถึง
Position
ส่วนประกอบโดยตรงสำหรับการแก้ไข (ค่อนข้างผิดสำหรับการออกแบบโดยใช้องค์ประกอบบริสุทธิ์เนื่องจากคุณไม่สามารถสันนิษฐานได้ว่าทุกวัตถุมีPosition
องค์ประกอบ แต่Position
องค์ประกอบอาจเป็นข้อกำหนดของPhysics
)
โดยทั่วไปแล้วเป็นความคิดที่ดีที่จะชะลอการประมวลผลข้อความจริงไปเป็นการอัพเดทองค์ประกอบถัดไป การประมวลผลทันทีอาจหมายถึงการส่งข้อความไปยังส่วนประกอบอื่นของวัตถุอื่นดังนั้นการส่งเพียงข้อความเดียวอาจหมายถึงสปาเก็ตตี้ที่แยกไม่ออกอย่างรวดเร็ว
คุณอาจจะต้องใช้ระบบขั้นสูงเพิ่มเติมในภายหลังใน: คิวข้อความอะซิงโครนัสการส่งข้อความไปยังกลุ่มวัตถุการลงทะเบียน / ยกเลิกการลงทะเบียนจากข้อความต่อองค์ประกอบอื่น ๆ
Message
ระดับสามารถเป็นภาชนะทั่วไปสำหรับสตริงที่เรียบง่ายตามที่ปรากฏข้างต้น แต่การประมวลผลสตริงที่รันไทม์ไม่ได้มีประสิทธิภาพจริงๆ คุณสามารถไปที่คอนเทนเนอร์ที่มีค่าทั่วไป: สตริงจำนวนเต็มลอย ... ด้วยชื่อหรือดีกว่ายังเป็น ID เพื่อแยกแยะข้อความประเภทต่างๆ หรือคุณสามารถหาคลาสพื้นฐานเพื่อให้เหมาะกับความต้องการเฉพาะได้ ในกรณีของคุณคุณสามารถจินตนาการได้EmitForceMessage
ว่าเกิดจากMessage
และเพิ่มเวกเตอร์แรงที่ต้องการ แต่ระวังค่าใช้จ่ายรันไทม์ของRTTIถ้าคุณทำเช่นนั้น