Tôi đã nghĩ về cách thực hiện ghi đè các hành vi trong một hệ thống thực thể dựa trên thành phần. Một ví dụ cụ thể, một thực thể có thành phần sức khỏe có thể bị hư hại, được chữa lành, bị giết, v.v ... Thực thể đó cũng có một thành phần áo giáp giới hạn mức độ thiệt hại mà nhân vật nhận được.
Có ai đã thực hiện các hành vi như thế này trong một hệ thống dựa trên thành phần trước đây chưa?
Bạn đã làm nó như thế nào?
Nếu không ai từng làm điều này trước đây tại sao bạn nghĩ đó là. Có bất cứ điều gì đặc biệt sai lầm về việc ghi đè các hành vi thành phần?
Dưới đây là bản phác thảo sơ bộ về cách tôi tưởng tượng nó sẽ hoạt động. Các thành phần trong một thực thể được đặt hàng. Những người ở phía trước có cơ hội để phục vụ một giao diện đầu tiên. Tôi không nói chi tiết về việc đó được thực hiện như thế nào, chỉ giả sử nó sử dụng tà ác dynamic_cast
(không có nhưng hiệu quả cuối cùng là như nhau mà không cần RTTI).
class IHealth
{
public:
float get_health( void ) const = 0;
void do_damage( float amount ) = 0;
};
class Health : public Component, public IHealth
{
public:
void do_damage( float amount )
{
m_damage -= amount;
}
private:
float m_health;
};
class Armor : public Component, public IHealth
{
public:
float get_health( void ) const
{
return next<IHealth>().get_health();
}
void do_damage( float amount )
{
next<IHealth>().do_damage( amount / 2 );
}
};
entity.add( new Health( 100 ) );
entity.add( new Armor() );
assert( entity.get<IHealth>().get_health() == 100 );
entity.get<IHealth>().do_damage( 10 );
assert( entity.get<IHealth>().get_health() == 95 );
Có điều gì đặc biệt ngây thơ về cách tôi đề xuất để làm điều này?
IHealth
và IKnockback
. Sẽ không có nghĩa gì nếu tham gia hai thành phần đó trong một hệ thống phân cấp lớp duy nhất. Nhiều kế thừa luôn gây rắc rối Tôi đã cân nhắc việc Shield sử dụng một lớp thành viên proxy xuất phát từ IHealth
đó và sau đó chuyển tiếp tất cả các cuộc gọi đến Shield. Với kỹ thuật triển khai đó, không có MI với chi phí của một cuộc gọi phương thức phi ảo bổ sung (mà trình tối ưu hóa có thể có khả năng nội tuyến). Trong cả hai trường hợp API ( add
, get
, next
, vv) là như nhau.