본문 바로가기

Cocos2d-x

5. 스케줄(schedule)

· 스케줄은 타이머의 개념이라고 보시면 편합니다. 사용자가 지정한 시간 간격으로 함수를 실행시키는 것에 간편합니다.

· 스케줄 함수의 기본형

: schedule(schedule_selector(헤더명::함수명));

※ 스케줄로 실행할 대상 함수는 매개변수에 float형 변수를 1개 포함해야 합니다.

· 헤더에서 사용할 함수들을 미리 선언해줍니다.

void anyTime(float a);
void everySecond(float b);
void Once(float c);
// float에서 a든 b든 상관없습니다.

 



1. 상시 실행되는 스케줄

this->schedule(schedule_selector(scheduleTest::anyTime));

void scheduleTest::anyTime(float a)
{
log("항시 실행되는 스케줄 함수입니다.");
}

콘솔창에 log값이 계속 출력됩니다.


2. 일정시간 간격으로 실행되는 스케줄

this->schedule(schedule_selector(scheduleTest::everySecond), 1.0f);
// 1.0f = 1초 간격으로. 2.0f면 2초 간격으로

void scheduleTest::everySecond(float b)
{
log("1초 간격으로 실행되는 스케줄 함수입니다.");
}

콘솔창에 1초 간격으로 log값이 출력됩니다.


3. 일정시간 경과한 후 1회만 실행하는 스케줄

this->scheduleOnce(schedule_selector(scheduleTest::Once), 1.0f);

void scheduleTest::Once(float c)
{
log("지정한 시간이 지난 후에 한번 실행되는 스케줄 함수입니다.");
}

콘솔창에 1초 후 log값이 한 번 출력됩니다.


4.  스케줄의 다양한 사용 방법

· 시작, 일시정지, 재시작, 정지 기능을 소개해드릴건데 사전작업이 필요합니다.

· 폰트로 아이템을 생성하고, 그 메뉴아이템으로 메뉴를 생성합니다.

auto scheduleItem1 = MenuItemFont::create("시작", CC_CALLBACK_1(scheduleTest::Start, this));
auto scheduleItem2 = MenuItemFont::create("일시정지", CC_CALLBACK_1(scheduleTest::Pause, this));
auto scheduleItem3 = MenuItemFont::create("재시작", CC_CALLBACK_1(scheduleTest::Resume, this));
auto scheduleItem4 = MenuItemFont::create("정지", CC_CALLBACK_1(scheduleTest::Stop, this));

auto scheduleMenu = Menu::create(scheduleItem1, scheduleItem2, scheduleItem3, scheduleItem4, nullptr);

// 메뉴 아이템들을 수직정렬 해줍니다.
scheduleMenu->alignItemsVertically();

· 헤더에 선언한 함수 초기화. 메뉴아이템과 결합하여 사용합니다.

 

위에서 사용한 everySecnod함수를 재사용하겠습니다.

void scheduleTest::everySecond(float b)
{
log("1초 간격으로 실행되는 스케줄 함수입니다.");
}

 

① 시작(start)

// 시작 메뉴버튼을 누르면 everySecond 스케줄이 할당됩니다.
void scheduleTest::Start(Ref * Sender)
{
// 스케줄 등록
this->schedule(schedule_selector(scheduleTest::everySecond), 1.0f);
}

② 일시정지(pause)

// 일시정지 메뉴버튼을 누르면 스케줄이 일시정지 됩니다.
void scheduleTest::Pause(Ref * Sender)
{
Director::getInstance()->getScheduler()->pauseTarget(this);
}

③ 재시작(resume)

// 재시작 메뉴버튼을 누르면 일시정지된 스케줄이 재시작됩니다.
void scheduleTest::Resume(Ref * Sender)
{
Director::getInstance()->getScheduler()->resumeTarget(this);
}

④ 정지(unschedule)

// 정지 메뉴버튼을 누르면 스케줄이 정지됩니다.
void scheduleTest::Stop(Ref * Sender)
{
// 간단하게 schedule 대신에 unschedule을 써주시면 됩니다.
this->unschedule(schedule_selector(scheduleTest::everySecond));
}

'Cocos2d-x' 카테고리의 다른 글

7. 키보드(Keyboard)  (0) 2021.08.28
6. 애니메이션(Animation)  (0) 2021.08.28
4. 액션(Action)  (0) 2021.08.17
3. Menu  (0) 2021.08.07
2. Label, Font  (0) 2021.08.06