автор: Тимонин Андрей
дата публикации на сайте Мега Информатик: 18.11.2012
Добро пожаловать в цикл моих уроков посвященных программированию.
Эта статья будет посвящена такому понятию как игровое время, и как его выводить.
В игровых приложениях будь то стратегии, или простые казуалки время играет заначительную роль. Все процессы занимают заданное время. Игровой цикл тоже длиться строго определеное время и подчиняется некоторым законам.
В этой статье мы коснемся, непосредственно, вывода этого времени на игровой экран. А будет у нас оно формироваться в строковом формате, например таком, как на скриншоте.
Время измеряется в часах, минутах, секундах, миллисекундах. Для нас интересны сейчас часы, минуты и секунды, составляющие формата.
Существует много способов определения времени. Мы рассмотрим один из них. Подходит он или нет для вашего случая, решать вам.
Графическую составляющую панели со временем я не рассматриваю. Это тема для другой статьи.
Итак, приступим к делу... Напишем класс, который имеет следующие возможности:
1) показывать текущее время;
2) сбрасывать в 0 время игры;
3) определять сколь времени прошло;
4) устанавливать счетчику время старта.
У меня получился такой интерфейс класса, который я назвал СTimerPanel
class СTimePanel
{
//мой класс для вывода текста
CStaticText* text;
public:
СTimePanel ();
~СTimePanel();
//сброс счетчика
void reset();
//возвращает время со старта
time_t getTime() const;
//устанавливает время старта
void setTime(time_t st);
//отрисовка
bool render();
private:
//закрытая переменная времени старта
time_t time_st;
};
Здесь мы используем время стандартной библиотеки time.
Посмотрим на мою реализацию класса
СTimePanel::СTimePanel()
{
//некий класс для вывода текста
text = new CStaticText(L"Time",L"Data/panel.png",208,57,CPoint(+128,-280));
//берем системное время
time(&time_st);
}
//вычисляем текущее время
time_t СTimePanel::getTime() const
{
time_t ctTime;
//берем системное время
time(&ctTime);
ctTime = ctTime - time_st;
return ctTime;
}
//устанавливаем время
void СTimePanel::setTime(time_t st)
{
time_t ctTime;
//берем системное время
time(&ctTime);
time_st = ctTime - st;
}
СTimePanel::~СTimePanel()
{
if( text )
{
delete text;
}
}
//сброс счетчика
void СTimePanel::reset()
{
//берем системное время
time(&time_st);
}
bool СTimePanel::render()
{
if( text )
{
struct tm *pTime;
time_t ctTime;
//берем системное время
time(&ctTime);
ctTime = ctTime - time_st;
//получим на указатель на структуру времени
//pTime = localtime( &ctTime );
//преобразуем время в часы, минуты, секунды
pTime = gmtime(&ctTime );
if (!pTime) return false;
//выведем в строку ширина 2 позиции заполнитель 0
std::ostringstream stime;
stime << std::setw(2) << std::setfill('0') << pTime->tm_hour
<< ":" << std::setw(2) << std::setfill('0') << pTime->tm_min
<< ":" << std::setw(2) << std::setfill('0') << pTime->tm_sec
<< std::endl;
text->SetText(stime.str());
//рисуем
text->Draw();
}
return true;
}
Время в этой статье определяем с помощью стандартной библиотеки, которая подключается директивой
#include <time.h>
Для его определения я опираюсь на локальное время компьютера, которое определяется функцией
time_t ctTime;
//берем системное время
time(&ctTime);
Время в игре идет с 0, потому я везде вычитаю стартовое время. Потому для установки нового стартового времени тоже использую эту разницу.
Чтобы вывести время, мы преобразуем его к структуре tm, для более удобного использования в строковом потоке.
Функция gmtime преобразует наше время с учетом GMT (часового пояса).
На этом заканчиваю. Надеюсь, эта информация была вам интересна.
C уважением, Андрей.