연구적인 Cocos2D-X (3.1) 장면 장면과 장면 컷 노트

소개 1. 장면

우리가 / 볼 게임은 모든 요소가 장면 장면에 표시되는 표시되지 않습니다.

우리는 판지를 포함하지 않은 땅에 장면을 비교할 수 있습니다, 레이어 레이어 쌓여 판지 상자 유리, 스프라이트 우리는이 장면을 볼 수있는 상자에서 내려다 볼 수 있도록 유리 레이어에 그려진 다른 요소입니다. 때 장면 컷, 다른 상자로 전환.

요약하면, N 장면, 장면 관리 N 레이어, 레이어 관리 등의 전무 이사 N 작은 요소, 등등 N 액션 타이머와 각 스프라이트 스프라이트.

장면 장면을 직접 노드를 물려 받았다.

2. 장면 类

앵커 기본 생성자 (0.5, 0.5). 주요 방법은 방법을 생성하는 것이다.

전화, 인수 화면 크기를 초기화하기, 새로운 방법의 장면을 만들고 init 메소드를 호출 initWithSize을 실행 장면 크기를 설정 setContentSize.

createWithSize 방법 공감.

우리는 사용자 정의 장면에서 상속 장면 장면을 사용자 정의 우리 자신의 장면을 달성하기 위해 init 메소드와 onEnter의 OnExit 및 다른 방법을 대체 할 수 있습니다.

3. 이사 与 장면

이사 장면, 실행 장면을 관리하고 전환을 달성 할 수있다.

두 가지 시나리오 이사 포인터 변수가 있습니다.

    장면 * _runningScene; 
    장면 * _nextScene;

runningScene 인 장면 앞에 있습니다. nextScene가있는 경우, 다음 프레임에있을 것입니다 것은 runningScene 장면이 될 수 있습니다.

    벡터 <장면 *> _scenesStack;

장면 포인터가 컨테이너를 scenesStack Vector 클래스 이사에 저장, 스택에 저장된 이름에서 알 수 있습니다.

  부울 _sendCleanupToScene;
  불리언 isSendCleanupToScene는 () { 반환 _sendCleanupToScene 단계; }

부울 변수 sendCleanupToScene은 교체 현장 정리가 정보를 수신 여부를 결정합니다. 새로운 장면이 교체되면 이전 현장 정리는 정보를 수신, 새로운 장면 이전 장면이 정리되지 않습니다 밀어입니다.

현장 관련 방법에 감독 :

    무효 runWithScene (장면 * 장면)
    무효 pushScene (장면 * 장면)
    무효 ) (popScene 단계;
    무효 ) (popToRootScene 단계;
    무효화 popToSceneStackLevel ( INT의 레벨);
    무효 replaceScene (장면 * 장면)
    단부 ();
    보이드 중지 ();
    무효 이력서 ();
    보이드 재시작 ();
    보이드 stopAnimation ();
    보이드 startAnimation ();
    무효 ) (drawScene 단계;

이사 4. 장면

응용 프로그램 실행 방법에서, 첫 번째 게임은 실행 AppDelegate에 아래 applicationDidFinishLaunching 초기화 방법입니다. 이 방법은 현장 포인터 장면을 얻기 후에, 우리 자신의 장면을 쓰기 이사 -> runWithScene (장면)을 수행하는 init 메소드를 호출합니다.

runWithScene (장면)

무효 이사 : runWithScene (장면 * 장면) 
{ 
    CCASSERT (장면을 = nullptr은! " 이 명령은 이사를 시작하는 데 사용할 수있는 장면 존재가 이미 있습니다.. " ); 
    CCASSERT (_runningScene == nullptr, " _runningScene은 널이어야한다 " ); 

    pushScene (장면) 
    startAnimation (); 
}

이 방법은 감독 runningScene이 비어 있어야합니다. 보고 계속합니다.

- pushScene (장면)

첫 번째 방법 sendCleanupToScene 플래그는 거짓으로 설정된다. 그런 다음 실행 :

    _scenesStack.pushBack (장면) 
    _nextScene = 장면;

장면 장면의 스택에 추가 된 장면은 우리의 정의를 nextScene 설정됩니다.

- drawScene ()

drawScene 돌이 방법은, 스케줄러는 다음 업데이트를 수행 :

    IF (_nextScene) 
    { 
        setNextScene (); // nextScene nextScene 빈 후, runningScene을 할당 
    }

- setNextScene ()

되지 전이 runningScene 장면이 때, 입력의 두 가지 방법을 수행 할 경우에 간단히, 상기 방법은 상기 할당 runningScene nextScene한다.

다음 장면으로, 현재 프레임 nextScene 존재의 이사의 경우 방법을 수행합니다.

장면 컷

이사 장면 컷은 두 가지 방법으로 나누어 져 있습니다 :

  1. replaceScene : 새로운 장면이 원래의 장면을 대체, 원래의 장면이 정리 될 것입니다. 새로운 장면 스택을 밀었다.

  2. pushScene popScene가 : 새로운 장면이 촬영 된 원본 장면 그러나 "숨겨진"를 대체 밀어 팝 방법은 원래의 장면을 "복원"것입니다. 새로운 장면 스택으로 푸시되지 않습니다.

- replaceScene (장면 * 장면)

매개 변수화 된 장면은 현재 장면을 교체합니다. 매개 변수 장면은 스택에 누르면, 그리고 nextScene을하게된다.

runningScene가 비어 1. 경우, 실행 runWithScene (장면), 방법은 종료된다.

2. 파라미터 장면을 교체하지 않고 동일 장면 nextScene,이 방법의 마지막 인 경우.

3. nextScene가 nextScene 먼저 존재 여부를 판단하는 경우 주행 상태 (이후의 OnExit 전에 onEnter), 만약 그렇다면, 그 구현의 OnExit. 정리 ()와 푸 nullptr의 NextScene 실행, nextScene을 정리.

4. _sendCleanupToScene = true,因为replaceScene场景切换需要cleanup原先的runningScene。

_sendCleanupToScene唯一的用处是在每一帧setNextScene()之中。在将nextScene赋给runningScene之前,需要判断该值,为true时,对runningScene执行cleanup。

5. scenesStack栈顶的scene替换为参数scene,并且nextScene指向参数scene。

- pushScene(Scene *scene)

代码精简后很简单。push方法将参数scene压入栈顶且成为nextScene。

void Director::pushScene(Scene *scene)
{
    _sendCleanupToScene = false;
    _scenesStack.pushBack(scene);
    _nextScene = scene;
}

_sendCleanupToScene置false,因为此种场景变换不要对原场景cleanup。

- popScene()

简要的说,pop方法将栈顶scene作为nextScene,_sendCleanupToScene置true,导致当前runningScene将被cleanup。

void Director::popScene(void)
{
    CCASSERT(_runningScene != nullptr, "running scene should not null");
    _scenesStack.popBack();
    ssize_t c = _scenesStack.size();
    if (c == 0)
    {
        end();
    }
    else
    {
        _sendCleanupToScene = true;
        _nextScene = _scenesStack.at(c - 1);
    }
}

在从栈中popBack之后,若场景栈为空,此时将无法恢复原场景,说明pop没有和push搭配使用,导致导演在下一帧结束程序。

6. 过渡场景在场景切换中的使用

请看本文:Cocos2d-x 学习笔记(3.2) TransitionScene 过渡场景

추천

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