首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在我的游戏C# Monogame中实现“轰炸机爆炸”是有问题的

在我的游戏C# Monogame中实现“轰炸机爆炸”是有问题的
EN

Stack Overflow用户
提问于 2021-02-09 08:54:24
回答 1查看 192关注 0票数 0

我想在我的轰炸机里制造炸弹爆炸。我在游戏中实现了所有必要的类,如Player,Tilemap,Bomb,Grass,Stone等。然而,在爆炸发生后,我很难阻止/停止爆炸。我的意思是,爆炸(有时)甚至在它撞到一个可碰撞的瓷砖(石头,箱子等)之后仍在继续。

我做了什么?

正如我前面所说的,我还没有做过递归爆炸。相反,我采取了另一种方法。

我上了两门课,一节火课和一节爆炸课。Fire类是one专用瓷砖上的爆炸。因此,如果我在Tilemap网格中将一个Fire对象设置为(1,1)。它只会在那个特定的瓷砖里爆炸。fire类在它的Update()函数中检查冲突。如果发现冲突,则将HasHitWall设置为true。

爆炸课很简单,但它是我无法正常学习的课程。爆炸类包含Fire实例的列表。在构造函数中设置了这些Fire实例:

代码语言:javascript
运行
复制
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对象。

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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会阻碍朝着这个方向创建更多的火焰。

下面是执行以下操作的类的代码:

代码语言:javascript
运行
复制
    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方法的代码:

代码语言:javascript
运行
复制
    private bool IsFireColliding(Fire fire) {
   
    foreach (ICollidable c in InGameScreen.collidables) {

        if (fire.hitboxRectangle.Intersects(c.hitboxRectangle))
        {
            return true;
        }
      
            
    }
 
    return false;
}

为了使这个工作在各个方向进行,我必须执行AddFire()方法四次(四个不同方向)。我还想提到的是,我使用长度为4的bool数组来跟踪碰撞的方向。

代码语言:javascript
运行
复制
    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++;
    }


}

我希望这能帮助和我同舟共济的人!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66115702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档