我正在制作农业/塔防游戏,并且在编程方面还很新。我似乎在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(此方法使用spriteobject的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设置为我要悬停的植物的索引。任何建议将不胜感激。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我将其添加为新答案,因为这将解决一个完全不同的问题。看一下这段代码:msRect = ms;for (int i = 0; i < plants.Count; i++){ foreach (Plant NewPlant in plants) // <-- this is redundant { if (NewPlant.BoundingBox.Intersects(msRect)) { SelectedIndex = i; NewPlant.Tint = Color.Black; } else NewPlant.Tint = Color.White; }}您在彼此内部两次遍历“植物”!一次使用索引(for (int i = 0 ...),然后在内部再次使用迭代器(foreach (Plant NewPlant ...)。您可以选择使用单个循环更改GetInfo以设置正确的索引:msRect = ms;for (int i = 0; i < plants.Count; i++){ Plant NewPlant = plants[i]; if (NewPlant.BoundingBox.Intersects(msRect)) { SelectedIndex = i; NewPlant.Tint = Color.Black; } else NewPlant.Tint = Color.White;}或者做同样的事情,并首先短路对SelectPlant()和SelectedIndex的需求:msRect = ms;foreach (Plant NewPlant in plants) // no need for indexes{ if (NewPlant.BoundingBox.Intersects(msRect)) { SelectedPlant = NewPlant; // this is everything you need NewPlant.Tint = Color.Black; } else NewPlant.Tint = Color.White;}但是,您确实需要小心使用SelectedPlant这样的“全局”变量来捕获此逻辑。最好更改整个GetInfo方法以返回选定的工厂,而不是直接修改SelectedPlant。也就是说,更改方法签名以返回Plant而不是void,并将上面代码中的SelectPlant = NewPlant更改为return NewPlant。或者单行更有趣:return plants.Where(p => p.BoundingBox.Intersects(ms)) (adsbygoogle = window.adsbygoogle || []).push({}); 10-07 21:53