我需要使用局部变量但是当我将它们用于计时器时(减少时间直到满足条件)它不起作用
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(此部分在更新功能中)
这段代码很好但是当我在循环中需要它时我必须使用局部变量;
答案 0 :(得分:1)
根据我的理解,您在代码中所做的是创建一个新的局部变量,其值设置为每次更新时激光的充电率,并在上次更新时启动它比充值率更长 - 这只会在非常缓慢的更新时发生。
考虑到XNA的自动更新(主循环)调用,可以帮助你为武器设置一些类变量,例如: RemainingRecharge
当你开火时,将其设置为充值率并减去每次更新所经过的时间,直到达到零或更低。与您的代码唯一的区别是,充值被移动到类实例,因此在更新之间保留。
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
我想通了,XNA有一个TimeSpan的东西,你可以使用它更容易使用,你可以告诉它,如果它达到数字重置并做你想要的