1.シーケンス
アクションシーン。動作は、秩序パラメータ、動作のそれぞれの動作の合計時間と長いで行う場合。
1.1メンバ変数
* _Actions FiniteTimeAction [ 2 ]; フロート_split、シーケンスの作用の割合で//初めて のint _last。
1.2メソッドを作成します
四種類:
createWithTwoActions(FiniteTimeAction * actionOne、FiniteTimeAction * 2つのアクション//が作成したとactionTwo) を作成します(FiniteTimeAction * アクション1、...)//多くのアクションを作成し、次のメソッドの呼び出し createWithVariableListを(FiniteTimeAction * アクション1、va_listの引数) (作成ポーラベクトル<FiniteTimeAction *>&arrayOfActions) //ベクトルのパラメータとしてアクションを格納するためのコンテナ
createWithTwoActions:
)(保持initWithTwoActions法、継続時間のシーケンスとして作用し、両者の時間、および2つのアクションを呼び出します。
createWithVariableList:
コールcreateWithTwoActions方法は、最初のパラメータは、2番目のパラメータが格納された可変長パラメータアクションたva_list引数で、アクションパラメータアクションです。1つの動作だけ、2番目のパラメータはcreateWithTwoActions ExtraActionあるとき。
配列*配列:: createWithVariableList(FiniteTimeAction * アクション1、va_listの引数) { FiniteTimeAction * 今。 FiniteTimeAction * PREV = アクション1; BOOL bOneAction = 真; 一方、(アクション1) { 今 =のva_arg(引数、FiniteTimeAction * )。 もし(現在) { PREV = createWithTwoActions(PREV、今)。 bOneAction = 偽; } 他 { //1つの動作だけがシーケンスに追加されている場合は、最も簡単な有限時間アクションを追加することにより、シーケンスを構成しています。 もし(bOneAction) { PREV = createWithTwoActions(PREV、ExtraAction ::(作成))。 } ブレーク; } } リターン((シーケンス* )PREV)。 }
作成します。
再帰的シーケンスを作成するために、initメソッドを呼び出すと、ベクトル記憶アクションを使用します。
S1 = A1 + A2 S2 = A3 + S1〜S3 = A4 + S2、S4 = A5 + S3 ...最終的に得られた配列は、アクションの組み合わせとシーケンスです。
1.3ターゲットで始まります
runAction関数を呼び出すとき。
もし(_duration> FLT_EPSILON) _split = _actions [ 0 ] - > getDuration()> FLT_EPSILON?_actions [ 0 ] - > getDuration()/ _duration:0。
ActionInterval :: startWithTarget(ターゲット)。
_last = -1。
_durationと精度値FLT_EPSILON超える作用持続時間、第一の設定時間と総時間系列の作用は、第1動作シーケンスの時間の割合を表す、市販_splitあります。
_last動作指数が行われた場合、更新、0又は1、-1まだ更新の最後のシーケンス。
1.4アップデート
要するに、更新は、まず、どのようなアクションを決定し、この進歩の作用を計算するために現在の進行によって実行されます。これは2番目のアクションの最初の実装であるならば、我々は最初の最初のアクションのアップデートの実装を完了する必要があります。次に、アクションのアップデートの実行は、次のフレームの実行、裁判官の実行後に添字を保存します。
シーケンスの実行と、その中にネストされた更新startWithTargetシーケンス再帰。再帰終了条件が検出された== _last && _actions [見出さ] - > isDone()、完了最後のアクションの実行があります。
1回の 空隙シーケンス::更新(フロートT) 2 { 3 intは見出さ= 0 ; // この動作指数 。4 フロート new_t = は0.0f ; // 現在の行動予定 。5 。6 IF(T <_split)// 最初の実行動作 7。 { 8。 // アクション[0] 9。 =見出さ0 ; //は添字変更 10を IF(!_splitは= 0)// 最初のアクションの時間は0に設定されていない 11。 T = new_t / _split; // 第1行動スケジュール計算 12は 他 13である new_t = 1 ; // 最初のアクションの時間は、0に最初のアクションの完了設定されている 14 15 } 16 他を // 第二の実行2アクション 17。 { 18は // アクション[1] 19 =見出さ1。 ; // インデックス変更 20である IF(_split == 1)// 二度目0、アクション 21である new_t = 1 ; // 秒を完了アクション 22 他 23は (/(T-_split)= new_t 。1 - _split); // 第2動作計画を計算する 24 } 25 26れる IF(==見出さ1。 )// 2番目のアクションの実行 27 { 28 IF(== _lastを- 1)// 最後の更新アクションを実行するために失敗した場合 29 { 30 // 。アクション[0]スキップは、ITの実行WAS 31は _actionsが[ 0 ] - > startWithTarget(_target); // 最初のアクションを初期化 32 IF(!(sendUpdateEventToScript(1.0F、_Actions [ 0 ]))) 33である [_actions 0 >更新( - ] 1.0F); // 直接最初のアクションが完了する 34である [_actions 0 ] - > STOP(); 35 } 36 他 IF(_lastの== 0)// 最後の更新は、この第2の更新の実行は、最初の命令の完了行う最初のアクションを実行している 37 [ { 38れる // 0の1アクションアクションSTOPへの切り替え 39 IF((!(sendUpdateEventToScriptを1.0 F、_actions [ 0 ]))) 40 _actions [0 ] - >更新(1.0F); //は完了の最初の実装する 41である _actions [ 0 ] - > STOP(); 42である } 43である } 44が 他 IF(見出さ== 0 && _last == 1)// 基本発生していない 45 { 46である // ?リバースモード 47 // FIXME :.この場合は== _lastない場合バグを企図しない- 。1、= 0発見し、「リバースモード」で 48 // れるITを必要とするので操作ハックはリバースON MODE ISかどうかを知るためのアクション。 49 //「ステップ」上書きされなければならない、および内側の配列に伝播「reverseMode」値。 50 であれば((sendUpdateEventToScript(!0、_actions [ 1 ]))) 51 _actions [ 1 ] - >更新(0 )。 52 _actions [ 1 ] - > 停止(); 53 } 54 // 最後のアクションが見つかりました。そして、それが行われています。 55 であれば(== _last && _actions見出さ[見出さ] - > isDone()) 56 { 57 リターン。 58 } 59 60 もし(!= _last実測値)// 通常、新しいアクション実行 61であるが 、{ 62である _actions [見出さ] - > startWithTarget(_target); // 新しい初期化動作 63である } 64 IF!((SendUpdateEventToScript(new_t、_actions [見出さ])) ) 65 _actions [見出さ] - >更新(new_t); //を行う 66 _last =見つかりました; // 添え字を記録するアクションが行わ 67 }