//* -----------------------------------------------------------------------* /// <summary>1フレーム分の更新処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void update(CXNAInput <_T> entity, CXNAInput <_T> .CPrivateMembers privateMembers, GameTime gameTime) { privateMembers.prevState = privateMembers.nowState; privateMembers.nowState = getState(); privateMembers.aiForce.update(gameTime); }
//* ────────────-_______________________* //* constructor & destructor ───────────────────────* //* -----------------------------------------------------------------------* /// <summary>コンストラクタ。</summary> /// /// <param name="stateList">状態のコレクション。</param> public CXBOX360InputCollection(IList stateList) { int length = stateList.Count; CXNAInput <_T>[] array = new CXNAInput <_T> [length]; for (int i = length; --i >= 0;) { array[i] = new CXNAInput <_T>((IState)stateList[i]); } inputList = new List <CXNAInput <_T> >(array).AsReadOnly(); }
//* -----------------------------------------------------------------------* /// <summary>1フレーム分の更新処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void update( CEntity entity, CXNAInput <_T> privateMembers, GameTime gameTime) { int counter = entity.counter; GamePad.SetVibration(privateMembers.playerIndex, privateMembers.force.strengthL.smooth(counter, privateMembers.force.durationL), privateMembers.force.strengthS.smooth(counter, privateMembers.force.durationS)); if (counter > privateMembers.force.duration) { entity.nextState = CState.empty; } }
//* -----------------------------------------------------------------------* /// <summary>ボタン入力を検出します。</summary> /// <remarks> /// 注意: このメソッドを呼び出すと、自動的に登録されているクラスに対して /// <c>update()</c>が実行されます。レガシ ゲームパッドが高位入力管理クラスにて /// アクティブの状態でこのメソッドを呼び出すと、高位入力側の判定が /// 1フレーム分欠落します。 /// </remarks> /// /// <param name="gameTime">前フレームが開始してからの経過時間。</param> /// <returns> /// ボタン入力が検出されたデバイスの管理クラス。検出しなかった場合、<c>null</c>。 /// </returns> public CXNAInput <_T> detectInput(GameTime gameTime) { CXNAInput <_T> result = null; for (int i = inputList.Count; --i >= 0 && result == null;) { CXNAInput <_T> input = inputList[i]; input.update(gameTime); if (isInput(input.nowInputState, input.prevInputState)) { result = input; } } return(result); }
//* -----------------------------------------------------------------------* /// <summary>1フレーム分の描画処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void draw(CEntity entity, CXNAInput <_T> privateMembers, GameTime gameTime) { }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// <para>状態が開始された時に呼び出されます。</para> /// <para>このメソッドは、遷移元の<c>teardown</c>よりも後に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を適用されたオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> public override void setup(CEntity entity, CXNAInput <_T> privateMembers) { entity.resetCounter(); }
//* -----------------------------------------------------------------------* /// <summary> /// <para>オブジェクトが別の状態へ移行する時に呼び出されます。</para> /// <para>このメソッドは、遷移先の<c>setup</c>よりも先に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を終了したオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="nextState">オブジェクトが次に適用する状態。</param> public override void teardown( CEntity entity, CXNAInput <_T> privateMembers, IState nextState) { GamePad.SetVibration(privateMembers.playerIndex, 0, 0); }
//* -----------------------------------------------------------------------* /// <summary> /// <para>オブジェクトが別の状態へ移行する時に呼び出されます。</para> /// <para>このメソッドは、遷移先の<c>setup</c>よりも先に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を終了したオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="nextState">オブジェクトが次に適用する状態。</param> public override void teardown( CXNAInput <_T> entity, CXNAInput <_T> .CPrivateMembers privateMembers, IState nextState) { // 入力されたデータだけは破棄する privateMembers.Dispose(); }
//* -----------------------------------------------------------------------* /// <summary>1フレーム分の描画処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void draw(CXNAInput <_T> entity, CXNAInput <_T> .CPrivateMembers privateMembers, GameTime gameTime) { }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary> /// <para>状態が開始された時に呼び出されます。</para> /// <para>このメソッドは、遷移元の<c>teardown</c>よりも後に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を適用されたオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> public override void setup( CXNAInput <_T> entity, CXNAInput <_T> .CPrivateMembers privateMembers) { }
//* -----------------------------------------------------------------------* /// <summary> /// <para>状態が開始された時に呼び出されます。</para> /// <para>このメソッドは、遷移元の<c>teardown</c>よりも後に呼び出されます。</para> /// </summary> /// /// <param name="entity">この状態を適用されたオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> public override void setup( CXNAInput <GamePadState> entity, CXNAInput <GamePadState> .CPrivateMembers privateMembers) { privateMembers.playerIndex = playerIndex; base.setup(entity, privateMembers); }