如何处理库存中的物料

时间:2013-12-19 13:14:26

标签: c# xna inventory

我正在构建我的第一个广告资源,我希望它能像其他任何基本广告资源一样工作:

  • 当你拿起东西时,它会将它添加到你以后可以装备的库存中。
  • 它的外观和工作方式类似于疯狂神的库存领域。

我得到了一些基本的东西,如:

  • 绘制库存槽,当鼠标悬停时,它们会改变纹理。
  • 用鼠标移动项目/物体。

就是这样。

所以现在我陷入了涉及如何处理项目的部分,我知道有几种方法可以处理项目,但我不知道在我当前的代码中最简单的方法是什么使用。

如果有人能指出我正确的方向,我会非常感激,这会为我节省很多时间!

这是代码btw:

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

2 个答案:

答案 0 :(得分:1)

您所拥有的代码表明缺乏对面向对象原则的理解,游戏中的所有内容都应该是对象或界面。

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() { } 
}
OOP背后的想法是,代码中的所有内容都按字面表示,基类包含封装其所有派生子代的属性和函数。所以Sword会继承位置,界限,纹理等等。

这很聪明,因为它允许您对事物进行一次编程,然后为每个项目重复使用该代码。

我不打算为你编写代码,但首先要定义你的项目:

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

我将把这个保持在最低限度,因为我没有很多时间,但如果我能指出你的方向,那就是在C#计算机编程语言中学习更多关于面向对象原理的知识。谷歌,你和你是金。

答案 1 :(得分:0)

库存是游戏的重要组成部分。你可以列出的项目,例如从头部写的。

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)但是添加功能必须接受枚举。

当你理解它的运作方式时,它并不复杂。