таймер — хронометр Gtk / C ++

Я делаю игру, которая использует хронометр.
Игра написана на C ++, и я также использую glade и GTK3.0

Моя проблема в том, что когда я запускаю игру, хронометр не работает должным образом ..

Я создал файл time.h с этим кодом внутри:


struct aTimer
{
bool running = false;
int hour_expired = 0;
int min_expired = 59;
int sec_expired = 50;
};

void start_time(aTimer *&t)
{
t->running = true;
}

void reset_time(aTimer *&t)
{
t->running = false;
t->sec_expired = 0;
t->min_expired = 0;
t->hour_expired = 0;
}

В мой основной файл я включаю его, а также объявляю новый хронометр следующим образом:

void start_time(aTimer *&);
void reset_time(aTimer *&);

aTimer *tempo = new aTimer;

Теперь в моей игре у меня есть 2 окна, когда я нажимаю кнопку воспроизведения из первого окна, второе окно становится видимым, и я скрываю первое. Когда второй закрывается, первый становится видимым, а второй невидимым ..
Когда первое окно закрыто, приложение закрывается.

В структуре, bool работает неверно, потому что моя идея состояла в том, чтобы сделать это истинным, когда вы фактически играете в игру (то есть, когда у вас видно второе окно), а не в начале приложения.

Итак, я сделал это в основном файле:


void start_game()
{
start_time(tempo);
}

gboolean update_time()
{
if (tempo->running)
{
if (tempo->sec_expired == 60)
{
tempo->sec_expired = 0;
(tempo->min_expired)++;
if (tempo->min_expired == 60)
{
tempo->min_expired = 0;
(tempo->hour_expired)++;
}
}

ostringstream oss;
GtkLabel *time = GTK_LABEL(gtk_builder_get_object(builder, "lblSec"));
oss<<(tempo->sec_expired)++;
gtk_label_set_text(time, oss.str().c_str());
oss.str("");
oss.clear();
time = GTK_LABEL(gtk_builder_get_object(builder, "lblMin"));
oss<<tempo->min_expired<<":";
gtk_label_set_text(time, oss.str().c_str());
oss.str("");
oss.clear();
time = GTK_LABEL(gtk_builder_get_object(builder, "lblHour"));
oss<<tempo->hour_expired<<":";
gtk_label_set_text(time, oss.str().c_str());
oss.str("");
oss.clear();
}
return tempo->running;
}

и в основной функции основного файла у меня также:

g_timeout_add_seconds(1, GSourceFunc(update_time), NULL);

Если я запускаю приложение с bool running = false, оно не будет работать вообще
Если я запускаю его с именем running = true, то оно работает, когда я запускаю приложение, но когда я возвращаюсь в «меню» и хочу сыграть в другую игру, оно не запустится снова. Новое время будет просто старое время и больше не будет увеличиваться
Хотя я не понимаю, почему … Кто-то может мне помочь?
Спасибо

********************ОБНОВИТЬ************************

Я попробовал «вариант» GTimer, как предложил @ José Fonte, но все еще не может прийти вперед ..

Это пример, который я попробовал ..

#include <iostream>
#include <glib.h>
#include <sstream>
#include <gtk/gtk.h>

static GtkBuilder *builder;

using namespace std;

GTimer *timing;

bool start = false;

extern "C" void btnStartPause_click(GtkButton *button)
{
if (!start)
{
timing = g_timer_new();
start = true;
}
else
{
g_timer_stop(timing);
start = false;
}
}

gboolean update_time()
{
if (start)
{
gulong *micro;
double sec;
sec = g_timer_elapsed(timing, micro);
ostringstream oss;
GtkLabel *time = GTK_LABEL(gtk_builder_get_object(builder, "lblSec"));
oss<<(sec)++;
gtk_label_set_text(time, oss.str().c_str());
oss.str("");
oss.clear();
}
return start;
}

int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);

builder = gtk_builder_new();

gtk_builder_add_from_file(builder,"glade.glade", NULL);

gtk_builder_connect_signals(builder, NULL);

// timing
g_timeout_add_seconds(1, GSourceFunc(update_time), NULL);

gtk_main();

return 0;
}

Проблема снова в том, что я хочу начать отсчет времени, когда я нажимаю кнопку btnStartPause (а не когда запускаю приложение), поэтому я хочу, чтобы он запускался в функции btnClick.
Но похоже, что приложение мгновенно пытается сделать gboolean update_time() функция, но поскольку в начале приложения логическое начало имеет значение false, оно просто не будет выполнять код, но когда я нажимаю кнопку, чтобы логическое начало стало истинным, оно не пытается снова gboolean update_time(), как он пытался в начале приложения, и больше не будет пытаться .. Я не понимаю этого ..

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector