无法从另一个项目访问XNA ContentManager

时间:2013-05-15 22:35:47

标签: c# xna

我有一个复杂的问题,因为我没有想法我再次来到这里。

我在应用程序上生成任何3D引擎的镜头,我(不幸的是)建议XNA实现这一点,因为我们想用c#制作应用程序。我想给我的编程伴侣发送一个带有XNA代码的库(以接口的形式),所以他甚至不知道如何生成图像。

这是我的问题 - 我无法为我的场景加载模型和纹理因为contentmanager不在库项目中,尽管我没有单独运行xna游戏的问题。

所以这是我的问题:

  1. 是否可以访问/加载内容,以便可以在库中使用?
  2. 您可以推荐使用任何库来生成3D场景(在c#中)吗?
  3. 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

是的,可以在库项目中加载内容。您可以在ContentManager类之外创建Game的实例,并使用它来加载您的内容。

创建ContentManager的新实例的技巧是两个构造函数,它们都接受IServiceProvidor的实例作为第一个参数。无论您在哪个类中创建ContentManager in都可以实现此接口。您需要从此界面实现一种方法,即:

public object GetService(Type serviceType)

ContentManager将调用它以检索IGraphicsDeviceService的实例。您将需要一个可以实现此接口的类,该接口主要是与设备创建和销毁相关的事件。有一个重要的属性需要实现,即:

public GraphicsDevice GraphicsDevice

我将留下这个答案的许多样板代码,因为你可以在internetz上的其他地方找到它。下面的代码假设您已经初始化了XNA Graphics系统并在创建此类的实例之前创建了GraphicsDevice

public class ImageGenerator : IServiceProvider, IGraphicsDeviceService
{
    public GraphicsDevice GraphicsDevice { get; private set; }
    public ContentManager ContentManager { get; private set; }

    public ImageGenerator( GraphicsDevice device )
    {
        this.GraphicsDevice = device;
        this.ContentManager = new ContentManager( this );
    }

    public object GetService(Type serviceType)
    {
        if (serviceType == typeof(IGraphicsDeviceService))
        {
            return this;
        }
        return null;
    }
    public event EventHandler<EventArgs> DeviceCreated;

    public event EventHandler<EventArgs> DeviceDisposing;

    public event EventHandler<EventArgs> DeviceReset;

    public event EventHandler<EventArgs> DeviceResetting;
}

然而,在走这条路线之前,我建议你研究子类化Game并允许XNA Framework处理繁重的工作,你可以担心渲染一个场景并创建图像。

Axiom(http://www.axiom3d.net)是一个C#引擎,能够为位图图像生成3D场景。