연구적인 Cocos2D-X (3.2) TransitionScene 과도 장면과 장면 전환 노트

1. 소개

전환 장면 TransitionScene 장면 장면에 직접 후계자. 윈도우가 갑자기 다음 프레임에서 다른 장면을 보여주는 것이 아니라, 장면 전환 과정에서 "전환"효과를 얻기 위해.

2. 생성

생성자 :

TransitionScene :: TransitionScene () 
: _inScene (nullptr) 
, _outScene (nullptr) 
, _duration ( 0.0f로 ) 
, _isInSceneOnTop ( 거짓 ) 
, _isSendCleanupToScene ( 거짓 ) 
{ 
}

플로트 t, 장면 * 장면 : 만드는 방법은 두 가지 매개 변수가 있습니다. 이 두 가지 매개 변수를 전달 initWithDuration를 호출합니다.

매개 변수 장면은 비워 둘 수 없습니다.

파라미터 장면 같은 파라미터 _duration 시간 t, _inScene 멤버 변수로서 1 멤버 변수. 전환 시나리오는 인수 장면을 의미 장면 매개 변수를 유지합니다.

2. 이사의 실행은 getRunningScene 장면은 현재 _outScene으로 수행되고있다.

현재 실행되는 시나리오가 비어있는 경우 3., 장면 호출된다 : 생성 ()? 빈 장면, _outScene 비어 장면을 만듭니다.

장면 지점이 참조 4. _outScene는 _outScene는 유지 수행.

5. sceneOrder ()를 수행하고, 도면의 inScene outScene 순서를 결정한다. 상기 방법은 서브 클래스에 의해 무시되지만 부재 변수 설정 값 _isInSceneOnTop 참 / 거짓 될 수있다.

3. onEnter

각 장면의 입구 창에서 시나리오의 실행 방법 onEnter.

TransitionScene 서브 클래스는 onEnter 방법, 첫째 onEnter의 부모 클래스 TransitionScene를 호출 몸 후 다시 작성하는 방법을 우선합니다.

1. 전화 첫 번째 방법 onEnter 부모 클래스의 장면이 방법은 onEnter 장면 부모 클래스 노드가 실제로 실행된다.

2. 이벤트 디스패처 실행의 감독은 이벤트 디스패처 작업을 중지하려면 (거짓)는, setEnabled.

3. _outScene-> onExitTransitionDidStart () 시나리오 실행 onExitTransitionDidStart를 종료합니다.

4. _inScene->는 onEnter 장면 () 실행 onEnter 것으로 보인다.

즉, 전환의 시작에서 종료 할 준비가 종료 나타 나타나기 시작했다.

4.의 OnExit ()

장면마다 창을 종료 실행 장면의 OnExit 방법.

1. 통화 부모 클래스의 장면이 첫 번째 방법을의 OnExit, 방법의 OnExit 장면 부모 클래스 노드가 실제로 실행된다.

2. 이벤트 디스패처 실행의 이사는, setEnabled (참), 이벤트 발송자가 이벤트를 배포 할 수 있습니다.

3. _outScene->의 OnExit은 (); 완전히 시나리오 실행의 OnExit를 종료합니다.

4. _inScene-> 장면 onEnterTransitionDidFinish () 실행 onEnterTransitionDidFinish 것으로 보인다.

즉, 전환의 끝에서 완성을 체결, 출구의 완성에서 철수합니다. 이 시점에서, 단지 윈도우는 우리가 설정 한 장면을 입력합니다.

5. 연신 (...)

장면 전환을 렌더링의 소스 방법 :

보이드 TransitionScene :: 연신 (렌더러 * 렌더러 CONST Mat4 및 변환 uint32_t 플래그) 
{ 
    장면 :: 연신 (렌더러 변환 플래그); 

    경우 (_isInSceneOnTop) { 
        _outScene -> 방문 (렌더러, 플래그를 변환); 
        _inScene -> 방문 (렌더러, 플래그를 변환); 
    } 다른 { 
        _inScene -> 방문 (렌더러는, 플래그를 변환); 
        _outScene -> 방문 (렌더러, 플래그를 변환); 
    } 
}

알 수있는 바와 같이, 도면 및 도면은 순서 inScene outScene _isInSceneOnTop 결정 방법.

기본 생성자 거짓. 작성 방법 sceneOrder () 설정을 호출합니다. 서브 클래스는 입력 및 장면 렌더링하기 위해 다른 서브 클래스 TransitionScene를 종료하려면 다른 시나리오를 달성하기 위해 sceneOrder 방법을 대체 할 수 있습니다.

