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

他の関連するコードは、imがレートを取得する場所です

   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の自動更新(メインループ1)呼び出しを考慮に入れると、武器のクラス変数を設定するのに役立ちます。たとえばRemainingRecharge、発砲するときは、再充電率に設定し、更新ごとに経過時間を差し引きます。ゼロ以下に達します。コードとの唯一の違いは、リチャージがクラスインスタンスに移動されるため、更新間で保持されることです。

于 2013-02-26T20:12:52.943 に答える
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 に答える
0

私はそれを理解しました、XNAにはTimeSpanがあり、操作が簡単で、番号がリセットされたかどうかを判断して、必要なことを実行できます

于 2013-03-01T10:36:27.597 に答える