使用Content.Load<>在类/子类中

时间:2011-03-22 14:32:39

标签: c# class load xna

我想知道是否还有使用“Content.Load<>”在一个不是游戏本身的类中,假设我想从类中加载一个纹理,而不是将纹理发送给它。

namespace ProjectGame1
{
    public class Ship
    {
        public Texture2D texture;

        public Ship()
        {
        this.texture = Content.Load<Texture2D>("ship");
        }
    }
}

这是我正在努力实现的一个例子

6 个答案:

答案 0 :(得分:8)

您只需将ContentManager传递给Ship对象:

public Ship(ContentManager content)
{
   this.texture = content.Load<Texture2D>("ship");
}

从您的游戏类中实例化Ship:

Ship ship = new Ship(this.Content);

答案 1 :(得分:4)

首先,我建议 使用DrawableGameComponent ,我的理由是outlined in this answer here

现在,要使代码按原样运行,您需要将ContentManager传递给您正在创建的构造函数(请参阅JoDG's answer)。但要做到这一点,你必须在ContentManager准备就绪后才能构建它。对于Game的内容管理员,这是在调用LoadContent期间和之后(所以不是在游戏的结构或Initialize方法中)。

现在,你可以使用DrawableGameComponent做一些像这样的事情,这样做更好:只需给你的Ship课程一个LoadContent方法,并从你的游戏中调用它#39 ; s LoadContent(正如您对DrawUpdate所做的那样)。

如果您的船舶使用的纹理不属于您船舶的状态(即:所有船只使用相同的纹理),您甚至可以将其设置为静态,从而使您无需拨打LoadContent在你创造的每艘船上。我有一个例子是this answer here,它还有一个关于Content Manager的其他有用信息的列表。

答案 2 :(得分:3)

如果类派生形式为DrawableGameComponent,那么您仍然可以使用
Game.Content.Load<Texture2D>("ship");

答案 3 :(得分:1)

为了使其发挥作用,您需要Constructor接受Game类型的参数。这意味着您需要添加对Microsoft.Xna.Framework.Game的引用。

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;

namespace ProjectGame1 
{     
    public class Ship : DrawableGameComponent // Notice the class now inherits from
    {                                         // DrawableGameComponent
        public Texture2D texture;          

        public Ship(Game game)         
            : base(game) // <<---- Don't forget to pass Game to the base constructor
        {         
            this.texture = game.Content.Load<Texture2D>("ship");         
        }     
    } 
} 

答案 4 :(得分:0)

我认为您需要引用Game对象才能获得Content成员。这可以传入,也可以让游戏成为单身人士。

答案 5 :(得分:0)

好的,我解决了它,我使用了一种不同的方法,因为你的工作并没有像我期望的那样完成。 我做的是制作一个“public static ContentManager asd”;然后将其分配给Game的ContentManager,然后将其重定向到“Game1.asd” (变量名称是示例)