一个时钟类的设计

原创 2005年04月29日 06:26:00

       游戏中时间,事件的管理是必不可少的,今天我也走到了这一步,那就是我的2D游戏小引擎的图象,声音的处理已经略有皮毛,考虑到2D目前已经有点日薄西山,所以小弟我也不再想在这方面深入学习了.所以呢,我开始着手学习时间,事件管理机制的处理.

      SCLOCK类的介绍:

      游戏中常常需要有自己的时间机制,像CS,每局时间,雷炸时间.魔兽中的时间转换,还有MMRPG中的时间等等,他们都有一些基本的功能,那就是:用一个自定义的时间来模拟,取代系统时间,能够暂停,等.

      SCLOCK的时间机制是这样的,在SCLOCK类初始化的时候,设置一个模拟系统时间,也就是游戏中所用到的系统时间,比如说游戏名字叫大唐双龙传,那就可以是公元900年左右.(英雄人物还要成长一下嘛.)这里我将它设为0.

每次暂停后,系统时间亦会停止累加,在重新开始后,新的系统时间可以通过当前真实时间,减去暂停所花的时间来获得.

以下源代码:

/*************************************************************************
 *
 * Copyright (c) 2005 Azure,All rights received.
 *
 * You can use,copy,and change it at will.But you can not use or
 * distribute it for any commercial purpose without permission from
 * Azure.And if you want to reship it,please let me know.
 *
 * Author:Azure
 * Email:bluejugar@sohu.com
 *
 * Created Date: Apr.,29th,2005.
 * 
 * Revision: 1.0.1
 **************************************************************************/

#ifndef _CLOCK_H_
#define _CLOCK_H_

#include <windows.h>
#include <mmsystem.h>
//For three functions:timeGetTime(),timeBeginPeriod(...),timeEndPeriod(...).

typedef size_t time32;
typedef size_t size_type;

template<typename Time = time32,size_type nPrecision = 1>
class SClock
{
public:
 explicit SClock(void);
 virtual ~SClock(void);
 

 //Ispectors:
 bool IsRunning(void) const;
 Time GetSystemTime(void) const;

 //Facilitators:
 void ResetClock(void);
 void Pause(void);
 void CancelPause(void);
 void Update(void);
 void Destroy(void);

protected:
 Time m_tSystemTime_;  //The simulate system time.
     //Also the system's actual time.
 Time m_tPauseTime_;  //The time when paused.
 Time m_tOffsetTime_;  
 bool m_bRunning_; 
    
};

template<typename Time,size_t nPrecision>
SClock<Time,nPrecision>::SClock(void)
{
 timeBeginPeriod(nPrecision);
 ResetClock();
}

template<typename Time,size_t nPrecision>
SClock<Time,nPrecision>::~SClock(void)
{
 Destroy();
}

template<typename Time,size_t nPrecision>
bool SClock<Time,nPrecision>::IsRunning(void) const
{
 return (m_bRunning_);
}

template<typename Time,size_t nPrecision>
Time SClock<Time,nPrecision>::GetSystemTime(void) const
{
 return (m_tSystemTime_);
}

template<typename Time,size_t nPrecision>
void SClock<Time,nPrecision>::ResetClock(void)
{
 m_tSystemTime_ = 0;
 m_tPauseTime_ = 0;
 m_tOffsetTime_ = timeGetTime();
 m_bRunning_ = true;
}

template<typename Time,size_t nPrecision>
void SClock<Time,nPrecision>::Pause(void)
{
 //Pause the clock.
 //When the clock is paused,the clock still works,and the wasted time
 //will be recorded.
 m_bRunning_ = false;
 m_tPauseTime_ = timeGetTime();
}

template<typename Time,size_t nPrecision>
void SClock<Time,nPrecision>::CancelPause(void)
{
 //Cancel the pause to the clock.
 m_tOffsetTime_ += timeGetTime() - m_tPauseTime_;
 m_tSystemTime_ = timeGetTime() - m_tOffsetTime_;
 m_bRunning_ = true;
}

template<typename Time,size_t nPrecision>
void SClock<Time,nPrecision>::Update(void)
{
 //Cancel the pause to the clock.
 //When the pause of the clock is canceled,the
 m_tOffsetTime_ += timeGetTime() - m_tPauseTime_;
 m_tSystemTime_ = timeGetTime() - m_tOffsetTime_;
}

template<typename Time,size_t nPrecision>
void SClock<Time,nPrecision>::Destroy(void)
{
 timeEndPeriod(nPrecision);
}

#endif

作为一个游戏来说,一般有一个时钟就足够了,明天我会把它改成singleton模式,

C++的时钟类

#include using namespace std; class Clock { private: int hour, minute, second; public: Clock(in...

利用JavaFX设计一个简易的时钟

首先要在面板中显示一个时钟,我们可以设计一个ClockPane类来显示一个时钟。最终效果: 若要绘制一个时钟,需要绘制一个圆并为秒钟、分钟和小时绘制三个指针。为了画一个指针,需要确定一条直线的两端:...

自己设计一个时钟程序并实现破解

自己写了一个时钟程序,用来模拟时间类型软件的破解,先从基础的运行时间开始,程序运行界面如图:十秒后程序自动退出 破解思路:查看程序导入表函数(有N多个程序可以查看,以PETOOLS为例),如图所...

一个c程序课程设计时钟

  • 2009年08月15日 15:00
  • 1KB
  • 下载

【JAVA语言程序设计基础篇】--图形-- 三种时钟--增强对类的理解和应用

1.显示任意时间时钟 2.设置三个可见性属性 分别表示时针,分针,秒针的可见性 3.一个精细的时钟  主类:StillClock  @SuppressWarnings("serial") clas...

一个时钟控制类的实现例子

  • 2009年09月27日 16:46
  • 25KB
  • 下载

Python GUI类设计(可重用时钟)

设计一个GUI类来显示一个时钟,假设要在一个画布内显示它而且能够在其他程序中。需要定义一个时钟类来实现时钟的重用。进一步说,为了在图形上显示这个时钟,需要将它定义为一个widget小构件。因此最好的选...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个时钟类的设计
举报原因:
原因补充:

(最多只允许输入30个字)