2010-11-14 4 views
4

Я работаю над игрой 3D Spaceship с XNA 3.1XNA странно 3D картина, когда картина текста

Я пытался отделить свою картину коду из логики игр (altought XNA делает это почти).

Я использую специальный статический класс, который рисует свои модели на экране ... главный класс игры использует этот код картины:

protected override void Draw(GameTime gameTime) 
    { 
     graphics.GraphicsDevice.Clear(Color.Black); 

     // Draws the stage (the skybox and objects like rocks) 
     stageManager.Draw(gameTime, GraphicsDevice, camera); 


     // Draws each player and each Enemy on stage given the camera 
     foreach (Player p in players) 
      p.Draw(camera); 

     foreach(Enemy e in enemies) 
      e.Draw(camera); 

     if(Configuration.Debug) 
      col.renderColBoundings(GraphicsDevice, camera); 

     GraphicHelper.drawOverlayText("50", "10"); // "Error" line... 

     base.Draw(gameTime); 
    } 

Но когда я пишу текст, что-то странное происходит ... Вот изображение (original):

Как вы можете видеть, все выглядит перекрывающийся (но на месте) ... Как и космический корабль турбин.

Код внутри GraphicHelper.drawOverlayText это:

public static void drawOverlayText(String p1Hp, String currEnemies) 
    { 
     string text1 = "Player1: " + p1Hp; 
     string text2 = "Enemies: " + currEnemies + "/10"; 
     string text3 = "Space Hogs Beta"; 

     spriteBatch.Begin(); 

     // Draw the string twice to create a drop shadow, first colored black 
     // and offset one pixel to the bottom right, then again in white at the 
     // intended position. This makes text easier to read over the background. 
     spriteBatch.DrawString(font, text1, new Vector2(651, 11), Color.Gray); 
     spriteBatch.DrawString(font, text1, new Vector2(650, 10), Color.White); 

     spriteBatch.DrawString(font, text2, new Vector2(851, 11), Color.Gray); 
     spriteBatch.DrawString(font, text2, new Vector2(850, 10), Color.White); 

     spriteBatch.DrawString(font, text3, new Vector2(741, 611), Color.Gray); 
     spriteBatch.DrawString(font, text3, new Vector2(740, 610), Color.White); 

     spriteBatch.End(); 
    } 

И этот статический класс имеет некоторые атрибуты:

static ContentManager content; 
    static GraphicsDevice graphics; 
    static Camera camera; 
    static Dictionary<String, Model> models = new Dictionary<string, Model>(); 
    static SpriteBatch spriteBatch; 
    static SpriteFont font; 

    public static void initHelper(ContentManager c, GraphicsDevice g, Camera cam) 
    { 
     content = c; 
     graphics = g; 
     camera = cam; 
     spriteBatch = new SpriteBatch(g); 
     font = c.Load<SpriteFont>("Fonts/main"); 
    } 

Надеется, что вы можете мне помочь :)

ответ

8

Странной рендеринге вы видите потому что буфер глубины выключен. Он отключается при использовании SpriteBatch. Это известная странность API XNA 3.1. XNA 4.0 по крайней мере делает это более очевидным, что это происходит.

Here is an explanation of what render states are changed by SpriteBatch in XNA 3.1. И here is the same thing for XNA 4.0.

Решение заключается в том, чтобы в основном настроить состояния рендеринга на то, что вы хотите, после использования SpriteBatch. В этом случае, по крайней мере, установить:

GraphicsDevice.RenderState.DepthBufferEnable = true; 

(Там могут быть некоторые другие государства есть вы хотите, чтобы вернуться.)

+0

Спасибо Андрею, что это сделал! Я знал, что это связано с графическим устройством, но не совсем так: P – RodrigoCR