2

私はファーミング/タワーディフェンスゲームを作成中ですが、プログラミングは初めてです。XNA で Lists<> または配列を使用する際に大きな問題があるようです。リストから必要なインデックスを返すことができません。

主な問題は、植栽エンジンの内部です。さまざまなプロパティを持つ植物 (スプライト オブジェクト) のリストを生成し、マップ上に配置できる植栽システムの実装に成功しました。ここで、植物をマウスでクリックすることに基づいて、植物リスト内の特定の植物にアクセスする方法が必要です。私は非常に近いように感じますが、解決できない ArgumentOutOfRangeException になってしまいました。コードのウォークスルーは次のとおりです。

初期化

 public void Addplants()
        {
            switch (Mode)
            {
            case "Wotalemon":
            NewPlant = new Plant(Texture, msRect);
            NewPlant.AddAnimation("seed", 0, 16, 64, 64, 1, 0.1f);
            NewPlant.AddAnimation("sprout", 64, 16, 64, 64, 1, 0.1f);
            NewPlant.AddAnimation("wota", 128, 16, 64, 64, 1, 1.0f);
            NewPlant.CurrentAnimation = "seed";
            NewPlant.DrawOffset = new Vector2(32, 48);
            NewPlant.Position = Position;
            NewPlant.Type = "wotalemon";
            NewPlant.Birthday = Days;
            NewPlant.IsSelected = false;
            plants.Add(NewPlant);
            thisPlant = NewPlant;
            //various plants after this

更新/描画

簡単な foreach ループを使用して、植物を更新および描画しますが、ここでは問題ありません。

GetInfo (このメソッドは、スプライト オブジェクトの hitbox プロパティと mouseRectangle を使用します)

public void GetInfo(Rectangle ms)
        {
            msRect = ms;
            for (int i = 0; i < plants.Count; i++)
            {
                foreach (Plant NewPlant in plants)
                {
                    if (NewPlant.BoundingBox.Intersects(msRect))
                    {
                        SelectedIndex = i;
                        NewPlant.Tint = Color.Black;
                    }
                    else
                        NewPlant.Tint = Color.White;
                }

            }
        }

最後に、ここに問題があります:

 public void SelectPlant()
        {
            //if (SelectedIndex != null)
            if (SelectedIndex > plants.Count | SelectedIndex < 0)
                SelectedIndex = plants.Count;
            SelectedPlant = plants[SelectedIndex];

        }

次の行で例外がスローされます。

SelectedPlant = plants[SelectedIndex];

デバッガーは値を 0 と表示します。インデックスが null にならないように、さまざまな方法を試しました。ここでは、Getinfo() メソッドの何かが重要なように感じます。そこに挿入したカラーテストが完全に機能するため、成功に非常に近いと確信しています. 植物にマウスオーバーすると黒くなり、マウスを離すと元に戻ります。

これはまさに私が望んでいる動作のタイプです。ただし、selectedIndex を、マウスオーバーしている植物のインデックスに設定する必要があります。アドバイスをいただければ幸いです。

4

2 に答える 2

6

最初に、これを適切な or||にしてチェックします。>= plants.Countリストは で索引付けされていることを思い出してください0。次に、提案されているように、count - 1 に設定します。

if (SelectedIndex >= plants.Count || SelectedIndex < 0)
    SelectedIndex = plants.Count - 1
于 2012-04-14T03:13:38.657 に答える