1

画面に毎秒フレームを表示/表示する方法を見つける必要があるこのコードサンプルがあります。クラスを使用しようとしましたが、うまく機能せず、使用方法がわかりません。

protected override void Initialize()
{
    base.Initialize();

    fpsm = new FpsMonitor();
    fpsm.Update();
    fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);

}

protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
        ButtonState.Pressed)
        this.Exit();

    modelRotation += (float)gameTime.ElapsedGameTime.TotalMilliseconds *
        MathHelper.ToRadians(0.1f);

    base.Update(gameTime);
}

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

    // Copy any parent transforms.
    Matrix[] transforms = new Matrix[myModel.Bones.Count];
    myModel.CopyAbsoluteBoneTransformsTo(transforms);

    // Draw the model. A model can have multiple meshes, so loop.
    foreach (ModelMesh mesh in myModel.Meshes)
    {
        // This is where the mesh orientation is set, as well 
        // as our camera and projection.
        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();
            effect.World = transforms[mesh.ParentBone.Index] *
                Matrix.CreateRotationY(modelRotation)
                * Matrix.CreateTranslation(modelPosition);
            effect.View = Matrix.CreateLookAt(cameraPosition,
                Vector3.Zero, Vector3.Up);
            effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                MathHelper.ToRadians(45.0f), aspectRatio,
                1.0f, 10000.0f);
        }
        // Draw the mesh, using the effects set above.
        mesh.Draw();
    }
    base.Draw(gameTime);
}

そして FPS クラス:

public class FpsMonitor
{
    public float Value { get; private set; }
    public TimeSpan Sample { get; set; }
    private Stopwatch sw;
    private int Frames;
    public FpsMonitor()
    {
        this.Sample = TimeSpan.FromSeconds(1);
        this.Value = 0;
        this.Frames = 0;
        this.sw = Stopwatch.StartNew();
    }
    public void Update()
    {
        if (sw.Elapsed > Sample)
        {
            this.Value = (float)(Frames / sw.Elapsed.TotalSeconds);
            this.sw.Reset();
            this.sw.Start();
            this.Frames = 0;
        }
    }
    public void Draw(SpriteBatch SpriteBatch, SpriteFont Font, Vector2 Location, Color Color)
    {
        this.Frames++;
        SpriteBatch.DrawString(Font, "FPS: " + this.Value.ToString(), Location, Color);
    }
}

コンストラクターで使用するために Game1.cs で試しました。

fpsm = new FpsMonitor();
fpsm.Update();
fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);

しかし、それはそれを使用する方法ではありません。それをどのように使用し、コードのどこで使用しますか?

4

2 に答える 2

2

私が見たものから

fpsm = new FpsMonitor(); // in constructor
fpsm.Update();// in update I think first line

spriteBatch.Begin();  // in draw Last lines probably even after base.Draw(gameTime);
fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);
spriteBatch.End();

それは魅力のように機能するはずです

【スプライトフォント説明編集】

SpriteFont を作成する必要があります。これを行うには、コンテンツを右クリックして、[新規追加] と [スプライトフォントの作成] を選択しました。コンパイル時に変換されるXMLファイルです。フォントと高さを変更できます。Arial と 10 をお勧めします。いつでも変更できます。

次に、ロードする必要があります。普段はこのようにしています。

クラスで

private Spritefont Arial10;

LoadContent で

Arial10 = Content.Load<Spritefont>("Arial10");

今、あなたはこれを行うことができます

spriteBatch.Begin();  // in draw Last lines probably even after base.Draw(gameTime);
fpsm.Draw(spriteBatch, Arial10 , new Vector2(5,5), Color.Red);
spriteBatch.End();
于 2013-10-20T09:34:06.917 に答える
0

Initialize メソッドで FPS を描画することはできません。Draw メソッドで描画し、Update メソッドで更新する必要があります。Draw メソッドで描画しないと、FPS は描画されません。Initialize は一度だけ呼び出され、GraphicsDevice はフレームごとにクリアされます。

メソッド内Game1.csで、Initialize次の行を削除します。

fpsm.Update();
fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);

メソッドに追加fpsm.Update();し、Update()これをDrawGame1.cs 内のメソッドに追加します ( の後GraphicsDevice.Clear(Color.CornflowerBlue);):

spriteBatch.Begin();
fpsm.Draw(spriteBatch, fonts, new Vector2(5,5), Color.Red);
spriteBatch.End();

これがあなたがする必要があることだと確信しています。

LoadContent()次のようにして、メソッドにフォントをロードすることを忘れないでください。

fonts = Content.Load<SpriteFont>("MySpriteFont");

また、スプライトフォントは、コンテンツ プロジェクトからコンパイルされたファイルである必要があります。コンテンツ プロジェクトを右クリックし、[追加] > [新しいアイテム] を選択して、SpriteFont ファイルを選択します。

于 2013-10-20T11:55:18.910 に答える