2012-05-04 5 views
0

XNAでスプライトフォントを使用してテキストを画面に描画しようとしています。 私はテキストを表示することができますが、何を試しても、テキストを描画するときに何か他のものと間違っていることが常にあります。SpriteFontを使用してXNA4でテキストを描画するときの問題

FPSを表示しようとしています。 私はいくつかの異なる方法で、そして私が作った様々なXNAプロジェクトでそれを試しました。 テキストを画面に描画するときに起こることのいくつかは、 - 頂点が遠く離れて間違った場所に描画され、頂点がまったく描画されず、ワイヤフレームモードがオンにならない場合があります。 テキストをどのようにレンダリングしようとしているかによって、私は常にこれらのテキストの1つで終わります。 そして、テキストを描画する部分をコメントアウトすると、すべて正常に戻ります。

ここでのコードの上部にいくつかのコード 私の変数があるさ -

私のLoadContentで
GraphicsDeviceManager graphics; 
    SpriteFont font; 
    SpriteBatch spriteBatch; 

私は

 font = Content.Load<SpriteFont>("SpriteFont1"); 
     RasterizerState rs = new RasterizerState(); 
     rs.FillMode = FillMode.WireFrame; 
     GraphicsDevice.RasterizerState = rs; 
     spriteBatch = new SpriteBatch(GraphicsDevice); 

を持っており、ここに私の全体のDrawメソッドである -

protected override void Draw(GameTime gameTime) 
    { 
     CreateMesh(); 
     GraphicsDevice.Clear(Color.SkyBlue); 

     effect.Parameters["View"].SetValue(cam.viewMatrix); 
     effect.Parameters["Projection"].SetValue(projectionMatrix); 
     effect.CurrentTechnique = effect.Techniques["Technique1"]; 
     effect.CurrentTechnique.Passes[0].Apply(); 
     GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Count, 0, indices.Length/3); 

     spriteBatch.Begin(); 
     spriteBatch.DrawString(font, frameRate.ToString(), new Vector2(1, 1), Color.Black); 
     spriteBatch.End(); 

     frameCounter++; 
     base.Draw(gameTime); 
    } 

これは私が発見した最も近い方法ですが、何らかの理由でそれが私が何をしようとしても、eframeは機能しません。本当にワイヤフレームが必要です。

EDIT: プログラムが実行されるときに塗りつぶしモードをデバッグし、スプライトフォントを使用するときに何らかの理由でそれを元に戻します。 頂点が描画される前にフレームごとに塗りつぶしモードをリセットすることはできますが、実際にはそうする必要はありません。

+0

可能性が非常に高いこのの重複:http://stackoverflow.com/questions/4902494/xna-spritebatch-causing-problems-with-basiceffect –

+0

[OK]をのでspritebatch.Begin()は自動的にいくつかのことを変更します。私はそれがかなりばかだと思うが、私はちょうどフレームごとにそれらをリセットする必要があると思います... – Frobot

+0

SpriteBatch.Beginではなく、DrawStringはダムではありません。あなたは本当に描画する前に必要な状態を設定する必要があります、これらの種類のものは問題ではありません。 Shawn Hargreavesの次のブログを参照してください。http://blogs.msdn.com/b/shawnhar/archive/2006/11/13/spritebatch-and-renderstates.aspx ShawnのXNAブログ記事をすべて読んでください。 –

答えて

1

あなたが他のラスタライザを使用したい場合はbatch.Begin()メソッドは、デフォルトのラスタライザの状態

を設定しますので、あなたは...だけでなく、負荷方法で、ちょうど気にいら勝利ワイヤフレームモードを描画する前に、あなたのラスタライザの状態を適用する必要がありますspritebatchための状態は、あなたが提供しなければならない1

spritebatch.Begin(SortMode,...,,.., rs); 
あなたのコードはこのように変更する必要があり

static RasterizerState rs = new RasterizerState() { FillMode = FillMode.Wireframe; } 

protected override void Draw(GameTime gameTime) 
{ 
    CreateMesh(); 
    GraphicsDevice.Clear(Color.SkyBlue); 

    GraphicsDevice.RasterizerState = rs; 

    effect.Parameters["View"].SetValue(cam.viewMatrix); 
    effect.Parameters["Projection"].SetValue(projectionMatrix); 
    effect.CurrentTechnique = effect.Techniques["Technique1"]; 
    effect.CurrentTechnique.Passes[0].Apply(); 
    GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Count, 0, indices.Length/3); 
    .... 
+0

私は実際にあなたが投稿したものとほぼ同じもので作業している私のコードを持っていますので、私は答えとしてこれを受け入れます – Frobot

関連する問題