文档章节

Cocos2d-x实现计时与定时

南楼
 南楼
发布于 2017/05/29 12:36
字数 1068
阅读 14
收藏 0
点赞 0
评论 0

笔者最近在写一个计时和定时的功能,上网查看了不少讲述实现计时器定时器的文章,大多都直接采用Cocos2d-x的定时器schedule,通过在schedule方法添加间隔时间的参数去实现计时与定时功能。

但是学过Cocos2d-x定时器schedule的都了解,schedule定时器调用方法是有一定的间隔时间,虽然这个时间间隔很小,只有十几毫秒,一般来说没有太大的影响。但是如果需要计时或者定时的时间较长,那么误差就会增大。比如,假设每次schedule定时器调用方法的时间间隔都固定为0.015s,我们需要计时5分钟即300s(每1s计时一次),结果实际上却是过了304.5s。

为了尽量的消除误差,笔者打算采用schedule定时器与计算系统时间来实现计时和定时功能。
闲话少叙,直接通过代码说话。

计时功能

"HelloWorld.h"
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::Layer
{
public:
  int oldTime;  //调用schedule定时器前的时间
  int num;      //计时
  virtual void update(float dt);  //schedule定时器调用的方法
  static cocos2d::Scene* createScene();
  virtual bool init();
  CREATE_FUNC(HelloWorld);
};

#endif
"HelloWorld.cpp"
#include "HelloWorldScene.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
USING_NS_CC;
using namespace cocostudio::timeline;

Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    struct timeval now;
    gettimeofday(&now, NULL);
    this->num = 0;    //计时从0开始
    CCLOG("%d",this->num);
    this->oldTime = now.tv_sec;  //获取调用定时器前的时间
    schedule(schedule_selector(HelloWorld::update));
    return true;
}
void HelloWorld::update(float dt) {
    struct timeval now;
    gettimeofday(&now, NULL);
    int nowTime = now.tv_sec;   //获取调用定时器后的时间
    if ((nowTime - oldTime) == 1) 
    //判断调用定时器后的时间(可能调用了几次定时器)是否与调用定时器前的时间相差1s
    {
        this->num++;
        CCLOG("%d",this->num);
        this->oldTime = nowTime;   //重新设定调用定时器前的时间
    }
}

通过上述的方法就可以实现相对误差较少的计时功能了。笔者这里只是简单的实现了一个计时器功能,输出的时间格式是可以优化的,比如输出分秒 (num/60):(num%60),就可以实现完整的计时器功能了

定时功能

"HelloWorld.h"
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::Layer
{
public:
  int oldTime;  //调用schedule定时器前的时间
  int min;      //定时的分钟数
  int sec;      //定时的秒数
  virtual void update(float dt);  //schedule定时器调用的方法
  static cocos2d::Scene* createScene();
  virtual bool init();
  CREATE_FUNC(HelloWorld);
};

#endif
"HelloWorld.cpp"
#include "HelloWorldScene.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
USING_NS_CC;
using namespace cocostudio::timeline;

Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    //实现一个2分钟的定时功能
    this->min = 2;   //定时分钟数为2min
    this->sec = 0;   //定时秒数为0s
    struct timeval now;
    gettimeofday(&now, NULL);
    this->oldTime = now.tv_sec;
    CCLOG("%d:%d",this->min,this->sec);
    schedule(schedule_selector(HelloWorld::update));
    return true;
}
void HelloWorld::update(float dt) {
    struct timeval now;
    gettimeofday(&now, NULL);
    int nowTime = now.tv_sec;   //获取调用定时器后的时间
    if (this->min != 0 || this->sec != 0) { //判断定时是否没有结束
        if (nowTime - this->oldTime == 1)
         //判断调用定时器后的时间(可能调用了几次定时器)是否与调用定时器前的时间相差1s
         {
            if (this->sec == 0) {
                this->min--;
                this->sec = 59;
                CCLOG("%d:%d", this->min, this->sec);
            }
            else if (this->sec != 0) {
                this->sec--;
                CCLOG("%d:%d", this->min, this->sec);
            }
            this->oldTime = nowTime;   //重新设定调用定时器前的时间
        }
    }
    else if (this->min == 0 && this->sec == 0) {  //判断定时是否结束
        unschedule(schedule_selector(HelloWorld::update));  //取消定时器
        CCLOG("end!");
    }
}

