如何删除列表中的特定非唯一对象而不知道其索引

时间:2015-09-21 17:20:01

标签: c# list oop monogame

我正在使用MonoGame做一个小游戏作为练习。你是一艘船,用子弹射击小行星。

我有一个物体,我可以射击,然后它会爆炸成一堆子弹,除了移除原始炸弹对象外,它都有效。

我在List中处理我的对象,其中实体是列表中所有对象(例如船,小行星,子弹等)继承的对象,我这样做,所以我可以将它们放在1个列表中并放入干净清单上的索引,当它们发生冲突时,循环遍历该索引,并使用清单中的索引从原始列表中删除这些项目。

TL; DR 问题是,我不知道如何使用只有它的索引的列表来跟踪特定的炸弹对象,因为不同的对象被一直移除和添加。

如果我尝试在Bomb对象中使用某种计时器,我无法从对象本身删除它,我甚至尝试调用外部方法F​​inalize将对象设置为NULL,但这也不起作用。 我使用了这行代码:

game.objectController.Finalize(this);

和这个方法:

public void Finalize(Entity obj)
{
    obj = null;
}

一个困难的解决方案是制作一种跟踪实体列表中所有索引的方法,即使它们“移动”但这不是处理它的正确方法吗?

我能想到的另一个解决方案是从炸弹对象中执行一些会返回它的列表条目,但我不知道如何做到这一点。

提前感谢您的帮助。

编辑:这是我作为界面尝试的代码

interface IDestructible
{
public bool Isdestroyed();
}

这是我在可破坏对象中使用的实现方法,我希望在一定时间限制后销毁:

public bool IDestructible.Isdestroyed(){
    if (timer == 25)
    {
        Explode();
        return true;
    } return false;
}`

2 个答案:

答案 0 :(得分:1)

原始子弹对象在某种程度上是特殊的,因此您可以使其实现特定接口或者是派生类。例如,您可以创建这样的界面:

public interface IDestroyable
{
}

然后,您可以遍历列表并在运行时检查哪个元素实现了与is运算符的接口。并删除它。

public class SourceBullet : Entity, IDestroyable
{
    // whatever
}

现在:

foreach (var item in myList)
{
    if (item is IDestroyable) 
    {
        myList.Remove(item);
    }
}

这样您就不需要一直跟踪对象。通过继承Entity,原始子弹仍然可以作为列表的一部分,但您可以将其与其他子弹区分开来。

答案 1 :(得分:0)

当我处于类似情况时,不使用游戏引擎,我最终做的是让每个对象跟踪它自己的状态,然后循环遍历所有对象以清理它们在主游戏循环结束时。

class gameobject
{
    public bool isDestroyed {get;set;}
}
class bomb : gameobject
{
}

main loop update:

for(i = gameobjectcollection.Length; i--; i > -1 )
{
   if(gameobjectcollection[i].isDestroyed ) gameobjectcollection[i] = null;//or whatever to remove by index
}