2013-02-26 2 views
0

Im необходимости использовать локальные переменные, но когда я их использовать для таймера (уменьшается время, пока условия не будут выполнены) он не работаетлокальные переменные Арент работать XNA при присваивании

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 (этот раздел он используется в функции обновления)

для этого фрагмента кода его штраф, но когда он мне нужен в цикле i должны использовать локальные переменные;

ответ

0

я понял это, XNA имеет TimeSpan вещь, которую вы можете использовать его легче работать, и вы можете сказать, если он достигает сброса номера и делать то, что вы хотите

1

Из того, что я могу понять, что вы делаете в коде, является то, что вы создаете новую локальную переменную со значением, установленным для скорости перезарядки лазера, при каждом обновлении, сжиганием его, когда время от последнего обновление больше, чем скорость перезарядки - это произойдет только при очень медленном обновлении.

Принимая во внимание автоматическое обновление (основной цикл) вызова XNA, то, что вам поможет, устанавливает некоторую переменную класса для Оружия, например. RemainingRecharge, и когда вы стреляете, установите его на скорость перезарядки и вычтите прошедшее время для каждого обновления, пока оно не достигнет нуля или меньше. Единственное отличие от вашего кода заключается в том, что перезарядка перемещается в экземпляр класса и, таким образом, сохраняется между обновлениями.

+0

Я думаю, что понимаю, что вы подразумеваете, поставив его как переменную класса вместо локального, что я обычно делаю, но я не могу, потому что, как вы видите в этой части Weapons [i] << это список, плохо обновите вас с полным сегментом кода его просто цикл for, поскольку весь файл ... имеет несколько сотен строк. но я должен сделать список таймеров, но я не могу это сделать, потому что у id есть одна и та же проблема, я должен назначить таймер с оружием [i] .Laser.Rate << на лазер из-за разных видов оружия. и его нужно было бы назначить в функции обновления ... так бы случилось то же самое. – QuantumArchi

+0

Я не уверен, что, похоже, проблема здесь, если быть честной. С учетом времени другой вариант, который я вижу, немного легче проверять, заключается в том, чтобы поместить поле LastFired вместо RemainingRecharge в класс, а когда вы пытаетесь запустить, проверьте, является ли LastFired + RechargeRate меньше текущего времени. Но все предложения предполагают, что вы можете редактировать классы. – Humungus

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; 
        } 
       } 
+0

Он, похоже, не работал – QuantumArchi

+0

@ user2112726 Нам понадобится больше деталей, чем «это не сработает». Являются ли оружейные и лазерные структуры или классы? –

+0

Оружие [] <- список, содержащий список классов, которые называются элементами, которые сами по себе содержат классы каждого типа элементов ...тот, который мы касаемся, называется LaserItem в этом классе, соответствующий код float RechargeRate; public float Оценка { get {return RechargeRate; } set {RechargeRate = значение; } } – QuantumArchi