C# XNA 单击创建对象

本文关键字:创建对象 单击 XNA | 更新日期: 2023-09-27 17:56:47

我正在创建一个程序,模拟蚂蚁跑来跑去,收集食物并将其存放在巢中。我希望用户能够在光标点单击并添加嵌套对象。我还希望将创建的对象添加到嵌套列表中。

到目前为止,我已经在我的主游戏类的更新方法中尝试过这个。

        mouseStateCurrent = Mouse.GetState();

        if (mouseStateCurrent.LeftButton == ButtonState.Pressed)
        {
            int foodWidth = 50;
            int foodHeight = 50;
            int X = mouseStateCurrent.X;
            int Y = mouseStateCurrent.Y;
            foodPosition = new Rectangle(X, Y, foodWidth, foodHeight);
            food = new stationaryFood(foodPosition);
            foodList.Add(food);            
        }

这样可以编译,但是当我单击游戏崩溃时,我收到一个错误,指出当以"draw"方法绘制食物对象时,食物的纹理为空。我理解为什么会发生这种情况,因为我尝试在主游戏类的 LoadContent() 方法中按如下方式加载纹理

foreach (stationaryFood f in foodList)
        { 
            f.CharacterImage = foodImage;
        }

这是食物对象的单独类中的设置/获取

    public Texture2D CharacterImage
    {
        set
        {
            foodImage = value;
        }
        get
        {
            return foodImage;
        }
    }

这是我收到错误的食物对象类中的方法

 public void Draw(SpriteBatch spriteBatch, List<stationaryFood> foodlist)
    {
        foreach (stationaryFood food in foodlist)
        {
            spriteBatch.Draw(foodImage, foodBoundingRectangle, foodColor);
        }
    }

食物图像变量为空。我知道这是因为当 LoadContent() 加载图像时,列表中没有任何内容!但是我不知道如何解决这个问题!它可能非常简单,我只是在编程方面相当新!任何帮助将不胜感激,我希望我没有解释得太难以理解。

C# XNA 单击创建对象

编辑:忽略我发布和删除的内容。在再次查看问题后,我意识到我的答案存在一些问题。

在 Update 方法中创建新的 StationaryFood 时,永远不会分配新的 StationaryFood 的 CharacterImage。您的 Game1 中应该有一个名为 foodImage 的纹理成员。您将在 LoadContent 方法中加载 foodImage 的纹理。现在,每当您在更新中创建新的文具食物时,您都需要为新食物的字符图像分配食物图像和您通过鼠标位置创建的位置。

因此,假设您的文具食品类如下所示:

class stationaryFood
{
    public Texture2D CharacterImage { get; set; }
    public Rectangle Position { get; set; }
    public stationaryFood(Texture2D image, Rectangle position) {
        CharacterImage = image;
        Position = position;
    }
}

因此,范围限定为 Game1 的纹理成员:

Texture2D foodImage;

在 LoadContent 方法中:

foodImage = Content.Load<Texture2D>("path to texture");

更新中:

if (mouseStateCurrent.LeftButton == ButtonState.Pressed)
{
    int foodWidth = 50;
    int foodHeight = 50;
    int X = mouseStateCurrent.X;
    int Y = mouseStateCurrent.Y;
    var foodPosition = new Rectangle(X, Y, foodWidth, foodHeight);
    var food = new stationaryFood(foodImage, foodPosition);
    // no need to scope foodPosition or food to Game1 since were creating and adding to list here
    foodList.Add(food);            
}

抽奖中:

foreach (stationaryFood food in foodlist)
{
    spriteBatch.Draw(food.CharacterImage, food.Position, food.Color);
}

现在我猜食物列表是Game1的成员,所以没有必要将列表传递到Draw中。如果不是这样,那就去世吧。