Сделать таймер на С++?

Я разрабатываю простую игру на С++, в стиле погони за точкой, где вы должны щелкнуть нарисованный круг на дисплее, а затем с каждым щелчком он переходит в другое случайное место, но я хочу, чтобы игра закончилась после 60 секунд или около того, запишите счет в текстовый файл, а затем при запуске программы прочитайте из текстового файла и сохраните информацию в массиве и каким-то образом перестройте ее, чтобы создать таблицу рекордов. Я думаю, что могу сам определить высокий балл и щелкнуть мышью в определенной области, но я полностью застрял в создании возможного таймера. Любая помощь приветствуется, ура!


person psychonaut    schedule 24.04.2011    source источник
comment
Я полагаю, что это был бы тот тип вопроса, с которым можно было бы упомянуть платформу. Часы — это аппаратная функция, и доступ к ней зависит от платформы и библиотеки. Например. линукс, вин32? СДЛ, консоль? и т.д   -  person sehe    schedule 25.04.2011


Ответы (4)


В С++ 11 есть простой доступ к таймерам. Например:

#include <chrono>
#include <iostream>

int main()
{
    std::cout << "begin\n";
    std::chrono::steady_clock::time_point tend = std::chrono::steady_clock::now()
                                               + std::chrono::minutes(1);
    while (std::chrono::steady_clock::now() < tend)
    {
        // do your game
    }
    std::cout << "end\n";
}

Ваша платформа может поддерживать или не поддерживать <chrono>. Существует boost реализация <chrono>.

person Howard Hinnant    schedule 25.04.2011
comment
еще один вопрос о литеральных операторах: сначала я думал, что operator "" _Foo это нормально, но теперь мне кажется, что использование имени в библиотеке в разделе 17.6.4.3 включает макросы? (в отличие от основного определения имени на 3p4). Он начинается с Стандартная библиотека C++ резервирует следующие типы имен: ... макросы, .... Это, по-видимому, ограничивает пользователя строчными/цифровыми литеральными суффиксами после символа подчеркивания, потому что какой-то случайный макрос может заменить _Foo к чему-то случайному. - person Johannes Schaub - litb; 25.04.2011
comment
Согласованный. И они могут иметь только одно начальное подчеркивание. Очень жаль, что у нас нет какой-то области видимости макросов. - person Howard Hinnant; 25.04.2011

Без привязки к конкретному фреймворку или даже к ОС на это нельзя ответить.

В SDL есть SDL_GetTicks(), который подходит для этой цели.

В Linux есть clock_gettime или gettimeofday общего назначения, которые должны работать почти везде (но будьте осторожны с деталями).

Win32 API имеет несколько вызовов функций, связанных с этим, включая механизмы обратного вызова таймера, такие как GetTickCount, Timers и т. д. (статья)

Использование таймеров обычно тесно связано с мемом «бездействующей» обработки. Таким образом, вы также захотите найти эту тему (и именно здесь вступает в действие насос сообщений, потому что насос сообщений решает, когда (например) WM_IDLE сообщения будут отправлены; Gtk имеет аналогичную концепцию Idle hooks, и я считаю, каждая структура пользовательского интерфейса делает)

person sehe    schedule 24.04.2011

Обычно программа с графическим интерфейсом имеет так называемый цикл "перекачки сообщений". Проверка этого таймера должна быть частью вашего цикла:

while(running)
{
  if( current_time() > end_time )
  {
    // time is over ...
    break;
  }
  if( next_ui_message(msg) )
    dispatch(msg); 
}
person c-smile    schedule 24.04.2011
comment
Возможно нет. Вероятно, вам следует создать таймер через вашу ОС/фреймворк и отправить вам события. - person ; 25.04.2011
comment
To unpersson: если вы знаете ОС/фреймворк, то - да, вы можете использовать для этого примитивы ОС. В том виде, в каком был сформулирован вопрос, я считаю, что мой ответ достаточен. В SDL, например, именно так они делают таймеры простоя. - person c-smile; 25.04.2011
comment
опрос событий будет работать с SDL, но программы с графическим интерфейсом вместо этого обычно используют обратные вызовы. - person Bastien Léonard; 25.04.2011

Попробуйте это:

//Creating Digital Watch in C++
#include<iostream>
#include<Windows.h>
using namespace std;

struct time{

int hr,min,sec;
};
int main()
{
time a;
a.hr = 0;
a.min = 0;
a.sec = 0;

for(int i = 0; i<24; i++)
{
    if(a.hr == 23)
    {
        a.hr = 0;
    }

    for(int j = 0; j<60; j++)
    {
        if(a.min == 59)
        {
            a.min = 0;
        }

        for(int k = 0; k<60; k++)
        {
            if(a.sec == 59)
            {
                a.sec = 0;
            }

            cout<<a.hr<<" : "<<a.min<<" : "<<a.sec<<endl;
            a.sec++;
            Sleep(1000);
            system("Cls");
        }
    a.min++;

}

    a.hr++;
}

}
person user2808359    schedule 11.12.2013