通过上述方法就可以实现一个误差较小的定时功能了。笔者这里只是简单的实现了一个定时器功能,定时的时间可以改变的,可以把整个方法封装成类,定时的时间通过传参去设置,就可以实现一个完整的定时器方法了。

© 著作权归作者所有

共有 人打赏支持
南楼
粉丝 0
博文 7
码字总数 5247
作品 0
沈阳
程序员
Cocos2d-X 2.0嵌入MFC的子窗体的方法(1.0姐妹篇)

红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 另本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议!...

长平狐 ⋅ 2012/11/19 ⋅ 0

Cocos2d-X 2.0嵌入MFC的子窗体的方法(1.0姐妹篇)

红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 另本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议!...

长平狐 ⋅ 2013/03/19 ⋅ 0

Cocos2d-X游戏工具开发之一:将Cocos2d-X嵌入MFC的子窗体方法讲解

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 另本章为我的Cocos2d-x教程一书...

长平狐 ⋅ 2012/11/19 ⋅ 0

Cocos2d-X游戏工具开发之一:将Cocos2d-X嵌入MFC的子窗体方法讲解

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 另本章为我的Cocos2d-x教程一书...

长平狐 ⋅ 2013/03/19 ⋅ 0

Android中的倒计时器设计实现 00:00:00格式

功能: 倒计时 类:MainActivity(主类) MyCount(实现倒计时功能的类) AdvancedCountdownTimer(消息机制的抽象类) 代码如下: package com.example.daojishiqi; import android.os.Bund...

zwyandroid ⋅ 05/25 ⋅ 0

关于Cococs2d-x scheduler(调度器) 记录

Cocos2d-x 为我们提供了调度器,用于定时/多次调用某一个函数……一般情况下我们是在一个Node下使用调度器,但有时候我们希望在非Node下使用调度器;通过查看Node类源代码,发现Node中有一个...

熊友良 ⋅ 2014/05/01 ⋅ 0

游戏开发记录120811:cocos2d-x引擎学习---目录结构及主要类

1-Cocos2d-x目录结构 Cocos2d-x的目录结构如下: 目录的具体结构介绍如下: Box2D:物理引擎Box2D的相关源文件 Chipmunk:物理引擎chipmunk的相关源文件 cocos2dx:cocos2d-x引擎的核心部分,...

Matrix4X4 ⋅ 2012/08/12 ⋅ 0

VC++获得微秒级时间的方法与技巧探讨

获得微秒级的时间 收藏 Win 下建议如下方式: http://www.vckbase.com/document/viewdoc/?id=1301 VC中基于 Windows 的精确定时 中国科学院光电技术研究所 游志宇 在工业生产控制系统中,有许...

长平狐 ⋅ 2013/01/06 ⋅ 0

JavaWeb03-HTML篇笔记(二)

1.1 案例一:使用JS完成图片的轮播的效果:1.1.1 需求: 1.1.2 分析:1.1.2.1 技术分析: 【JS中的Window对象的定时的操作】 设置定时的方法 清除定时的方法 1.1.2.2 步骤分析: 【步骤一】创...

我是小谷粒 ⋅ 05/02 ⋅ 0

Cocos2d-x 2.0 拖尾效果深入分析

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957加群写:Cocos2d-x 红孩儿Cocos2d-X学习园地QQ2群:4...

长平狐 ⋅ 2013/03/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 21分钟前 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 47分钟前 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 昨天 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 昨天 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部