类 TransitionJumpZoom 子 (6)

TransitionScene 모든 변화 시나리오에 대한 부모 클래스이며, 각각의 종자 유형은 다른 전환 효과 장면의 일종이다.

학습을위한 하위 카테고리 TransitionJumpZoom 예.

장면 전환 생성자와 소멸자는 두 가지 방법을 제거했습니다. 상기 방법에 설명 된 장면 전환 방법 onEnter 재기록은 논리 전환 효과를 포함한다.

- TransitionJumpZoom :: onEnter ()

1. 먼저 부모 TransitionScene을 실행 :: onEnter을 (). 종료 할 outScene (runningScene)를 준비합시다.

전환시 2. inScene 및 outScene 초기 속성을 시작했다.

    _inScene-> 인 setScale ( 0.5F ); 
    _inScene ->로 setPosition (s.width, 0 ); 
    _inScene -> setAnchorPoint (VEC2 ( 0.5F , 0.5F )); 
    _outScene -> setAnchorPoint (VEC2 ( 0.5F , 0.5F ));

3. 세 가지 움직임을 만듭니다. 점프와 줌이 있습니다

    ActionInterval * 점프 :: = JumpBy 생성 (_duration / 4 , VEC2 (-s.width, 0 ), s.width / 4 , 2 ); 
    ActionInterval * = scaleIn이 scaleTo :: 생성 (_duration / 4 , 1.0F ); 
    ActionInterval * = scaleOut이 scaleTo :: 생성 (_duration / 4 , 0.5F );

4. 두 개의 큐 작업을 만듭니다.

    자동 jumpZoomOut = 순서 : 생성 (scaleOut, 점프, nullptr); 
    자동 jumpZoomIn = 순서 : 생성 (점프, scaleIn, nullptr);

두 시나리오 runAction.

    ActionInterval * 지연 = DelayTime :: 생성 (_duration / 2 ); 

    _outScene -> runAction (jumpZoomOut); 
    _inScene -> runAction 
    ( 
        순서 : 생성 
        ( 
            지연, 
            jumpZoomIn는, 
            CallFunc는 :: (CC_CALLBACK_0 (TransitionScene :: 마무리를 작성, )), 
            nullptr 
        ) 
    );

일련의 작업이 끝나기 전에 부모 클래스 TransitionScene :: 마무리의 실행 장면을 입력합니다.

- TransitionScene 마무리

간단히, 속성 inScene 및 outScene의 집합. 따라서 화면 창, 전이의 구현 효과 두 장면 inScene 보이는 outScene 보이지, 위치 완료되면, 줌은 기본값으로 설정되어 회전한다.

이 속성을 설정 한 후, 실행 :

     -> 일정 (CC_SCHEDULE_SELECTOR (TransitionScene :: setNewScene), 0 );

성명은 다음 프레임이 콜백 함수 파라미터 setNewScene을 수행 할 필요가 있음을 나타내는 타이머 0의 시간 간격을 만들었다.

- TransitionScene setNewScene

1. 제 1 타이머는 이전 프레임 스케줄 해제.

TransitionScene 재산 _isSendCleanupToScene 할당 2. 이사 속성 _sendCleanupToScene.

3. replaceScene의 전무 이사 (_inScene)하는 nextScene 이사로 inScene.

4. 마지막으로 볼 수 outScene.

7. 장면 전환을 실행하는 과정

여기서, replaceScene에 예를 들어.

예, 우리는 replaceScene 기능을 트리거링, 매개 변수는 전환 장면, 메뉴 항목을 클릭합니다.

전환 장면 onEnter에 시작 ()

GLView 1.이 프레임은 콜백 함수를 트리거, 터치 이벤트 (메뉴 항목에 마우스 클릭)를 수신, 콜백 함수는 새로운 장면과 장면 전환을 생성, inScene 전이 장면은 새로운 장면에 대한 매개 변수의 replaceScene 전무 이사입니다.

2. replaceScene 지역 : 진정한 홈 이사 _sendCleanupToScene, 새로운 장면 스택, 새로운 장면 nextScene된다. nextScene는 NULL로했다.

3. 프레임의 끝. 다음 프레임으로 이동합니다.

다음 프레임이 스케줄러 업데이트 nextScene 존재하도록 결정된 후 4. setNextScene 방법을 수행 하였다.

5. setNextScene :

