0

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

   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(本节在更新功能中)

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

4

3 回答 3

1

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

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

于 2013-02-26T20:12:52.943 回答
0

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

于 2013-03-01T10:36:27.597 回答
0

Recharge不是引用或指针;它是一个副本(因为float并且double是不可变类型)。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;
                    }
                }
于 2013-02-26T20:17:09.880 回答