0

MonoGame を使用して Windows Phone 8 用の小さなゲームを開発しています。最近、私のゲームは NullReference 例外でランダムな瞬間にクラッシュし始めました。Visual Studio は spriteBatch.End() メソッドを指摘していますが、MonoGame ライブラリ内のどこかで発生します。

ゲームはスプラッシュ画面で始まり、次にスタート画面が表示され、短いストーリーが表示されてからゲームプレイが始まります。例外はゲームプレイでのみ発生しますが、ランダムな瞬間に発生します。ゲームプレイで2秒かかることもあれば、2分かかることもあります。最初のタッチ操作で発生することもあれば、まったく触れずに例外が発生することもあります。

画面の特定のゾーンでタッチの問題が発生しました。それを解決するには、GamePage.xaml から StackFrame を削除する必要があり、別の GamePage.xaml からコピーして追加しようとしました。また、事前に乗算されたアルファを取り除くために、2 つの引数を指定したオーバーライドで spriteBatch.Begin() メソッドを使用しています。他に考えられる変更はありませんが、上司のせいで、現時点ではコードを投稿できません。必要なら彼を説得できます。


編集:私のプロジェクトにはさまざまなゲーム画面があり、この例外は「レベル」、「クレジット」などでのみ発生し、正常に機能します。すべての Update メソッドにコメントしましたが、単純な背景を描画しようとしても、Draw で例外が発生します。

Game1.cs

protected override void Draw(GameTime gameTime)
{
    spriteBatch.Begin();

    base.Draw(gameTime);
    ScreenManager.Instance.Draw(spriteBatch);

    spriteBatch.End();        
}  


ScreenManager.cs(Singleton class)

public void Draw(SpriteBatch spriteBatch)
{
    if (!this.Paused) currentScreen.Draw(spriteBatch);
    else PauseMenu.Draw(spriteBatch); 
}


Level.cs(currentScreen is a Level everytime this happens)

public override void Draw(SpriteBatch spriteBatch)
{
    base.Draw(spriteBatch);
    if (!completed)
    {
        //Commented bla bla that draws everything else
    }
}


GameScreen.cs(Base class of Level)

public virtual void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(image, new Vector2(480, 0), null, this.Color,
        (float)(Math.PI / 2), new Vector2(0, 0), 1f, SpriteEffects.None, 0);
}

レベル データは XmlManager クラスを使用して XML ファイル上で 1 行ずつ読み取られ、parseXml メソッドはレベルを作成し、Xml ファイルに従ってそのプロパティを割り当てロードし、そのレベルを返します。

ScreenManager.Instance.currentScreen =
    ScreenManager.Instance.manager.ParseXml(this.Content, "Level" +
        ++ScreenManager.Instance.CurrentLevelId + ".xml");

それがレベルの初期化方法です。


EDIT2:これは、テクスチャを描画しようとしたときにのみ発生します。文字列をうまく描画できます。

4

0 に答える 0