分配时,局部变量不工作Xna

时间:2013-02-26 19:58:01

标签: variables timer xna local

我需要使用局部变量但是当我将它们用于计时器时(减少时间直到满足条件)它不起作用

   for (int i = 0; i < Weapons.Count; i++)
        {
            if (Weapons[i].ItemType == 6)
            {
                if (standard.IsKeyDown(Keys.G))
                {
                    Cannons.Add(new CannonFire(this));
                }
            }
            else if (Weapons[i].ItemType == 7)
            {
                float Recharge  = Weapons[i].Laser.Rate;
                Recharge -= (float)gametime.ElapsedGameTime.Seconds;
                if (standard.IsKeyDown(Keys.G) && Recharge < 0)
                {
                    laser.Add(new LaserFire(this, new Vector3(Weapons[i].Laser.range, 1, 1) ));
                    Recharge = Weapons[i].Laser.Rate;
                }
            }
        }

其他相关代码是我从

获取费率的地方
   public class LaserItem
{
    float Damage;
    float Range;
    float Last;
    float RechargeRate;
    public float damage
    {
        get { return Damage; }
        set { Damage = value; }
    }
    public float Rate
    {
        get { return RechargeRate; }
        set { RechargeRate = value; }
    }
    public float Life
    {
        get { return Last; }
        set { Last = value; }
    }

它可以在没有计时器的情况下工作,但我不能那样,因为我不希望每次有人敲击键时都会建立300个激光器。据我所知,定时器每帧都设置为激光速率,因此它永远不会达到0(此部分在更新功能中)

这段代码很好但是当我在循环中需要它时我必须使用局部变量;

3 个答案:

答案 0 :(得分:1)

根据我的理解,您在代码中所做的是创建一个新的局部变量,其值设置为每次更新时激光的充电率,并在上次更新时启动它比充值率更长 - 这只会在非常缓慢的更新时发生。

考虑到XNA的自动更新(主循环)调用,可以帮助你为武器设置一些类变量,例如: RemainingRecharge当你开火时,将其设置为充值率并减去每次更新所经过的时间,直到达到零或更低。与您的代码唯一的区别是,充值被移动到类实例,因此在更新之间保留。

答案 1 :(得分:0)

Recharge不是引用或指针;它是一个副本(floatdouble是不可变类型)。因此,在Recharge块的末尾为if()分配值绝对没有任何意义。 (我敢打赌它甚至会被编译器删除)。

试试这个:

       else if (Weapons[i].ItemType == 7)
                {
                    float recharge  = Weapons[i].Laser.Rate;
                    recharge -= (float)gametime.ElapsedGameTime.Seconds;

                    if (standard.IsKeyDown(Keys.G) && recharge < 0)
                    {
                        laser.Add(new LaserFire(this, new Vector3(Weapons[i].Laser.range, 1,1)));

                        /// changed the the next line:                        
                        Weapons[i].Laster.Rate = recharge;
                    }
                }

答案 2 :(得分:0)

我想通了,XNA有一个TimeSpan的东西,你可以使用它更容易使用,你可以告诉它,如果它达到数字重置并做你想要的