2012-03-24 13 views
1

이 사이트의 새로운 기능과 프로그래밍이 처음 인 새로운 기능. 나는 최근에 나의 코드를보다 잘 구성하고 관리하고 그것을보다 효율적이고 읽기 쉽고 포괄적으로 만들 수있는 새로운 기술을 배우려고 노력해왔다.인터페이스 - null 예외가 발생했습니다

이 좋아 잘 난 못해, 난 데 문제가, 내가 C 번호는 08

을 표현 사용하고 XNA 3.1에, 그것에 대해 너무 많이 갈 나는 InputHandler라는 아파트형 게임 conponent 업데이트를 지금까지는 키보드 입력을 검사하고 KeyboardState의 인스턴스에 결과를 저장하는 기본 루프 (Game1) 이후에 루프를 수행합니다. Get 속성이있는 유일한 다른 코드는 Esc 키를 누른 경우 실제로 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; } 
    } 
(이 BTW 인터페이스입니다)

이 인터페이스는 InputHandler 구성 요소 내에서 구현되는 것은 물론입니다. 오류로 이동, 잘 카메라 컨포넌트 내 일부 루프 코드를 인터페이스를 통해 Keyboard_State 속성에 액세스하려고 일부 논리 코드 내 내에서 루프, 다음 apropriatly 카메라를 변경합니다.

  private IInputHandler input; 

다음 코드는 카메라 구성 요소 내 .. 무효 업데이트 루프에 있습니다. (input.Keyboard_State! = NULL) * 라인, 그것은 인스턴스 아니라고 불평하는 경우

  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; 
      } 

는 내가 *에서 null 참조 예외를 얻을.

저는 Interfaces에 익숙하지 않습니다. 과거에 XNA를 배우기 시작하기 전까지는 사용법을 많이 보지 못했고, 구성 요소에 대해 배우기 시작했습니다. 궁극적으로는 기본 구성 요소를 만들어서 3D 게임 (아무것도 공상, 그냥 조직 및 관리).

어떤 도움을 주시면 감사하겠습니다. 감사합니다 :)

* 기타 정보는 *

내 카메라 constructer는 다음과 같습니다

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

내 InputHandler의 constructer이 비어있는 내 GAME1의 constructer는 다음과 같습니다

 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; 
} 

편집, 업데이트 코드 : 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 나는 최고의 날을 보내고 있지 않다. Lol, 이전에는 결코 가상 키보드를 사용하지 말았어야했는데, 당신이 문제가 생겼을 때 그것을 좋아할 것입니다 : 질문에 대한 답은 이전에 카메라 생성자가 제공 한 코드로 두 생성자를 대체했습니다. 거의 동일한 코드에 가깝고 제안한 새로운 Game1 구형 변경을 시도했지만 여전히 작동하지 않습니다. : / – Gorlykio

관련 문제