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:これは、テクスチャを描画しようとしたときにのみ発生します。文字列をうまく描画できます。