0

我正在尝试设置一个非常简单的 XNA 游戏,上面有 3d 地形和一些 2d GUI 对象。我选择了 Nuclex,因为它似乎是少数几个目前处于活动状态的 2d GUI 之一。

我的问题:在我的游戏中添加一个 Nuclex“屏幕”类会导致 3d 地形和在其上绘制的线条搞砸了——我有三层 3d 对象:地形、地形的线框轮廓和一些“路线” “拥抱地形。添加屏幕后,部分淹没在地形中的路线会完全显示在地形之上,并且线框网格会显得更粗。

这是我的 Game.Initialize 方法的结尾,按照 Nuclex GuiManager 页面上的示例进行操作:

    InputManager im = new InputManager();

    IGraphicsDeviceService igds = Nuclex.Graphics.GraphicsDeviceServiceHelper.MakeDummyGraphicsDeviceService(GraphicsDevice); 
    gui = new GuiManager(igds, im);
    gui.Initialize();

    Viewport vp = GraphicsDevice.Viewport; 
    Screen main_screen = new Screen(vp.Width, vp.Height);
    //main_screen.
    this.gui.Screen = main_screen; 
    main_screen.Desktop.Bounds = new UniRectangle(
        new UniScalar(0.1f, 0.0f), new UniScalar(0.1f, 0.0f), // x and y
        new UniScalar(0.8f, 0.0f), new UniScalar(0.8f, 0.0f) // width and height
    );

    LabelControl text = new LabelControl("hello");
    text.Bounds = new UniRectangle(10, 10, 200, 30);

    main_screen.Desktop.Children.Add(text);

    Components.Add(gui);

    base.Initialize();

那么,关于我做错了什么的任何想法?

谢谢!

4

1 回答 1

0

是的,多亏了 catflier 为我指出了渲染状态的方向,我解决了这个问题: * 首先,“RenderState”是一个 XNA3 术语;XNA4 只允许在 GraphicsDevice 对象上直接使用一些状态标志。* 问题是 Nuclex 偷偷设置 GraphicsDevice.DepthStencilState 并留下它,而不是在使用后将其恢复到以前的值(淘气!!)。* 所以解决方案是,在你的 Draw 方法的顶部,像这样添加一行:

GraphicsDevice.DepthStencilState = DepthStencilState.Default;
于 2012-09-29T12:25:36.650 回答