2016-04-27 6 views
2

Monogameで簡単な2Dゲームを作成しようとしています。私はカメラクラスのオンラインチュートリアルを見て、自分のキャラクターが動いている場所に向かって画面をスクロールするのに使用しました。C#スプライトバッチに変換行列を追加した後に描画メソッドが描画されない

これは、カメラのクラスです:

public class Camera 
{ 
    Vector2 position; 
    Matrix viewMatrix; 

public Matrix ViewMatrix 
{ 
    get { return viewMatrix; } 
} 

public int ScreenWidth 
{ 
    get { return GraphicsDeviceManager.DefaultBackBufferWidth; } 
} 

public int ScreenHeight 
{ 
    get { return GraphicsDeviceManager.DefaultBackBufferHeight; } 
} 

public void Update(Vector2 playerPosition) 
{ 
    position.X = playerPosition.X - (ScreenWidth/2); 
    position.Y = playerPosition.Y - (ScreenHeight/2); 

    if(position.X <0) 
    { 
     position.X = 0; 
    } 
    if(position.Y <0) 
    { 
     position.Y = 0; 
    } 

    viewMatrix = Matrix.CreateTranslation(new Vector3(-position, 0)); 
} 

そしてGame1.csで、私は、次のDrawメソッドを使用します。私は、引数なしでspriteBatch.Begin()を使用する場合

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


    spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, 
    null, null, null, null, Camera.ViewMatrix); 

    ScreenManager.Instance.Draw(spriteBatch); 
    spriteBatch.End(); 


    base.Draw(gameTime); 

} 

を、 Titlescreenとmainmenuは、タイルマップとプレイヤーに続いて細かくロードされます。 しかし、Camera.Viewmatrix引数を追加すると、画面は黒のままです。 Graphicsdevice.Clear(Color.Black)を超えて何も描画していないようです。

私はすべての入力を感謝します。私のコードをもっと見る必要があるかどうか、私に知らせてください。

更新:カメラとマトリックスはうまくいきます。この問題は、ScreenManager、Image、Tile、Layer、TitleScreenなど、多くのクラスがあり、すべてUpdateを使用しており、ほとんどがDrawメソッドを使用しているという事実と関係しています。

実際の描画は、描画メソッドを使用してScreenManagerクラスのシングルトンインスタンスによってgame1.csに上記のように処理されています。

開始時にマトリックスをfadescreen/titlescreenに適用しようとしていると思われ、それが黒い背景を過ぎて進まないなどのエラーを引き起こしています。おそらく、カメラの位置にプレーヤーの位置がないためですか?

カメラとプレーヤーの描画メソッドに別々のspritebatch.Begin()を使用しようとしましたが、この結果、他のスプライトが終了する前に新しいspriteBatch.Beginを呼び出すというエラーが発生します。

私はこれが解決できるように感じますが、私は解決策を今見逃しているかもしれません。

私はこれを「プロジェクト全体を見て修正してください」とは思っていませんが、誰かがこの状況を認識して入力したり、同じことを実行して修正しても、あなたのフィードバックを非常に感謝します。

また、誰でももっと見るためにはもっとコードを必要とするでしょう。私に知らせてください。

答えて

0

アイデンティティ行列を入力してみてください。それはうまくいくはずで、何かがあなたのマトリックスに間違っていなければならないことを確認します。私はこれをしてからしばらくしていますが、これはうまくいったと思います。

public void Update(Vector2 playerPosition) 
{ 
    if(position.X <0) 
    { 
     position.X = 0; 
    } 
    if(position.Y <0) 
    { 
     position.Y = 0; 
    } 

    viewMatrix = Matrix.CreateTranslation(new Vector3(-playerPosition.X, -playerPosition.Y, 0.0f)); 
} 
+0

恩赦私の潜在的な無知が、私は何をすべきかではありません。 にviewMatrix = Matrix.CreateTranslation(新しいのVector3(位、0)); あなたの提案と本質的に同じです: viewMatrix = Matrix.CreateTranslation(new Vector3(-playerPosition.X、-playerPosition.Y、0.0f)); – Sidney

+0

はい、私のコードには含まれていないメソッドの一番上で計算します。アイデンティティ行列が正しくない場合は、行列が正しいか試してみてください。 –

+0

もう一度、本当にありがとう、時間を割いていただきありがとうございます!あなたが言ったように私はそれを変更しようとしましたが、結果は残念なことに同じです。 – Sidney

関連する問題