我想在我的轰炸机里制造炸弹爆炸。我在游戏中实现了所有必要的类,如Player,Tilemap,Bomb,Grass,Stone等。然而,在爆炸发生后,我很难阻止/停止爆炸。我的意思是,爆炸(有时)甚至在它撞到一个可碰撞的瓷砖(石头,箱子等)之后仍在继续。
我做了什么?
正如我前面所说的,我还没有做过递归爆炸。相反,我采取了另一种方法。
我上了两门课,一节火课和一节爆炸课。Fire类是one专用瓷砖上的爆炸。因此,如果我在Tilemap网格中将一个Fire对象设置为(1,1)。它只会在那个特定的瓷砖里爆炸。fire类在它的Update()函数中检查冲突。如果发现冲突,则将HasHitWall设置为true。
爆炸课很简单,但它是我无法正常学习的课程。爆炸类包含Fire实例的列表。在构造函数中设置了这些Fire实例:
fires = new List<Fire>();
int counter = 1;
for (int x = 0; x < length * 4; x+=4) {
fires.Add(new Fire(position + new Vector2(-Tile.tileSize.X * counter * InGameScreen.scale,0))); //Left;
fires.Add(new Fire(position + new Vector2(Tile.tileSize.X * counter * InGameScreen.scale, 0))); //Right;
fires.Add(new Fire(position + new Vector2(0, -Tile.tileSize.Y * counter * InGameScreen.scale))); //Up;
fires.Add(new Fire(position + new Vector2(0,Tile.tileSize.Y * counter * InGameScreen.scale))); //Down;
counter++;
}在for循环中,有四种不同的火灾,它们都向不同的方向发展。我已评论过他们往哪个方向走。
构造函数中初始化的第一个Fire对象是向左方向的火。这个Fire对象具有索引0,因为它被放在列表的第一位。当添加下一个左侧的Fire对象标题时,它将有索引4,后面的一个将有索引8,依此类推。
我看到了这样一种模式,即在一个方向上,每一次火灾都有4的指数差异。为了澄清,第一个向左的火有索引0,下一个向左的火对象将有索引4等等。
我在更新()函数中引入了这个概念,在此函数中,在与Tile碰撞之后,我尝试从一个方向删除所有的Fire对象。
for (int x = 0; x < fires.Count; x++) {
fires[x].Update(gameTime);
if (fires[x].HasHitWall == true) {
for (int i = x; i < fires.Count; i += 4) {
fires.RemoveAt(i);
}
}
}然而,这是无效的,它移除火的所有地方。我需要帮助弄清楚如何解决这个问题。,在特定的火灾与瓷砖相撞后,我如何从一个方向消除所有的火灾?
这可能是一个模糊和难以理解的问题,然而,我不知道如何用另一种方式解释它。
它正在发生的图像:

,问题是什么?
我想问题可能是我需要一份清单。但是,我尝试过使用数组,但它也不起作用。索引必须在它们所在的位置。如果索引4被删除,那么索引5 就不能允许变成索引4,它必须保持为索引5。
发布于 2021-02-09 17:00:17
我想说,我解决了这个问题,这要感谢@PallarDue & @NicoSchertler。
我不得不重新组织我的代码,并玩了一会儿,但我终于使它发挥作用。我会试着总结一下。
这个想法很简单,我有一个if语句来检查它所属的火灾方向是否曾经发生过碰撞。让我们说,我的fires数组中的索引4与一个板条箱相撞。那么,我不希望在这个特定的方向上产生更多的火灾。
之后,我制作了一个Fire对象,并检查该Fire对象的hitbox是否与使用IsFireColliding( fire )的任何对撞机碰撞。此方法循环遍历所有可碰撞性,并根据是否检测到任何碰撞返回true或false。
如果IsFireColliding返回false,则将火添加到火列表中。
如果返回true,则将对象添加到列表中,并将方向bool (directionContinuex)设置为false。将bool设置为false会阻碍朝着这个方向创建更多的火焰。
下面是执行以下操作的类的代码:
private void AddFire(Vector2 offset, int directionContinueIndex) {
if (directionContinue[directionContinueIndex])
{
Fire fire = new Fire(position + offset);
if (!IsFireColliding(fire))
{
fires.Add(fire);
}
else if (IsFireColliding(fire) && directionContinue[directionContinueIndex] == true)
{
fires.Add(fire);
directionContinue[directionContinueIndex] = false;
}
}
}下面是循环遍历和检查排序规则的IsFireColliding方法的代码:
private bool IsFireColliding(Fire fire) {
foreach (ICollidable c in InGameScreen.collidables) {
if (fire.hitboxRectangle.Intersects(c.hitboxRectangle))
{
return true;
}
}
return false;
}为了使这个工作在各个方向进行,我必须执行AddFire()方法四次(四个不同方向)。我还想提到的是,我使用长度为4的bool数组来跟踪碰撞的方向。
public Explosion(Vector2 position, int length) : base(position) {
fires = new List<Fire>();
//Test code
for (int x = 0; x < length * 4; x+=4) { //Check if you need to create a fire
AddFire(new Vector2(-Tile.tileSize.X * counter * InGameScreen.scale, 0), 0);
AddFire(new Vector2(Tile.tileSize.X * counter * InGameScreen.scale, 0), 1);
AddFire(new Vector2(0, -Tile.tileSize.Y * counter * InGameScreen.scale), 2);
AddFire(new Vector2(0, Tile.tileSize.Y * counter * InGameScreen.scale), 3);
counter++;
}
}我希望这能帮助和我同舟共济的人!
https://stackoverflow.com/questions/66115702
复制相似问题