非绘制的Sprite仍然有效xna

时间:2015-08-23 21:11:15

标签: c# collision-detection draw

我正在制作2D太空射击游戏,我遇到了盾牌加电的问题。盾牌使玩家在敌方舰船上碰撞一段时间后立于不败之地。当玩家与通电器发生碰撞时,玩家在一段时间内无敌,此时玩家离开上电位置并且从屏幕移除加电,这一切都正常。然而,我遇到的问题是,即使玩家在绘制方法中从屏幕上移除,玩家仍然可以与它发生碰撞,这意味着玩家可以简单地留在那个位置并永远立于不败之地。因此,一旦玩家与盾牌相撞,我希望它能让玩家再次与它发生碰撞。我尝试过在线搜索,但我还没找到任何特别有用的东西。 我也想再次使用这个电源。在未来,我计划随机添加它们'在我的滚动背景中。不确定这是否会添加任何内容,只是认为我会包含它。

game1.cs

    public double counterPower = 0;

    public bool powerUpCollision = false;
    public bool invincibility = false;
    Sprite shieldPower;
    bool isVisible = true; 

    protected override void Initialize()
    {
      shieldPower = new Sprite();
    }

    protected override void LoadContent()
    {
        if (isVisible == true)
        {
            shieldPower.LoadContent(this.Content, "powerUpShield");
            shieldPower.Position.X = 300;
            shieldPower.Position.Y = 300;
        }
    }

    protected override void Update(GameTime theGameTime)
    {
        powerUps(theGameTime);
    }

     public void powerUps (GameTime theGameTime)
    {
        if (mPlayer.boundingBox.Intersects(shieldPower.boundingBoxShieldPower)) 
        {
            if (shieldPower.isVisible == true)
            {
                Console.WriteLine("collision working");
                powerUpCollision = true; 
                invincibility = true;
                isVisible = false;
                if (powerUpCollision == true && invincibility == true) 
                {
                    lives = lives - 0; 
                }

                counterPower = 0;
            }
        }
        counterPower += theGameTime.ElapsedGameTime.TotalSeconds;
        {
            Console.WriteLine(counterPower);
            if (counterPower > 7) 
            {
                powerUpCollision = false;
                invincibility = false; 

            }
        }


       protected override void Draw(GameTime theGameTime)
       {
           spriteBatch.Begin();

           if (isVisible == true)
             {
                shieldPower.Draw(this.spriteBatch);
             }
       }
       spriteBatch.End();

在sprite类中是加电的边界框,这很好用。 我有更多的代码和课程,但我相当确定很多与此问题无关,我也不想浪费你的时间。

非常感谢任何帮助。 谢谢。

1 个答案:

答案 0 :(得分:0)

我首先建议将边界框设置为null或某处不可能与之碰撞。这听起来像是玩家船与物体碰撞,因为即使它没有显示,它的所有属性仍然存在于系统中。所以,让它不可见并将其隐藏在屏幕外是一种选择,尽管如果你在应该调用它时用其他代码设置位置就可以了。

第二件事,如果游戏中存在加电,则设置一个标志。基本上筑巢你的所有"当船撞到它时这样做"在if语句中,以便它只在您希望它时应用,并且在条件未满足时将跳过该代码。如果边界框不会影响其他任何东西,你实际上可以这样做,而不是第一部分。

编辑:澄清一下,如下:

if(ship.hitsPowerup)
{
   if(powerup.isActive)
   {
       doTheThing;
       powerup.isActive = false;
   }
}