1. 순서
액션 시퀀스. 동작 순서 파라미터, 동작 길이의 각각의 동작의 전체 기간에서 수행되는 경우.
1.1 멤버 변수
* _Actions FiniteTimeAction [ 2 ] 플로트 _split 시퀀스의 작용의 비율 // 처음 의 INT _last;
1.2 방법을 만들
네 종류 :
createWithTwoActions (FiniteTimeAction * actionOne, FiniteTimeAction * 이 개 행동에 actionTwo는) // 생성 만들기 (FiniteTimeAction는 * 조치 1, ...) // 행동을 많이 만들고, 다음과 같은 메소드 호출 createWithVariableList (FiniteTimeAction * 조치 1,의 va_list 인수) (작성을 CONST 벡터 <FiniteTimeAction *> 및 arrayOfActions) // 벡터 파라미터로 동작을 저장 용기
createWithTwoActions :
시간의 순서로 initWithTwoActions 방법, 행동의 시간이 전화를 걸어와이 개 조치를 유지 ().
createWithVariableList :
통화 createWithTwoActions있어서, 상기 제 파라미터 번째 파라미터가 저장된 가변 길이 파라미터 액션의 va_list의 인수 인, 동작 파라미터 조치이다. 경우 단지 하나의 액션은, 두번째 파라미터 createWithTwoActions ExtraAction이다.
순서 * 순서 : createWithVariableList (FiniteTimeAction의 *의 조치 1,의 va_list 인수) { FiniteTimeAction * 지금; FiniteTimeAction * = 이전 조치 1; 부울 bOneAction = 사실에게 ; 반면 (조치 1) { 지금 = va_arg를 (인수, FiniteTimeAction * ); 경우 (현재) { 이전 = createWithTwoActions (PREV, 지금); bOneAction = 거짓 ; } 다른 { //단 하나의 액션 시퀀스에 추가되면, 가장 간단한 유한 한 시간에 작업을 추가하여 시퀀스를 구성합니다. 경우 (bOneAction)를 { 이전 = createWithTwoActions (PREV가 ExtraAction가 생성 :: ()); } 휴식 ; } } 반환 ((순서 * ) 이전); }
몹시 떠들어 대다:
재귀 적 순서를 만들 init 메소드를 호출, 벡터 저장 작업을 사용합니다.
S1 = A1 + A2 + A3 = S2 S3 S1 = S2 + S4 A4 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 갱신
즉, 업데이트는 첫째, 어떤 조치를 결정하는이 진보의 조치를 계산하기 위해 현재의 진행에 의해 수행된다. 이 두 번째 조치의 최초 구현 한 경우에, 우리는 먼저 첫 번째 작업 업데이트의 구현을 완료해야합니다. 다음으로, 작업 업데이트의 실행은 다음 프레임의 실행, 판사의 실행 후 첨자를 저장합니다.
시퀀스 실행 및 업데이트 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; // 제 작업 스케줄 산출 (12)은 다른 13 new_t = 1이다. ] // 첫번째 작업의 시간을 0으로 첫번째 작업의 완료 설정된 14 15 } 16 다른을 // 두 번째 실행 두 동작 . 17 { 18이다 // 액션 [1.] (19). = 발견 1. ; // 인덱스 변경 20되는 경우 (_split == 1. ) // 번째 0, 액션 (21)은 new_t = 1이다. ] // 제 완료 액션 (22) 다른 23은 / new_t = (T-_split) ( 1. - _split) // 제 작업 스케줄 계산할 24 } 25 26되는 경우 (== 발견을 . 1 ) // 제 동작 실행 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 ) // 최종 갱신이 제 업데이트 실행은 상기 제 1 명령의 완료 수행하는 첫 번째 작업을 수행한다 (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 것은 // 역 MODE? 47 // FIXME :.이 경우는 _last 않는 경우 == 버그를 고민하지 -. 1 = 0, "후진 모드"에서 발견 (48) // (가) IT 유언장을 필요로하기 때문에 운영을 해킹 역의 모드인지 아닌지 액션 알고. 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 }