0

私はC#とXNAの両方の初心者であり、少し行き詰まっています。

Game1クラスに、SoundEffectオブジェクトを追加しました。このクラス内から、[objectname] .Play();を使用してサウンドを再生できます。例えば

public SoundEffect newSound;
newSound.Play();

ただし、スプライトを表す別のクラスがあります。そのクラス内からサウンドをプライしようとすると、nullreference例外エラーが発生します。たとえば(私のスプライトクラス内):

Game1 newGame = new Game1();
newGame.newSound.Play();

私はこれが一般的なエラーであることを知っています。オブジェクトインスタンスの初期化と関係があることはわかっています。私の問題は、これを広範囲に調査し、このエラーに対する他の解決策を見つけたものの、なぜそれを受け取っているのか理解できないことです。

そのため、完全なコードを貼り付けていません。私が疑問に思っているのは、これがどのように機能するかを説明できるチュートリアルや記事の方向に誰かが私を向けることができるかどうかです。問題が何であるかを完全に理解せずに、このエラーを単に消したくはありません。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

2

問題は、スプライトが、ゲーム ループを実行している Game1のインスタンスSoundEffectにアクセスする必要があり、 . 何もするのに適切な状態ではない別のnew Game1()インスタンスを提供しています。

ここで通常行うことは、スプライト クラスにコンストラクター引数または設定可能なプロパティを設定することです。Game1 クラスがある時点でスプライトを作成すると仮定します。

Sprite s = new Sprite();

代わりに、Game1 のインスタンスをそれに渡すことができるようにする必要があります。

Sprite s = new Sprite(this);

そして、スプライト クラスを変更して、a) この新しい引数をコンストラクターで受け取り、b) この値をフィールドに格納して、後でアクセスできるようにする必要があります。

クラス全体を見ることができれば、これをもう少し肉付けすることができますSpriteが、ここに投稿するには少し大きいかもしれません.

于 2011-09-26T07:52:12.247 に答える
1

これは、いろいろと想定しているようなもので……。

ゲームを維持するために Update/Draw 無限ループで実行されているメイン クラスである Game1 クラスがあります...

次に、それを Enemy と呼ぶ別のクラスがあり、Game1 の Update メソッドで Enemy.PlaySound() のような呼び出しを行います。

Enemy::PlaySound では、Game1 の LoadContent で初期化したサウンドを次のように再生します。

public void PlaySound()
{
 Game1 newGame; //like assuming that with this you are pointing to the instance of Game1 that it's running and since it's not the instance of that class and it's not even initialized there is the NullReferenceException.....(I think)
newGame.NewSound.Play(); //Assuming againt that we have a property to access the NewSound
}

ここにはたくさんのロングショットがあります.....しかし、質問がちょっと不明確です....

編集 - 最初のコメントの後

それもうまくいきません

このように動作します

public class Enemy
{
 ....

    public void PlaySound(Game1 newGame)
    {
        newGame.NewSound.Play();
    }
 ....
}

しかし、Game1 をパラメータとして Enemy Methods に渡すのは良い習慣ではありません...IMO

あなたを導くことができる良い本、チュートリアル、フレームワークがたくさんあります....

于 2011-09-26T07:37:08.300 に答える