10 Stimmen

Einen Timer in C++ erstellen?

Ich entwickle ein einfaches Spiel in C++, ein Chase-the-Dot-Stil ein, wo Sie einen gezeichneten Kreis auf dem Display klicken müssen und dann springt es zu einem anderen zufälligen Ort mit jedem Klick, aber ich möchte das Spiel nach 60 Sekunden oder so zu beenden, schreiben Sie die Punktzahl in eine Textdatei und dann beim Starten des Programms aus der Textdatei lesen und speichern Sie die Informationen in ein Array und irgendwie neu anordnen, um eine Highscore-Tabelle zu erstellen. Ich denke, ich kann den Highscore und das Klicken mit der Maus in einem bestimmten Bereich selbst herausfinden, aber ich komme mit der Erstellung eines möglichen Timers nicht weiter. Jede Hilfe ist willkommen, danke!

19voto

Howard Hinnant Punkte 191035

In C++11 gibt es einen einfachen Zugang zu Zeitgebern. Zum Beispiel:

#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";
}

Ihre Plattform kann, muss aber nicht unterstützen <chrono> noch nicht. Es gibt eine erhöhen Umsetzung von <chrono> .

1voto

sehe Punkte 346808

Ohne Bezug auf einen bestimmten Rahmen oder sogar das Betriebssystem ist dies nicht zu beantworten.

In SDL gibt es SDL_GetTicks() die für den Zweck geeignet ist.

Unter Linux gibt es den allgemeinen Zweck clock_gettime o gettimeofday die so gut wie überall funktionieren sollte (aber achten Sie auf die Details).

Win32 API hat mehrere Funktionsaufrufe in diesem Zusammenhang, einschließlich Timer-Callback-Mechanismen, wie GetTickCount , Timers usw. ( Artikel )

Die Verwendung von Zeitgebern ist in der Regel eng mit dem Begriff des "Leerlaufs" verbunden. Sie sollten also auch nach diesem Thema suchen (und hier kommt die Nachrichtenpumpe ins Spiel, denn die Nachrichtenpumpe entscheidet, wann (z. B.) WM_IDLE Nachrichten gesendet werden; Gtk hat ein ähnliches Konzept von Idle-Hooks und ich vermute, dass so ziemlich jedes UI-Framework dies tut)

0voto

c-smile Punkte 25652

Normalerweise hat ein GUI-Programm eine so genannte "message pump"-Schleife. Die Überprüfung dieses Timers sollte ein Teil Ihrer Schleife sein:

while(running)
{
  if( current_time() > end_time )
  {
    // time is over ...
    break;
  }
  if( next_ui_message(msg) )
    dispatch(msg); 
}

0voto

user2808359 Punkte 41

Probieren Sie dies aus:

//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++;
}

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X