【问题标题】:C# - How do I see what subclass a certain instance is when looking through a list of base instances?C# - 在查看基本实例列表时,如何查看某个实例的子类?
【发布时间】:2017-06-22 11:21:51
【问题描述】:

我正在使用 XNA 作为学校项目开发游戏。我正在尝试在我的“实体”基类中创建一个代码,以检查我当前正在与哪个特定的“实体”子类发生冲突。

这是我到目前为止一直在尝试使用的:

在“实体”中

 protected Entity CheckCollisionWithEntity(Vector2 pos)
    {
        Rectangle r = new Rectangle((int)pos.X, (int)pos.Y, _texture.Width, _texture.Height - 1);

        foreach (Entity e in _entities)
        {
            if (r.Intersects(e.Collider))
            {
                if(e != this)
                return e;
            }

        }

        return null;
    }

在“玩家”中(与“敌人”类似,是“实体”的子类)

  if (CheckCollisionWithEntity(Position) is Enemy)
        {
            Game1.instance.reloadLevel();
        }

我的问题是,当我与“敌人”实例发生碰撞时 - 什么也没有发生。 我知道“reloadLevel()”方法有效,并且我尝试将其切换为调试代码。 我在这里做错了什么?我是否误解了“是”参考? 敌人 Collider 正在为其他不太具体的碰撞检查类型工作。

【问题讨论】:

  • CheckCollisionWithEntity 将退出,返回找到的第一个实体。如果玩家与两个或更多实体发生碰撞,而其中只有一个是敌人怎么办?
  • 返回一个 IEnumerable 并使用 LINQ 的强大功能与 CheckCollisionsWithEntities( .. ).OfType()
  • @SirRufo 我不熟悉这个函数,你能指定我将如何在我的代码中使用它吗?提前致谢!

标签: c# list xna base-class


【解决方案1】:

这就是is的用法,所以返回的对象不能是Enemy对象。

您说您交换了调试代码 - 您是否验证该方法确实返回了一个从 Enemy 派生或派生的对象?逐步检查您的代码并检查返回的内容 - 也许您的碰撞检测代码不起作用并且您总是返回 nullnull is someClass 将始终评估为 false)。您的方法仅返回它确定为冲突的第一个 Entity - 是否可以在任何 Enemy 实体之前检测到非 Enemy 实体?

【讨论】:

  • 原来我的代码正常工作,我实际上只是忘记更新 Enemy 对象碰撞器(我有 2 个单独的碰撞器用于物理和其他游戏逻辑)。
猜你喜欢
  • 2014-02-28
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 2013-04-09
相关资源
最近更新 更多