적인 Cocos2D-X의 연구 노트 (11.6) 순서

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 }

추천

출처www.cnblogs.com/deepcho/p/cocos2dx-action-sequence.html