2014-12-18 3 views
0

나는 을 사용하여 게임을 만들고 사용자 입력을 관리하기 위해 컨트롤러 관리자를 사용하려고합니다.잘못된 개체를 참조하는 지정

이렇게하려면 클래스 ControllerManager을 만들었습니다. 컨트롤러 2 개에서 입력을 받아 내려고하기 때문에 ControllerManager의 인스턴스를 세 개 만듭니다. controllerManager, controller1Managercontroller2Manager입니다.

이제 내 플레이어 개체에 어떤 플레이어인지에 따라 controller1Manager 또는 controller2Manager 중 하나에 할당해야하는 로컬 변수 localManager이 있습니다.

나는 그것을 좋아 할당하는 노력했습니다 :이 controllerManager로 설정 localManager중인 변수에 결과

this.localManager = Controller1Manager; 

합니다.

그래서 내가 뭘 잘못하고 있는지 알아? 나는 포인터/참조/싱글 톤과 관련이 있을지 모르지만 구성 요소 목록을 확인한 다음 개별 관리자가 거기에 있다는 것을 알지 못합니다.

편집 : 요청으로 , 여기에 생성자, 클래스 생성하고 난 값

using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Input; 
using GDApp; 

namespace GDLibrary 
{ 
public class ControllerManager : GameComponent, IService 
{ 
    public GamePadState newState, oldState; 
    public PlayerIndex player; 

    public ControllerManager(Main game, PlayerIndex index) 
     : base(game) 
    { 
     this.player = index; 
    } 
    public override void Update(GameTime gameTime) 
    { 
     oldState = newState; 
     newState = GamePad.GetState(player); 
     base.Update(gameTime); 
    } 
    public bool IsFirstButtonPress(Buttons button) 
    { 
     if (oldState.IsButtonUp(button) && newState.IsButtonDown(button)) 
      return true; 

     return false; 
    } 

    public bool IsButtonDown(Buttons button) 
    { 
     return newState.IsButtonDown(button); 
    } 

    public bool IsButtonUp(Buttons button) 
    { 
     return newState.IsButtonUp(button); 
    } 

    #region Thumbsticks 

    //Right 

    //Magnitude of right stick in right direction 
    public float RightStickRight() 
    { 
     if (newState.ThumbSticks.Right.X <= 0) 
      return 0; 
     else 
      return newState.ThumbSticks.Right.X; 
    } 

    //Magnitude of right stick in left direction 
    public float RightStickLeft() 
    { 
     if (newState.ThumbSticks.Right.X >= 0) 
      return 0; 
     else 
      return System.Math.Abs(newState.ThumbSticks.Right.X); 
    } 

    //Magnitude of right stick in upward direction 
    public float RightStickUp() 
    { 
     if (newState.ThumbSticks.Right.Y >= 0) 
      return 0; 
     else 
      return System.Math.Abs(newState.ThumbSticks.Right.Y); 
    } 

    //Magnitude or right stick in downward direction 
    public float RightStickDown() 
    { 
     if (newState.ThumbSticks.Right.Y <= 0) 
      return 0; 
     else 
      return newState.ThumbSticks.Right.Y; 
    } 


    //Left 

    //Magnitude of left stick in right direction 
    public float LeftStickRight() 
    { 
     if (newState.ThumbSticks.Left.X <= 0) 
      return 0; 
     else 
      return newState.ThumbSticks.Left.X; 
    } 

    //Magnitude of left stick in left direction 
    public float LeftStickLeft() 
    { 
     if (newState.ThumbSticks.Left.X >= 0) 
      return 0; 
     else 
      return System.Math.Abs(newState.ThumbSticks.Left.X); 
    } 

    //Magnitude of left stick in upward direction 
    public float LeftStickUp() 
    { 
     if (newState.ThumbSticks.Left.Y >= 0) 
      return 0; 
     else 
      return System.Math.Abs(newState.ThumbSticks.Left.Y); 
    } 

    //Magnitude or right stick in downward direction 
    public float LeftStickDown() 
    { 
     if (newState.ThumbSticks.Left.Y <= 0) 
      return 0; 
     else 
      return newState.ThumbSticks.Left.Y; 
    } 

    #endregion 

    public bool RightStickCentered() 
    { 
     if (newState.ThumbSticks.Right.X.Equals(0) && newState.ThumbSticks.Right.Y.Equals(0)) 
     { 
      return true; 
     } 
     return false; 
    } 

    public bool LeftStickCentered() 
    { 
     if (newState.ThumbSticks.Left.X.Equals(0) && newState.ThumbSticks.Left.Y.Equals(0)) 
     { 
      return true; 
     } 
     return false; 
    } 

    public Vector2 RightStick() 
    { 
     return this.newState.ThumbSticks.Right; 
    } 

    public Vector2 LeftStick() 
    { 
     return this.newState.ThumbSticks.Left; 
    } 

    public bool LeftStickMoved() 
    { 
     if (!oldState.ThumbSticks.Left.X.Equals(newState.ThumbSticks.Left.X) || !oldState.ThumbSticks.Left.Y.Equals(newState.ThumbSticks.Left.Y)) 
     { 
      return true; 
     } 

     return false; 
    } 

    public bool RightStickMoved() 
    { 
     if (!oldState.ThumbSticks.Right.X.Equals(newState.ThumbSticks.Right.X) || !oldState.ThumbSticks.Right.Y.Equals(newState.ThumbSticks.Right.Y)) 
     { 
      return true; 
     } 

     return false; 
    } 
} 
} 

만들기 관리자 변경하기 위해 노력하고있어 여기서

this.controller1Manager = new ControllerManager(this, PlayerIndex.One); 
Components.Add(controller1Manager); 
IServiceContainer.AddService(typeof(ControllerManager), controller1Manager); 

this.controller2Manager = new ControllerManager(this, PlayerIndex.Two); 
Components.Add(controller2Manager); 
IServiceContainer.AddService(typeof(ControllerManager), controller2Manager); 

변경 값 :

if (this.index.Equals(PlayerIndex.One)) 
    { 
     this.localManager = Controller1Manager; 
    } 
else if (this.index.Equals(PlayerIndex.Two)) 
    { 
     this.localManager = Controller2Manager; 
     Controller2Manager.player = index; 
    } 
+1

'Controller1Manager'는 이전에'ControllerManager'에 할당되지 않았습니까? – BradleyDotNET

+0

게시 한 코드가 처리 되었습니까? 전체 코드를 게시하는 것이 좋습니다. – LPs

+0

ControllerManager가 인스턴스화 되 자마자 할당 된 것 같습니다. 다음을 사용 : this.controller1Manager = new ControllerManager (this, PlayerIndex.One); System.Console.WriteLine (""+ controller1Manager가 할당되었습니다.); GDLibrary.ControllerManager – pipding

답변

0

이 문제는 ControllerManager를 PlayerIndex 대신 PlayerObject. 모든 controllerManagers가 한 번에 변수를 변경 한 것처럼 보이는 이유는 위 편집 내용에 표시된 IServiceContainer에 포함 되었기 때문입니다. IServiceContainer는 주어진 형식의 한 인스턴스 (사전 임) 만 저장하므로 가장 최근의 추가 내용 만 저장됩니다.

관련 문제