このサイトの新機能とプログラミングの新機能の両方。私は最近、自分のコードを整理して管理しやすくするために、新しいスキルを習得しようとしています。インターフェイス - 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;
希望が:)
KeyboardStateはクラスではなく、構造体です。 nullをテストする必要はありません(決してありません!)。ただし、最初の例のように初期化する必要があります。これは、クラスとは異なり、new演算子を使用せずに構造体をインスタンス化できますが、フィールドは未割り当てのままであり、すべてのフィールドが初期化されるまでvarは使用できません。 – Steve