locked
XNAゲームコンポーネントについて RRS feed

  • 全般的な情報交換

  • 現在XNAでゲーム開発を行っているものですが、ゲーム画面をコンポーネントで管理していて、ゲーム画面を切り替えるためにコンポーネントをRemoveし、Addして次のコンポーネントに切り替えようと思っていたのですが、SpriteBatchクラスのEndメゾッドがRemoveしたときにエラーをだします。おそらくDraw中に破棄したからだと思われるのですが、どのタイミングでコンポーネントを破棄したらよいのでしょうか。また、よりよいゲーム画面の管理の仕方があれば教えてください。
    2011年10月1日 18:35

すべての返信

  • エラーの詳細を教えていただけないでしょうか?ゲームコンポーネント自体はどの段階でも(マルチスレッドを除く)、追加、削除はできるようになっているので、恐らく削除したコンポーネントが保持していたオブジェクトに依存しているのが原因で例外が起きていると思われます。

    2011年10月2日 3:59
  • ごめんなさい。
    今日一日中エラーを追ってみてわかったことは、
    コンポーネント内でTexture2Dをロードし、コンポーネントのUnloadメゾッドで破棄していて、
    またそのコンポーネントを新しく生成したときに、おそらくTextureをロードできないみたいです。
    エラーの位置はspriteBatchクラスのEndメゾッドで、
    Can not access a disposed object.
    Object name: 'Texture2D'.
    と表示されます。
    一度破棄したテクスチャは再びロードされることはないのでしょうか?
    回答おねがいしいます。
    2011年10月2日 16:08
  • Unload内で破棄しているとありますが、実際のコードはどのようになっているのか提示していただけないでしょうか?



    2011年10月3日 1:39
  • 自作コンポーネント内のUnloadContentメゾッドです。
     protected override void UnloadContent()
            {
                
                titleLogo.Dispose();
             
                base.UnloadContent();
            }

    titleLogoは自作クラスのインスタンスで、自作クラスにDisposeメゾッドを実装しています。
     public void Dispose()
            {
                if (texture != null)
                {
                    this.texture.Dispose();
                }
            }
    textureはTexture2Dのインスタンスです。

    game.Content.Load<Texture2D>("data/imgdata/title")
    でテクスチャをLoadしています。上記の自作コンポーネントのインスタンスを破棄し、再び生成すると、テクスチャがロードされていないみたいです。
    2011年10月3日 13:59
  • Disposeというのはオブジェクト内で使っている「ネイティブ」リソースを破棄するものであって、オブジェクトそのものを解放する訳ではありません。
    ですから、Disposeを呼び出してもオブジェクトは参照されている限り存在し続けます。ここでの問題はgame.Contentが読み込んだオブジェクトを
    キャッシュしていて、Dispose後に読み込もうとしてもオブジェクト自体が存在しているので、Content.LoadはDisposeが呼び出された後と同じオブジェクトを
    返してくるのが原因です。

    こういったリソースのライフタイムの管理はContentManagerに任せるのが良いでしょう。
    この場合はコンポーネントにContentManagerを持たせ、それを介してLoad/Unload、もしくはDisposeを呼ぶようにすると良いでしょう。

    2011年10月4日 23:31