我有一堆不同的npcs。它们都具有不同的属性和不同的AI,因此我为每个类型创建了一个单独的类,并从基类实体派生它。我想使它能够为每种类型的实体分配一个ID,因此我可以调用CreateNewEntity(int id,Vector2位置)。我将如何做到这一点?我也有一种感觉,我设计得很糟糕。这是真的吗?基于ID的NPC系统
回答
有一对夫妇,你可以做到这一点的方式。 您可以创建一个属性,为该类型提供一些元数据,例如ID
public class RenderableEntity{
}
[EntityTypeAttribute(Name = "Wizard"]
public class Wizard : RenderableEntity{
}
然后你可以捆绑他们都在命名空间或逻辑容器和创建类型如下 伪:
//Create Entity
//Type Name
string entityName = "Wizard";
//Get the Type
from the namespace where the type has the custom attribute applied to it. Get the type
//Activator.Create(typeof(TheWizardType))
另一种是,你可以只拿到类型的名称相匹配,其中您传递给您的创建方法的字符串。
在这种情况下属性的附加值是多少?只有在使用反射查询类型的元数据时才会考虑属性。这被认为是一个昂贵的操作,为什么在这种情况下需要? –
属性的使用仅仅是为了指出问题的可行解决方案,这个问题有很多解决方案。 该属性可能包含其他属性,将其标识为可在运行时创建的实体类型。 –
从基本实体继承听起来像是一个很好的方法。所有对象之间共享的任何东西都应该放在基本实体中,任何特定于每种类型NPC的东西都应该放在自己的类中。具有相同目的但具有不同实现(如AI或CreateNewEntity)的东西应该标记为虚拟,因此可以从基本实体列表中调用方法,但是正确的实现将运行。 CreateNewEntity应该可能是一个构造函数。
例如:
public class Entity
{
public int Id { get; protected set; }
public Vector2 Position { get; protected set; }
public int Strength { get; protected set; }
public Entity(int id, Vector2 position)
{
Id = id;
Position = position;
Strength = 1;
}
public virtual RunAI()
{
Position.X = Position.X + 1;
}
}
public class SuperHero
{
public SuperHero(int id, Vector2 position) : base (id, position)
{
Strength = 20;
}
public override void RunAI()
{
Position.X = Position.X + 500;
}
}
我得到你在这里做什么,但我希望id引用对象的类型。所以每当我创建一个ID为1的实体时,它就会成为一个超级英雄,2它将成为一只蜘蛛。 – Raj
这听起来像轻量级的模式会在这里是有益的:http://www.primos.com.au/primos/Default.aspx?PageContentID=27&tabid=65
你可能想区分核心状态,使每个实体的不同,然后把尽可能多的共享实例。
- 1. 基于XMPP的Chatbot基于UC系统
- 2. 基于AutoMapper Convention的系统
- 3. 基于知识的系统
- 4. 获取基于NFC的识别系统的应用程序ID
- 5. 基于PHP文件系统的聊天系统的缺点
- 6. Prolog的基于规则的系统
- 7. 替代基于Tick的系统
- 8. 基于时间的得分系统南
- 9. 基于ANN的导航系统
- 10. 基于Doctrine的CodeIgniter认证/ acl系统
- 11. 基于MySQL标签的系统
- 12. 基于gridview数据的数据系统
- 13. 基于TCP IP的大型pubsub系统
- 14. 基于Asp.Net的开源ERP系统
- 15. 基于Web的视频采集系统
- 16. PHP基于Doamin的授权系统
- 17. ArangoDB - 基于图表的推荐系统
- 18. AS3:基于瓷砖的运动系统
- 19. 基于Cookie的Android登录系统
- 20. 基于国名的Magento主题系统
- 21. 基于rabbitMQ的分布式Java系统
- 22. 构建基于Web的专家系统?
- 23. 基于视图的导航系统
- 24. 基于Sass/Less/etc的网格系统?
- 25. 基于社区的翻译系统
- 26. 基于操作系统的重定向
- 27. 基于PHP的商业Instelligence系统
- 28. 创建基于Web的工资系统
- 29. 基于Redis通知系统的问题
- 30. 选择基于Java的缓存系统
一般而言,继承不是设置属性和行为的好选择。相反,聚合是对其进行建模的更好方式。我没有很好的提及你,所以我发表评论。尝试寻找“游戏开发继承与聚合” – renatopp