C# 使用Content.Load<&燃气轮机;在类/子类中

C# 使用Content.Load<&燃气轮机;在类/子类中,c#,class,load,xna,C#,Class,Load,Xna,我想知道在一个不是游戏本身的类中是否有使用“Content.Load”的方法,比如说我想从类中加载一个纹理,而不是将纹理发送给它 namespace ProjectGame1 { public class Ship { public Texture2D texture; public Ship() { this.texture = Content.Load<Texture2D>("ship");

我想知道在一个不是游戏本身的类中是否有使用“Content.Load”的方法,比如说我想从类中加载一个纹理,而不是将纹理发送给它

namespace ProjectGame1
{
    public class Ship
    {
        public Texture2D texture;

        public Ship()
        {
        this.texture = Content.Load<Texture2D>("ship");
        }
    }
}
namespace ProjectGame1
{
公船
{
公共纹理2D纹理;
公共船舶()
{
this.texture=Content.Load(“ship”);
}
}
}

这是我试图实现的一个示例

我想你需要一个对游戏对象的引用来获取它的
内容
成员。这可以传入,也可以使游戏成为单例。

如果类派生自
DrawableGameComponent
,那么您仍然可以使用

Game.Content.Load(“ship”)

为了让它工作,您需要一个
构造函数
,它接受
游戏类型的参数。这意味着您需要添加对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");         
        }     
    } 
} 
使用Microsoft.Xna.Framework;
使用Microsoft.Xna.Framework.Content;
命名空间ProjectGame1
{     
public类Ship:DrawableGameComponent//注意,该类现在继承自
{//DrawableGameComponent
公共纹理2D纹理;
公共船(游戏)

:base(game)//您只需将ContentManager传递给Ship对象:

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

首先,我建议不要使用DrawableGameComponent,我的理由是

现在,要使代码按原样工作,您需要将
ContentManager
传递到您正在创建的构造函数中(请参阅)。但要做到这一点,您必须在
ContentManager
准备就绪后才能构造它。对于
Game
的内容管理器,这是在调用
LoadContent
期间和之后进行的(因此不在游戏的contstructor或
初始化方法中)

现在,您可以使用DrawableGameComponent这样的更好的组件:只需给出
Ship
class a
LoadContent
方法,并从游戏的
LoadContent
调用它(就像您对
Draw
Update
所做的那样)


如果船使用的纹理不是船状态的一部分(即:所有船使用相同的纹理),您甚至可以将其设置为静态,这样您就不必在创建的每艘飞船上调用
LoadContent
。我有一个例子,其中还列出了有关Content Manager的其他有用信息。

好的,我解决了这个问题,我使用了一种不同的方法,因为您的方法没有像我预期的那样有效。 我所做的是制作一个“公共静态ContentManager asd”,然后将其分配给游戏的ContentManager,然后将其重定向到“Game1.asd”来工作
(变量名是示例)

是的,我可以传递它,但新的问题是,当我试图将它传递给“protected override void LoadContent()”之外的子类时,找不到它,并且我尝试将LoadContent设置为公共,但这并没有帮助。我如何使它派生自DrawableGameComponent?只需设置它:公共类Ship:DrawableGameComponent“@JoDG这里的问题是,当我尝试在游戏默认LoadContent()之外实例化它时,我无法将默认内容发送到新的Ship。虽然这会起作用,但(从概念化的角度来看)将“Ship”设为“DrawableGameComponent”的子类可能更好,如其他一些答案所述。当我在实例化上键入“Content”或“this.Content”时,找不到它,它不会显示在(帮助列表,如果你这么称呼它的话)。@user669415它被称为“IntelliSense”@user669415你在哪里尝试调用
新船(this.Content)
from?这只适用于一个类,但是我的“Ship”是“敌方”类的父类(它包含纹理、位置等基本内容)。当我使用Ship的敌方子类时,是否必须传递一些信息,因为Visual C#实际上什么都没有说,只是出错了。请注意,为了获得LoadContent()调用override时,必须将Ship对象添加到Game.Components(即,在Ship构造函数中,“Game.Components.Add(this);”)。如果不使用
DrawableGameComponent
,如何更改
DrawOrder
?@Neil直接调用函数。因此
player.Draw();敌军.Draw();
变成
敌军.Draw();player.Draw();
。简单。
Ship ship = new Ship(this.Content);