Как обращаться с предметами в инвентаре

Я создаю свой первый инвентарь и хочу, чтобы он работал как любой другой базовый инвентарь, а именно:

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

Я сделал некоторые из основных вещей, таких как:

  • Отрисовка слотов инвентаря и при наведении на них курсора они меняют текстуру.
  • Перемещайте предмет/объект с помощью мыши.

и это все.

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

Если бы кто-нибудь мог указать мне правильное направление, я был бы очень благодарен, и это сэкономило бы мне много времени!

Вот код между прочим:

class InventorySlots
{
    Texture2D box;
    Texture2D blackbox;
    Texture2D empty;
    const int offSet = 100;
    Rectangle[,] Inventoryslots = new Rectangle[6, 4];
    Rectangle testrect; // Rect for moving item
    bool isMoving;

    public void LoadContent(ContentManager Content)
    {
        box = Content.Load<Texture2D>("Box");
        blackbox = Content.Load<Texture2D>("boxselected");
        testrect = new Rectangle(10, 20, box.Width, box.Height);//Set up my test rect
        empty = box;

        for (int x = 0; x < 6; x++)
        {
            for (int y = 0; y < 4; y++)
            {
                Inventoryslots[x, y] = new Rectangle((x * box.Width) + offSet, // Setup my inventory slots
                     (y * box.Height) + offSet, box.Width, box.Height);
            }
        }
    }

    public void Update(GameTime gameTime)
    {
        if ((ButtonState.Pressed == Mouse.GetState().LeftButton))
        {
            if (testrect.Intersects(new Rectangle(Game1.mousePosition.X, Game1.mousePosition.Y, 0, 0)))
            {
                isMoving = true;
            }
        }
        else
        {
            isMoving = false;
        }
        if (isMoving)
        {
            testrect = new Rectangle(Game1.mousePosition.X - testrect.Width / 2, Game1.mousePosition.Y - testrect.Height / 2, testrect.Width, testrect.Height);
        }
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        for (int x = 0; x < 6; x++)
        {
            for (int y = 0; y < 4; y++)
            {
                if (Inventoryslots[x, y].Contains(Game1.mousePosition))
                {
                    empty = box;
                }
                else if (!Inventoryslots[x, y].Contains(Game1.mousePosition))
                    empty = blackbox;

                spriteBatch.Draw(empty, Inventoryslots[x, y], Color.White);                   
            }
        }

        spriteBatch.Draw(box, testrect, Color.White);//Draw my test item that i can move around
    }
}

person Iskalder    schedule 19.12.2013    source источник


Ответы (2)


Код, который у вас есть, демонстрирует непонимание принципов объектно-ориентированного программирования, все в вашей игре должно быть объектом или интерфейсом.

public class Item 
{
    private Texture2D texture; 

    private Vector2 position; 
    public Vector2 Position { get {return position; } } 

    private Rectangle Bounds; 

    public bool Collides(Vector2 position)
    {
         Bounds = new Rectangle(this.position.X, this.position.Y, 
                  this.texture.width, this.texture.height); 

         if (Bounds.Intersects(position))
             return true; 
         else return false; 
    }
}

используя принципы объектно-ориентированного программирования, вы должны сделать конкретный элемент производным от базового класса элемента, например так:

public class Sword : Item 
{
     public Sword() { } 
}

идея ООП заключается в том, что все в вашем коде выражается буквально, базовые классы содержат свойства и функции, которые инкапсулируют всех своих производных потомков. Таким образом, Sword наследует положение, границы, текстуру и так далее, и тому подобное.

Это разумно, потому что позволяет вам запрограммировать что-то один раз, а затем повторно использовать этот код для каждого элемента.

Я не собираюсь писать ваш код за вас, но начнем с определения ваших элементов следующим образом:

private Item[,] Inventoryslots = new Item[6, 4]; 

Я собираюсь свести это к минимуму, потому что у меня не так много времени, но если бы я мог указать вам направление, это было бы узнать больше об объектно-ориентированных принципах на языке компьютерного программирования C#. Google, что и вы золотой.

person Josh Siegl    schedule 20.12.2013
comment
Это имеет гораздо больше смысла, и, надеюсь, поможет мне в правильном направлении, спасибо! - person Iskalder; 20.12.2013

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

Public Class Item
     Public ID as integer // id of item (apple=1, hammer=2)
     Public Position as vector2 // position in your inventory
     Public Equiped as boolean = false;
End Class

Public Class Items
     Inherit List of(Item)

     Sub Add(id)
         dim Item as new Item
         Item.ID = id
         // find first free slot and apply position to Item.Position
         me.add(Item)
     End Sub

     Sub Remove(id)
         me.removeAll(function(c) c.id = id)
     End Sub

     Sub Relocate(id, newPostion)
         // example of looping
         For Each Item as Item in Me
             If Item.ID = id Then
                 Item.Position = newPosition
             End If
         Next
     End Sub

     Sub Equip(id)
         Dim Item as Item = me.find(function(c) c.id=id)
         Item.Equiped = true;
     End Sub

End Class

Вы можете создать перечислитель следующим образом:

Enum InventoryItems
    1 = Apple
    2 = Sword
End

Вы объявляете главную переменную: Public Inventory as New Items. Чтобы добавить новый элемент с помощью перечислителя: Inventory.Add(InventoryItems.Apple), но затем функция добавления должна принимать перечисления.

это не так сложно, когда вы понимаете, как это работает.

person Davor Mlinaric    schedule 19.12.2013
comment
Привет, спасибо за ответ! То, как вы кодируете, не похоже ни на один код, который я видел раньше. Извините, но мои познания в кодировании не так уж далеки от Xna и полубазового C#. Мне на самом деле трудно читать и понимать, как все это работает вместе. - person Iskalder; 19.12.2013
comment
Это похоже на Visual Basic, и, на мой взгляд, это не лучший подход к этой проблеме. Хорошо определить класс предметов, но в игре, которая требует много разных предметов, вы захотите создать дочерний класс для каждого предмета в игре. - person Josh Siegl; 20.12.2013