2012-03-24 16 views
1

このサイトの新機能とプログラミングの新機能の両方。私は最近、自分のコードを整理して管理しやすくするために、新しいスキルを習得しようとしています。インターフェイス - null例外がスローされました

オーケーだけでなく、私は文句を言わないことについてはあまり上に行く、私がいる問題は、私はC#を使用しています、XNA 3.1である私はInputHandlerと呼ばれる自己完結型ゲームconponent、アップデートを持っている08.

を表現これまではキーボード入力をチェックし、結果をKeyboardStateのインスタンスに格納するベースループ後のループ(Game1).Edscapeキーが押された場合、他のコードだけがGame1を終了します入力を保存した後

コード:問題に移る

 private KeyboardState keyboardstate; 
     public KeyboardState Keyboard_State 
     { 
      get { return (keyboardstate); } 
     } 

     public override void Update(GameTime gameTime) 
     { 
      keyboardstate = Keyboard.GetState(); 
      if (keyboardstate.IsKeyDown(Keys.Escape)) 
       Game.Exit(); 

      base.Update(gameTime); 
     } 

は、IInputHandlerのインスタンスを経由してInputHandlerのKeyboard_Stateプロパティにアクセスする他のゲームconponentと呼ばれるカメラの試みは

public interface IInputHandler 
    { 
     KeyboardState Keyboard_State { get; } 
    } 
(これはところでインターフェースです)

このインタフェースはInputHandlerコンポーネント内で実装されることは言うまでもない。エラーに移って、私はカメラコンポーネント内の私の更新ループで、インタフェースを通してKeyboard_Stateプロパティにアクセスしようとするいくつかのロジックコードをいくつかの条件に対してチェックしてから、カメラを適切に変更します。

  private IInputHandler input; 

次のコードはCameraコンポーネント内のvoid更新ループ内にあります。

  if (input.Keyboard_State !=null) 
      { 
       if (input.Keyboard_State.IsKeyDown(Keys.Left)) 
        cameraYaw += spinRate; 
       if (input.Keyboard_State.IsKeyDown(Keys.Right)) 
        cameraYaw -= spinRate; 

       if (cameraYaw > 360) 
        cameraYaw -= 360; 
       else if (cameraYaw < 360) 
        cameraYaw += 360; 
      } 

私はそれは、インスタンスではないことを訴えて、* IF(input.Keyboard_State!= NULL)*ラインでのnull参照の例外を取得します。

私はInterfacesで新しく、以前はXNAを学び始めてからコポネンツについて学び始めてから、最終的には、コンポーネントを作成して3Dゲーム(何も気にせず、ちょうど編成され、管理可能)。

助けていただければ幸いです。感謝:)

*その他の情報*

私のカメラの建設業者は、次のとおりです。

 public Camera(Game game) 
      : base(game) 
     { 
      graphics = (GraphicsDeviceManager)Game.Services.GetService(typeof(IGraphicsDeviceManager)); 
      input = (IInputHandler)game.Services.GetService(typeof(IInputHandler)); 
     } 

と私のInputHandlerの建設業者が空で、私のGame1の建設業者は、次のとおりです。

 public Game1() 
     { 
      graphics = new GraphicsDeviceManager(this); 
      Content.RootDirectory = "Content"; 

      camera = new Camera(this); 
      Components.Add(camera); 

      input = new InputHandler(this); 
      Components.Add(input); 

      input.UpdateOrder = 0; 
      camera.UpdateOrder = 1; 

      // this component alows Asyncroniously save/load game. 
      Components.Add(new GamerServicesComponent(this)); 

#if DEBUG 
      fps = new FPS(this); 
      Components.Add(fps); 
      fps.UpdateOrder = 1; 
      camera.UpdateOrder = 2; 
#endif 

     } 

入力します入力ハンドラゲームコンポーネントのインスタンス。このことができます

  private InputHandler input; 

希望が:)

+0

KeyboardStateはクラスではなく、構造体です。 nullをテストする必要はありません(決してありません!)。ただし、最初の例のように初期化する必要があります。これは、クラスとは異なり、new演算子を使用せずに構造体をインスタンス化できますが、フィールドは未割り当てのままであり、すべてのフィールドが初期化されるまでvarは使用できません。 – Steve

答えて

0

あなたが(=入力がNULLの)どこにでもカメラで-variable「入力」を初期化していないように私には思えます。

そのため、if (input.Keyboard_State !=null) -lineはNullReferenceExceptionをスローします(そして、KeyboardStateは構造体なのでnullにはなりません)。あなたはInputHandlerとCameraの両方がゲームコンポーネントだと言ったのですか?そして、このような何かをやってみてください。

public InputHandler(...) 
{ 
    // Your initialization code here 

    this.Game.Services.AddService(typeof(IInputHandler), this); 
} 

とカメラコンストラクタで

public Camera(...) 
{ 
    // Your initialization code here 

    input = this.Game.Services.GetService(typeof(IInputHandler)) as IInputHandler; 
} 

EDIT、更新されたコード:InputHandlerコンストラクタで

あなたのゲームのコンストラクタを変更これまで:

public Game1() 
    { 
     graphics = new GraphicsDeviceManager(this); 
     Content.RootDirectory = "Content"; 

     input = new InputHandler(this); 
     Components.Add(input); 
     Services.AddService(typeof(IInputHandler), input); 

     camera = new Camera(this); 
     Components.Add(camera); 



     input.UpdateOrder = 0; 
     camera.UpdateOrder = 1; 

     // this component alows Asyncroniously save/load game. 
     Components.Add(new GamerServicesComponent(this)); 

#if DEBUG 
     fps = new FPS(this); 
     Components.Add(fps); 
     fps.UpdateOrder = 1; 
     camera.UpdateOrder = 2; 
#endif 

    } 
+0

はコードを追加しようとしましたが、失敗しました。 :/ – Gorlykio

+0

@ user1290236何がうまくいかなかったのですか? – flai

+0

omg私は最高の日を過ごしていません。私のカメラのコンストラクタは、あなたが提供したコードで、以前は両方のコンストラクタを置き換えていましたが、あなたの質問に答えるために、私は仮想キーボードを使用しなければなりませんでした。同じコードの近くで、あなたが提案した新しいGame1コンストラクタの変更を試しましたが、まだ動作しません。 :/ – Gorlykio

関連する問題