Похоже, вы могли бы избавиться от (на самом деле скрыть) петлю в целом с помощью некоторой LINQ:
private void SetTinderInPit()
{
MouseState currentMouseState = Mouse.GetState();
if (player.NextToFirePit)
{
Item tinder = player.PlayerInventory.Items.FirstOrDefault(i => i.ItemName == "tinder");
if (tinder != null)
{
Item firepit = allItemsOnGround.FirstOrDefault(i => i.ItemName == "firepit" && i.ItemRectangle.Contains(MouseWorldPosition));
if (firepit != null &&
currentMouseState.LeftButton == ButtonState.Pressed &&
oldMouseState.LeftButton == ButtonState.Released)
{
tinder.ItemName = "empty";
firepit.ItemName = "firepitwithtinder";
firepit.Texture = Content.Load<Texture2D>("firepitwithtinder");
}
}
oldMouseState = currentMouseState;
}
}
Это имеет дополнительное преимущество, замыкая цикл, когда элемент найден. Это также позволяет легко проверять вещи, отличные от имени (например, свойство IsFlammable или CanContainFire), поэтому вы можете использовать несколько элементов вместо «tinder» и «firepit».
Если вы на самом деле предназначен для удаления всех костровых чаш и трут, использование:
private void SetTinderInPit()
{
MouseState currentMouseState = Mouse.GetState();
if (player.NextToFirePit)
{
foreach (Item tinder in player.PlayerInventory.Items.Where(i => i.ItemName == "tinder")
{
foreach (Item firepit in allItemsOnGround.Where(i => i.ItemName == "firepit"))
{
if (firepit.ItemRectangle.Contains(MouseWorldPosition) &&
currentMouseState.LeftButton == ButtonState.Pressed &&
oldMouseState.LeftButton == ButtonState.Released)
{
tinder.ItemName = "empty";
firepit.ItemName = "firepitwithtinder";
firepit.Texture = Content.Load<Texture2D>("firepitwithtinder");
}
}
}
oldMouseState = currentMouseState;
}
}
Быстрый нюанс; этот код удалит все ружья с первый tinder, оставив другие tinders невредимым. Я мог бы разгадать петли, чтобы удалить все, но эта функция соответствует предоставленной; и, кроме того, я предполагаю, что это не предполагаемое поведение.
Заметьте, что вам не нужно ToList
, потому что вы не изменяете сбор во время перечисления. Вы всегда можете изменить пункты в коллекции, доказанное со следующим испытанием:
class IntWrapper
{
public int value;
public IntWrapper(int value)
{
this.value = value;
}
}
class Program
{
static void Main(string[] args)
{
List<IntWrapper> test = new List<IntWrapper>() { new IntWrapper(1), new IntWrapper(2), new IntWrapper(3), new IntWrapper(4), new IntWrapper(5) };
foreach (IntWrapper i in test.Where(i => i.value == 1))
{
i.value = 0;
}
foreach (IntWrapper i in test)
{
Console.WriteLine(i.value);
}
Console.ReadLine();
}
}
Это связано с XNA? – PaulG
Один из самых больших домашних животных - это когда люди сравнивают переменные 'bool' с' true' или 'false'. Пожалуйста, просто сделайте 'if (player.NextToFirePit)' нет необходимости в '== true'. – juharr
@juharr Правильно Я согласен, но он синтаксически правильный, и некоторые люди предпочитают его. – PaulG