0

在这里继续我的游戏(玩家是一艘船并且你击落流星的游戏)。我目前正在船上射击子弹,我正试图在流星被子弹击中时移除它们。这就是我所做的。我快到了,但我在编码中发现了一个错误。在我的游戏中,在地图右侧之外会产生流星,它们会向左移动,关键是要将它们击落,如果你以正确的顺序射击流星,这是可行的,否则就不行。让我用一张图片来解释一下。 例子

如果我要击落第二颗流星,标有数字 1 的流星会先被摧毁

//spawns the enemies.
public void LoadEnemies()
    {
        int randY = random.Next(100, 500);
        if (spawn > 1)
        {
            spawn = 0;
            if (enemies.Count() < 4)
                enemies.Add(new Enemies(Content.Load<Texture2D>("meteor"), new Vector2(1110, randY)));
        }
        //Here's where the error lies because of the bulletcolliding (I think)
        for (int i = 0; i < enemies.Count; i++)
        {
            if (!enemies[i].isVisible || bulletColliding)
            {
                bulletColliding = false;
                enemies.RemoveAt(i);
                i--;
            }
        }
    }

碰撞法。

        public void bulletCollision(GameTime gameTime)
    {
        foreach (var x in bullets)
        {
            foreach (var y in enemies)
            {
                enemy_rect = new Rectangle((int)y.position.X, (int)y.position.Y, 10, 10);
                bullet_rect = new Rectangle((int)x.position.X, (int)x.position.Y, 10, 10);
                if (bullet_rect.Intersects(enemy_rect))
                {
                    bulletColliding = true;
                }
            }
        }
    }

基本上,我对如何移除被击中的特定流星一无所知,我需要你的帮助。我感谢我得到的所有帮助。

4

2 回答 2

5

不要只使用bool bulletColliding. 也使用整数来显示应该被摧毁的敌人的数量,并在每个敌人类别中保留他的数量信息。

第二个选项可以保留一个bool ifDestroy初始为假的敌人类,如果敌人应该被摧毁,则将其更改为真。你可以检查它loadEnemies()

于 2012-11-03T18:16:00.063 回答
2

基本上这是对 Sabrina Le 答案的进一步解释。

您希望敌人对象本身有一个 bool 调用bulletColliding,并且在您的碰撞代码中它看起来更像......

public void bulletCollision(GameTime gameTime)
{
    foreach (var x in bullets)
    {
        foreach (var y in enemies)
        {
            enemy_rect = new Rectangle((int)y.position.X, (int)y.position.Y, 10, 10);
            bullet_rect = new Rectangle((int)x.position.X, (int)x.position.Y, 10, 10);
            if (bullet_rect.Intersects(enemy_rect))
            {
                y.bulletColliding = true;
            }
        }
    }
}

然后你的敌人加载代码看起来更像......

//spawns the enemies.
public void LoadEnemies()
{
    int randY = random.Next(100, 500);
    if (spawn > 1)
    {
        spawn = 0;
        if (enemies.Count() < 4)
            enemies.Add(new Enemies(Content.Load<Texture2D>("meteor"), new Vector2(1110, randY)));
    }
    //Here's where the error lies because of the bulletcolliding (I think)
    for (int i = 0; i < enemies.Count; i++)
    {
        if (!enemies[i].isVisible || enemies[i].bulletColliding)
        {
            enemies[i].bulletColliding = false;
            enemies.RemoveAt(i);
            i--;
        }
    }
}

通过严格地拥有一个bulletColliding变量,发生的事情是当任何流星被击中时,它被设置为 true。因此,当您的方法按顺序检查流星时,即使它检查第一个对象,它也会看到 bulletColliding 设置为 true,并且 if 中的代码运行。使用特定于敌人的布尔值会让你知道哪个敌人被击中,并相应地被移除。

于 2012-11-03T18:42:13.893 回答