如何在不知道其索引的情况下删除列表中的特定非唯一对象
How to delete specific non-unique object in list without knowing its index
我正在使用 MonoGame 制作一个小游戏作为练习。你是一艘船,用子弹射击小行星。
我有一个可以射击的物体,然后它爆炸成一堆子弹,除了移除原来的炸弹物体外,一切正常。
我在一个列表中处理我的对象,其中实体是列表中所有对象(如船、小行星、子弹等)继承自的对象,我这样做是为了将它们放在 1 个列表中,然后当索引发生冲突时将它们放在清洁列表中,循环遍历并从原始列表中删除带有清洁列表中索引的项目。
长话短说;博士
问题是,我不知道如何使用仅包含其索引的列表来跟踪特定的炸弹对象,因为一直在删除和添加不同的对象。
如果我尝试在 Bomb 对象中使用某种计时器,我无法将其从对象本身中删除,我什至尝试调用外部方法 Finalize 将对象设置为 NULL,但这也不起作用.
我使用了这行代码:
game.objectController.Finalize(this);
和这个方法:
public void Finalize(Entity obj)
{
obj = null;
}
一个困难的解决方案是制作某种方法来跟踪实体列表中的所有索引,即使它们 'move around' 但这不是处理它的正确方法是吗?
我能想到的另一个解决方案是从炸弹对象执行某些操作,这将 return 它是列表条目,但我不知道如何做到这一点。
在此先感谢您的帮助。
编辑:这是我尝试作为接口使用的代码
interface IDestructible
{
public bool Isdestroyed();
}
这是我在我想要在特定时间限制后销毁的可破坏对象中使用的实现方法:
public bool IDestructible.Isdestroyed(){
if (timer == 25)
{
Explode();
return true;
} return false;
}`
原始项目符号对象在某种程度上是特殊的,因此您可以使其实现特定接口或派生class。例如,您可以创建这样一个界面:
public interface IDestroyable
{
}
然后您可以遍历列表并在运行时检查哪个元素使用 is
运算符实现接口。并将其删除。
public class SourceBullet : Entity, IDestroyable
{
// whatever
}
现在:
foreach (var item in myList)
{
if (item is IDestroyable)
{
myList.Remove(item);
}
}
这样您就不需要一直跟踪对象。通过继承Entity
,原来的项目符号仍然是列表的一部分,但你可以将它与其他项目符号区分开来。
当我处于类似情况时,没有使用游戏引擎,我最终做的是让每个对象跟踪它自己的状态,然后循环 运行 遍历所有要清理的对象他们在主游戏循环结束时。
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
}
我正在使用 MonoGame 制作一个小游戏作为练习。你是一艘船,用子弹射击小行星。
我有一个可以射击的物体,然后它爆炸成一堆子弹,除了移除原来的炸弹物体外,一切正常。
我在一个列表中处理我的对象,其中实体是列表中所有对象(如船、小行星、子弹等)继承自的对象,我这样做是为了将它们放在 1 个列表中,然后当索引发生冲突时将它们放在清洁列表中,循环遍历并从原始列表中删除带有清洁列表中索引的项目。
长话短说;博士 问题是,我不知道如何使用仅包含其索引的列表来跟踪特定的炸弹对象,因为一直在删除和添加不同的对象。
如果我尝试在 Bomb 对象中使用某种计时器,我无法将其从对象本身中删除,我什至尝试调用外部方法 Finalize 将对象设置为 NULL,但这也不起作用. 我使用了这行代码:
game.objectController.Finalize(this);
和这个方法:
public void Finalize(Entity obj)
{
obj = null;
}
一个困难的解决方案是制作某种方法来跟踪实体列表中的所有索引,即使它们 'move around' 但这不是处理它的正确方法是吗?
我能想到的另一个解决方案是从炸弹对象执行某些操作,这将 return 它是列表条目,但我不知道如何做到这一点。
在此先感谢您的帮助。
编辑:这是我尝试作为接口使用的代码
interface IDestructible
{
public bool Isdestroyed();
}
这是我在我想要在特定时间限制后销毁的可破坏对象中使用的实现方法:
public bool IDestructible.Isdestroyed(){
if (timer == 25)
{
Explode();
return true;
} return false;
}`
原始项目符号对象在某种程度上是特殊的,因此您可以使其实现特定接口或派生class。例如,您可以创建这样一个界面:
public interface IDestroyable
{
}
然后您可以遍历列表并在运行时检查哪个元素使用 is
运算符实现接口。并将其删除。
public class SourceBullet : Entity, IDestroyable
{
// whatever
}
现在:
foreach (var item in myList)
{
if (item is IDestroyable)
{
myList.Remove(item);
}
}
这样您就不需要一直跟踪对象。通过继承Entity
,原来的项目符号仍然是列表的一部分,但你可以将它与其他项目符号区分开来。
当我处于类似情况时,没有使用游戏引擎,我最终做的是让每个对象跟踪它自己的状态,然后循环 运行 遍历所有要清理的对象他们在主游戏循环结束时。
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
}