zoukankan      html  css  js  c++  java
  • Cocos2d-x之定时器

    |   版权声明:本文为博主原创文章,未经博主允许不得转载。

      每一个游戏程序都有一个循环在不断运行,它是由导演对象来管理与维护。如果需要场景中的精灵运动起来,可以在游戏循环中使用定时器对精灵等对象进行操作。因为Node类封装了Scheduler类,所以也可以直接使用Node中调用函数。      

    定时器的两种实现方式:
    >>.

    scheduleUpdate();   
        是定时器更新函数,如果定时器更新了,就会调用update();来执行update();函数继承自Node类;每个Node对象只要调用该函数,那么这个Node对象就会定时的每帧回调用一次自己的update(float delat)函数
        void update(float dt);                  
        dt的默认频率是: 1/60    

    >>.

    schedule(schedule_selector(selector));
    void myUpdate(float dt);
    schedule_selector();                      这是指定定时器的一个回调方法,这个方法我们可以自己去定义。


    实例:

    .h files
    
    #ifndef _TIMERTEST_SCENE_H_
    #define _TIMERTEST_SCENE_H_
    #include "cocos2d.h"
    USING_NS_CC;
    class timerTest : public cocos2d::Layer
    {
    private:
    public:
    	static cocos2d::Scene* createScene();
    	virtual bool init();
    	virtual void update(float delta);
    	void schedule_TwoTips_Test(float delta);
    
    	CREATE_FUNC(timerTest);
    };
    #endif // _TIMERTEST_SCENE_H_
    
    
    
    .cpp files
    
    #include "TimerTest.h"
    float timeCount = 0;
    Scene* timerTest::createScene()
    {
    	auto scene = Scene::create();
    	auto layer = timerTest::create();
    	scene->addChild(layer);
    	return scene;
    }
    bool timerTest::init()
    {
    	if (!Layer::init())
    	{
    		return false;
    	}
    	//启动定时器,调用scheduleUpdate()来执行定时器
    	//scheduleUpdate();
    	//two tips
    	schedule(schedule_selector(timerTest::schedule_TwoTips_Test), 2);
    	return true;
    }
    //delta是刷新的帧频率;在默认的情况下,默认值为: 1/60s刷新一次
    void timerTest::update(float delta)
    {
    	timeCount += delta;
    	if (timeCount > 5.0f)
    	{
    		CCLOG("Pause Update...");
    		MessageBox("5s后停止定时器...", "定时器测试");
    		unscheduleUpdate();
    	}
    	CCLOG("Begin Update...");
    }
    void timerTest::schedule_TwoTips_Test(float delta)
    {
    	CCLOG("Two tips of Update...");
    }
    

     

      

    Scheduler类常用函数方法

     1 void scheduler(
     2     const ccSchedulerFun& callback,                      //回调方法
     3     void* target,                                        //目标执行者
     4     float interval,                                      //间隔时间,如果为0每帧都执行                
     5     unsigned int repeat,                                 //重复执行动作
     6     float delay,                                         //延迟执行
     7     bool paused,                                         //如果为true暂停执行
     8     const std::string& Key                               //键值标识该定时器
     9 );
    10 //取消key所对应的定时器
    11 void unschedule(const std::string& key, void* target)
    12 //取消selector定时器
    13 void unschedule(SEL_SCHEDULE selector, Ref* target)
    14 //取消更新update方法
    15 void unscheduleUpdate(void* target);
    16 //取消所有target定时器(可能有多个图层)
    17 void unscheduleAllForTarget(void* target);
    18 //取消所有定时器
    19 void unscheduleAll(void);
    20 //暂停定时器
    21 void pauseTarget(void* target);
    22 //恢复定时器
    23 void resumeTarget(void* target);

    实例:

    .h files
    
    #ifndef _SCHEDULERTEST_SCENE_H_
    #define _SCHEDULERTEST_SCENE_H_
    #include "cocos2d.h"
    USING_NS_CC;
    //scheduler类的常用函数
    class schedulerTest : public cocos2d::Layer
    {
    private:
    	cocos2d::Size visible;
    public:
    	static cocos2d::Scene* createScene();
    	virtual bool init();
    	virtual void update(float delta);
    	void callBack_1(float delta);
    	void callBack_2(float delta);
    	void start(Ref* sendef);
    	void pause(cocos2d::Ref* sendef);
    	void resume(cocos2d::Ref* sendef);
    	void stop(cocos2d::Ref* sendef);
    	CREATE_FUNC(schedulerTest);
    };
    #endif //_SCHEDULERTEST_SCENE_H_
    
    
    
    .cpp files
    
    #include "Scheduler_Test.h"
    Scene* schedulerTest::createScene()
    {
    	Scene* scene = Scene::create();
    	schedulerTest* layer = schedulerTest::create();
    	scene->addChild(layer);
    	return scene;
    }
    bool schedulerTest::init()
    {
    	if (!Layer::init())
    	{
    		return false;
    	}
    	visible = Director::getInstance()->getWinSize();
    	auto item1 = MenuItemFont::create("Start", CC_CALLBACK_1(schedulerTest::start, this));
    	auto item2 = MenuItemFont::create("Pause", CC_CALLBACK_1(schedulerTest::pause, this));
    	auto item3 = MenuItemFont::create("Resume", CC_CALLBACK_1(schedulerTest::resume, this));
    	auto item4 = MenuItemFont::create("Stop", CC_CALLBACK_1(schedulerTest::stop, this));
    	auto menu = Menu::create(item1, item2, item3, item4, NULL);
    	menu->setPosition(Vec2(visible.width / 2, visible.height / 2));
    	menu->alignItemsVerticallyWithPadding(20.0f);
    	this->addChild(menu);
    	return true;
    }
    void schedulerTest::update(float delta)
    {
    	CCLOG("update...");
    }
    //自己定义定时器回调的方法
    void schedulerTest::callBack_1(float delta)
    {
    	CCLOG("callback_one..");
    }
    void schedulerTest::callBack_2(float delta)
    {
    	CCLOG("callback_two...");
    }
    void schedulerTest::start(Ref* sendef)
    {
    	scheduleUpdate();
    	schedule(schedule_selector(schedulerTest::callBack_1));
    	schedule(schedule_selector(schedulerTest::callBack_2));
    }
    void schedulerTest::pause(cocos2d::Ref* sendef)
    {
    	//要暂停定时器首先要先得到要暂停的对象
    	auto schedulerflag = Director::getInstance()->getScheduler();
    	//然后让得到的对象暂停,下面这条语句表示暂停当前索取对象所在的那个层
    	schedulerflag->pauseTarget(this);
    }
    void schedulerTest::resume(cocos2d::Ref* sendef)
    {
    	//同样要恢复定时器,则要首先指定要恢复哪个对象的定时器,所以我们要先取得,恢复定时器的那个对象
    	auto schedulerflag = Director::getInstance()->getScheduler();
    	schedulerflag->resumeTarget(this);
    }
    void schedulerTest::stop(cocos2d::Ref* sendef)
    {
    	auto schedulerflag = Director::getInstance()->getScheduler();
    	schedulerflag->unscheduleAll();
    }
    

  • 相关阅读:
    Flask中的Templates
    Flask中的route
    flask的安装
    SQLAlchemy中表结构的一对多
    SQLAlchemy中表结构的一对一
    flask连接mysql数据库
    获取列表中的最大的N项和最小的N项
    FileNotFoundError: [Errno 2] No such file or directory的解决方法
    LC 890. Find and Replace Pattern
    LC 894. All Possible Full Binary Trees
  • 原文地址:https://www.cnblogs.com/geore/p/5798907.html
Copyright © 2011-2022 走看看