무효 이사 : setNextScene () 
{ 
    _eventDispatcher -> 는, dispatchEvent (_beforeSetNextScene); 

    불리언 ! = runningIsTransition dynamic_cast는 <TransitionScene *> (_ runningScene) = nullptr; // 거짓 
    부울 newIsTransition = dynamic_cast는 <TransitionScene *> (_ nextScene) = nullptr! // 진정한 

     경우 (newIsTransition!) // 新场景是过渡场景,不执行
     {
          경우 (_runningScene) 
         { 
             _runningScene -> onExitTransitionDidStart (); 
             _runningScene -> 의 OnExit (); 
         } 
 
         //# 709을 실행합니다. 루트 노드 (장면)도 정리 메시지가 나타납니다
          // 그렇지 않으면 유출 될 수 있습니다. 
         경우 (_sendCleanupToScene && _runningScene) 
         { 
             _runningScene -> 정리 (); 
         } 
     } 

    경우 (_runningScene) 
    { 
        _runningScene -> 릴리스 (); 
    } 
    _runningScene = _nextScene; 
    _nextScene -> ) (유지; 
    _nextScene = nullptr; // nextScene至此成为了runningScene 

    경우 ((! runningIsTransition) && _runningScene)// runningscene 거짓되면 실행 
    { 
        _runningScene ->를 onEnter (); // onEnter 장면 전환 
        _runningScene-> onEnterTransitionDidFinish (); 
    } 
    
    _eventDispatcher -> 에 dispatchEvent (_afterSetNextScene) 
}

6. 전환 시나리오를 onEnter 수행

  1. 노드 onEnter을 수행합니다.

  2. 장면 onEnter를 입력, 장면 onExitTransitionDidStart에서 철수 TransitionScene onEnter,하는 EventDispatcher 장애인의 감독을 수행합니다.

  3. 각각 액션 시퀀스 inScene 및 outScene을 만듭니다. 각각 runAction.

의 OnExit로의 전환 장면의 끝 ()

1. 장면 전환은 모션 시퀀스의 마지막 액션 장면은 새로운 콜백 동작 CallFunc이다 setNewScene 스케줄러 방법을 호출함으로써 다음 프레임에서 속성을 설정 한 후, TransitionScene 마무리 ()를 호출한다.

2. setNewScene : replaceScene (inScene)는 새로운 장면에 nextScene 포인트를 달성했다. 이 시점에서, runningScene 전이 장면.

3. 다음 프레임은 다음 전무 이사의 setNextScene 것이 runningScene 및 nextScene, runningScene 전환 시나리오 실행 onExitTransitionDidStart의 OnExit 때문이다.

불리언 ! = runningIsTransition dynamic_cast는 <TransitionScene *> (_ runningScene) = nullptr; // 
    부울 ! = newIsTransition dynamic_cast는 <TransitionScene *> (_ nextScene) = nullptr; // 잘못된 

     경우 (newIsTransition!) // 执行
     {
          경우 (_runningScene) // 过渡场景의 OnExit 
         { 
             _runningScene -> onExitTransitionDidStart (); 
             _runningScene -> 의 OnExit (); 
         } 
 
         경우 (_sendCleanupToScene && _runningScene) 
         { 
             _runningScene ->대청소(); 
         } 
     } 
 // ...

의 OnExit 전환 장면은, 모든 권한을 onEnterTransitionDidFinish 실행 표시 완전히 장면에서 장면 실행의 OnExit에서 철수합니다. 한편,하는 EventDispatcher의 이사 수 있었다.

대청소()

setNextScene이 _sendCleanupToScene 때 replaceScene, 전환 시나리오 실행 TransitionScene 정리 () true로 설정을 계속합니다.

    장면 :: 정리 ();
    경우 (_isSendCleanupToScene) 
        _outScene -> 정리 ();

호출 노드 정리 (). 감독 _sendCleanupToScene 설정 _isSendCleanupToScene, 당신이) (현장 정리를 종료 할 것인지, 사실이다.

_sendCleanupToScene

사실 감독 replaceScene로 설정하면, 감독 pushScene는 true로 설정 거짓, 이사 popScene로 설정합니다.

이 때 이사 setNextScene, runningScene 정리 (감독), 사실, 다음 nextScene runningScene의 대안입니다.

만약 자신의 정리뿐만 아니라이 시간 runnningScene 장면, 정리 (전환 장면)의 변화뿐만 아니라 당신이 _isSendCleanupToScene 판단에 의해 현장 정리를 종료 할 것인지 여부.

_isSendCleanupToScene는 전이 액션 장면, 감독 _sendCleanupToScene 직접 할당의 끝입니다.

그래서, replaceScene 매개 변수로 장면 전환과 감독, 전환이 현장에서 철수하고 장면이 정리 될 때.

추천

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