Articles of 多态性

使用inheritance的类/多态性创建级别时出现问题

我试图通过让每个级别的类inheritance基类来编写我的级别类…基类使用纯虚函数。 我的基类只是作为一个向量,将inheritance的级别类推到它…这是我的代码看起来像在这一刻,我已经尝试了各种各样的东西,并得到相同的结果(分割故障)。 //level.h class Level { protected: Mix_Music *music; SDL_Surface *background; SDL_Surface *background2; vector<Enemy> enemy; bool loaded; int time; public: Level(); virtual ~Level(); int bgX, bgY; int bg2X, bg2Y; int width, height; virtual void load(); virtual void unload(); virtual void update(); virtual void draw(); }; //level.cpp Level::Level() { bgX = 0; bgY = 0; bg2X […]

编辑器中的Unity多态性通过列表

所以我有一个ItemDatabase类,它基本上只有一个Item的列表 public class ItemDatabase : MonoBehaviour { public List<Item> Items = new List<Item>(); } Item类看起来如下所示: [System.Serializable] public class Item { public string Name; public int Id; public string Description; public Texture2D Icon; } 现在我有一些从Item类派生的Itemtypes,例如Consumable [System.Serializable] public class Consumable : Item { public int Resore; } 我接下来在我的编辑器中创建了一个gameobject(空),并将我的ItemDatabase到该对象,在列表中提供了一些项目是没有问题的,但我想确保 – 从我的编辑器 – 我可以select一种Item放入列表中,截至目前,它只允许我添加Item而不是Consumable因为它是Item的列表。 我是否也可以强迫编辑不要仅仅通过使它成为一个抽象类来接受Item ?

如何处理派生演员的类似行为(inheritance)

