//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary>1フレーム分の更新処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void update( CInputXBOX360 entity, CInputXBOX360.CPrivateMembers privateMembers, GameTime gameTime) { GamePadState state = GamePad.GetState(entity.playerIndex); if (state.IsConnected) { for (int i = entity.assignList.Count; --i >= 0;) { Buttons button = entity.assignList[i]; SInputState inputState = privateMembers.buttonStateList[i]; if (button.isAvailableAnalogInput()) { inputState.refresh(state.getInputState(button)); } else { inputState.refresh(state.IsButtonDown(button)); } privateMembers.buttonStateList[i] = inputState; } refleshAxis(state, entity, privateMembers, gameTime); } else { entity.Dispose(); } base.update(entity, privateMembers, gameTime); }
//* -----------------------------------------------------------------------* /// <summary>1フレーム分の更新処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void update( CInputLegacy entity, CInputLegacy.CPrivateMembers privateMembers, GameTime gameTime) { JoystickState state = privateMembers.poll(); byte[] buttons = state.GetButtons(); int totalButtons = buttons.Length; for (int i = entity.assignList.Count; --i >= 0;) { short sButtonID = entity.assignList[i]; SInputState inputState = privateMembers.buttonStateList[i]; if (sButtonID < 0) { inputState.refresh(state.getInputState(sButtonID, INPUTRANGE)); } else if (sButtonID < totalButtons) { inputState.refresh(buttons[sButtonID] != 0); } privateMembers.buttonStateList[i] = inputState; } refleshAxis(state, entity, privateMembers, gameTime); base.update(entity, privateMembers, gameTime); }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary>1フレーム分の更新処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void update( CInputKeyboard entity, CInputKeyboard.CPrivateMembers privateMembers, GameTime gameTime ) { KeyboardState state = Keyboard.GetState(); IList <Keys> assignList = entity.assignList; for (int i = assignList.Count; --i >= 0;) { SInputState inputState = privateMembers.buttonStateList[i]; inputState.refresh(state.IsKeyDown(assignList[i])); privateMembers.buttonStateList[i] = inputState; } for (int i = entity.dirInputState.Length; --i >= 0;) { entity.dirInputState[i].refresh(state.IsKeyDown(entity.directionAssignList[i])); } EDirectionFlags axisFlags; Vector2 axisVector; CHelper.createVector(entity.dirInputState, out axisVector, out axisFlags); privateMembers.axisVector = axisVector; privateMembers.axisFlag = axisFlags; base.update(entity, privateMembers, gameTime); }
//* -----------------------------------------------------------------------* /// <summary>1フレーム分の更新処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void update(CInputCollection entity, CInputCollection.CPrivateMembers privateMembers, GameTime gameTime) { int nLength = privateMembers.buttonStateList.Count; // HACK : GC対策をする bool[] buttonFlagBuffer = new bool[nLength]; SDirArray dirFlagBuffer = new SDirArray(); privateMembers.axisFlag = EDirectionFlags.None; privateMembers.axisVector = Vector2.Zero; foreach (CInput input in privateMembers.childs) { // 毎回isConnectするのは大変な気がするが……。 if (!entity.releaseAwayController || input.connect) { input.update(gameTime); for (int i = nLength; --i >= 0;) { buttonFlagBuffer[i] = buttonFlagBuffer[i] || input.buttonStateList[i].press; } for (int i = 4; --i >= 0;) { dirFlagBuffer[i] = MathHelper.Max(dirFlagBuffer[i], input.dirInputState[i].analogValue); } Vector2 axis = entity.axisVector; float axisLength = axis.Length(); axis += input.axisVector; if (axis != Vector2.Zero) { axis.Normalize(); } axis *= MathHelper.Max(axisLength, input.axisVector.Length()); privateMembers.axisVector = axis; privateMembers.axisFlag |= input.axisFlag; } else { input.Dispose(); } } for (int i = nLength; --i >= 0;) { SInputState inputState = privateMembers.buttonStateList[i]; inputState.refresh(buttonFlagBuffer[i]); privateMembers.buttonStateList[i] = inputState; } for (int i = 4; --i >= 0;) { entity.dirInputState[i].refresh(dirFlagBuffer[i]); } base.update(entity, privateMembers, gameTime); }