Я делаю игру, которая использует хронометр.
Игра написана на 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()
, как он пытался в начале приложения, и больше не будет пытаться .. Я не понимаю этого ..
Задача ещё не решена.
Других решений пока нет …