我有一个称为Attacker的基类,有一个update方法。 update方法使攻击者通过如下所示的航路点arrays移动: – (void) update:(ccTime)dt { if(state == kMove) { // code to move to next waypoint // on reaching the next waypoint, update the next waypoint variable // if the final waypoint is reached, then stop the movement of attacker } } 所以,基类会照顾简单的航点运动逻辑。 现在我从Attacker类派生出几个类,像Rifleman , MachineGunner , Engineer 。 现在我想让每个派生类在到达最终的路点时执行特定的操作。 例如,我希望步枪手改变攻击姿态,机枪手部署和设置他的枪,工程师开始构建防御。 我如何做到这一点? 我目前的想法是检查每个派生类的update方法中的最终航点条件,并执行相应的操作。 – […]

使用虚拟方法查询属性的成本?

假设你正在制作一个基于瓦片的滚动游戏,并且你 沉迷于OOP。 你有一个抽象的基类Tile将被许多派生类inheritance,如Grass Sand和Water 基类声明了用于查询派生类属性的虚方法,例如isCollidable()和isFlammable() class Tile{ public: virtual constexpr bool isCollidable() = 0; virtual constexpr bool isFlammable() = 0; }; class Grass: public Tile{ public: constexpr bool isCollidable(){ return false; } constexpr bool isFlammable(){ return true; } }; class Sand: public Tile{ public: constexpr bool isCollidable(){ return false; } constexpr bool isFlammable(){ return false; […]

碰撞形状抽象devise

直接的事实。 我有一个基础CEntity类为我的游戏中的不同实体: 静态实体(不移动的只是道具和物品) dynamic实体(这些移动,跳转) 其中每个可以有不同的碰撞形状,支持的形状是: CCollisionShapeAABB(AABB) CCollisionShapeBSphere(Bounding Sphere) CCollisionShapeSoup(多边形汤,顶点/索引列表) CEntity所有实体的基类都有一个成员对象,稍后会根据它们的碰撞形状inheritance类来初始化它。 下面,CEntityPlayer初始化,其中玩家使用AABB。 // Initialize proper Collision Shape for this Entity m_pCollisionShape = new CCollisionShapeAABB(pNewNode->GetSizeMinimals(), pNewNode->GetSizeMaximals()); CEntity有一个方法,采取另一个实体,并进行交叉testing。 相交testing取决于碰撞形状实体的types。 bool CEntity::Intersect(CEntity *pEntity) { ASSERT(pEntity); CCollisionShape::eCollisionShapeClass _myClass = m_pCollisionShape->GetCollisionClass(); CCollisionShape::eCollisionShapeClass _hisClass = pEntity->GetCollision()->GetCollisionClass(); if(_myClass == CCollisionShape::eCollisionShapeClass::COLLISION_SHAPE_CLASS_AABB) { CCollisionShapeAABB *pMyShape = static_cast<CCollisionShapeAABB*>(m_pCollisionShape); if(_hisClass == CCollisionShape::eCollisionShapeClass::COLLISION_SHAPE_CLASS_AABB) { return pMyShape->Collides(*static_cast<CCollisionShapeAABB*>(pEntity->GetCollision())); } else […]

inheritance层次和devise – 避免多重inheritance

我正在开发一个3D游戏,并且需要一些关于如何最好地devise和构建我的代码的建议,以便在不使用多重inheritance等不良习惯的情况下实现目标。 基本上我不断发现自己试图用简单的接口实现多重inheritance。 例如,我有一个抽象基类Physical_Object ,我有一个派生自它的抽象类Controllable ,并且我有一个派生自Controllable, Drone 。 可控制必须实现更新方法,根据可控制的状态,可以调用AI更新方法或基于键盘/控制器状态的更新方法。 无人机有不同的部分,可以互换,具有不同的能力。 其中一些部分以及其他一些未来的游戏对象将需要能够将射线从其原点瞄准/追踪到瞄准的目标。 所以我想创建一个新的抽象类/接口,需要实现target 。 目前,我有一个抽象的Drone_Segment类,这有助于我多态地管理Drones可互换段。 这些每个都有层次结构,例如, Drone_Turret_Segment: Physical_Object–>Controllable–>Drone_Segment->Drone_Turret_Segment. 从本质上讲,考虑到当前的结构和devise,将target方法添加到所有需要它的类(无需多重inheritance)的最快和最简单的方法是在Controllable类中添加和实现target 。 但是这会有不利的一面,那就是对方法没有合理使用的对象会inheritance它。 另一个select是做一个简单的接口,只需要目标方法inheritance它的对象,但我不知道如何最好做到这一点没有多重inheritance,即: Physical_Object–>Controllable–>(Drone_Segment,Targeting_Object)->Drone_Turret_Segment. 有什么办法可以做到这一点?

Unity3D :我如何使用自定义检查器来暴露多态对象的数组进行编辑?

[编辑:基于一些反馈,我把这个例子修剪到了我们正在试图解决的bug的基本function上。 下面的描述仍然是准确的,但是repro被缩短为: 将FXTriggerTimer组件添加到对象 点击蓝色的“+”button添加一个AnimEvent和一个SFXEvent 保存场景,离开场景,回到现场 请注意,该对象具有空白FXEvent而不是AnimEvents&SFXEvents 命中脚本文件中的空间并保存以在Unity中触发脚本刷新 注意对象已经恢复了AnimEvents&SFXEvents 最后:如果有人知道如何解决这个问题,而不使用脚本或可序列化的对象,那将是首选。 太感谢了!] 前言 我试图勾画出一种方法来同步animation和sfx(以及可能后来的粒子FX,相机移动等),以便我们的艺术家在将艺术放在我们的关卡中时使用。 我想到的方法是有一个基类types为FXEvent的数组,具有types为AnimEvent和SFXEvent子类。 一般来说C#处理多态性非常好,但Unity的Inspector,唉,不。 我担心这是我的问题的根源。 四年前我解决了这个问题,所以我知道可以做到。 但是,我再也无法访问该代码。 我试图用ScriptableObject和SerilizableObject来构建一个解决scheme,而且我有一些几乎可以工作的东西。 我的问题如下: 我将我的FXTriggerTimer MonoBehavior(从FXTriggerBaseinheritance)应用到一个testing对象,然后点击蓝色的“+”button添加一个AnimEvent和一个SFXEvent到触发器。 然后我保存场景,并重新加载场景,我的testing对象有一个两个null元素的数组(显然)不在检查器中绘制。 但是 ,如果我编辑一个脚本,任何脚本(如命中空间和保存),脚本刷新将神奇地重新填充正确的项目。 所以我知道所有的东西都在引擎盖下,他们只需要在场景负载上恢复。 注意:我不是用我的ScriptableObject和SerializableObject的当前解决scheme。 这对我来说感觉有些复杂,但它使我接近真正的解决scheme。 下面的代码。 另外,如果有人想以这种方式来看待问题,那么可以在这里下载一个示例场景 。 基础多态的东西,我试图去工作: //Scripts/FXTriggerBase.cs using UnityEngine; using System.Collections; public enum FXEventType {kNone, kAnim, kSFX,} /*—————————————————————————– *///————————————————————————— [System.Serializable] public class FXEvent: UnityEngine.ScriptableObject { [SerializeField] public FXEventType type; [SerializeField] […]

许多小型多态类的灵活替代品(用作属性或消息或事件)C ++

在我的游戏中有两个类是非常有用的,但慢慢地成为一个痛苦。 消息和属性(属性本质上是一个组件)。 它们都来自一个基类,并包含一个静态ID,这样系统只能关注他们想要的。 它工作得很好…除了… 当我扩展我的游戏时,我不断地制作新的消息types和属性types。 每次我需要写2个文件(hpp和cpp)和一大堆样板以获得一个classID和一个或两个标准数据types或一个指针。 现在开始玩弄新的想法是一件很麻烦的事情。 我希望当我想创建一个新的消息或属性types,我想只能键入类似的东西 ShootableProperty: int gunType, float shotspeed; ItemCollectedMessage: int itemType; 而不是创建一个头文件和cpp文件,写一个构造函数,包括父类等等 大约20-40行(包括警卫和所有事情)只是为了做逻辑上的事情,在我脑海中是1或2行。 有没有一些编程模式来解决这个问题? 怎么样与脚本(我什么都不知道)…有没有一种方法来定义一堆几乎相同的类? 这正是一个类的样子: // Velocity.h #ifndef VELOCITY_H_ #define VELOCITY_H_ #include "Properties.h" #include <SFML/System/Vector2.hpp> namespace LaB { namespace P { class Velocity: public LaB::Property { public: static const PropertyID id; Velocity(float vx = 0.0, float vy = 0.0) […]