Поначалу может показаться, что вам нужен виджет GtkDialog для ввода пользовательского ввода (выберите карту). GtkDialog не вернется к функции, которая его вызывала, пока не будет дан адекватный ответ.
Это всего лишь вопрос кодирования вашего gtkdialog. Gpointer user_data, данный для обратного вызова, который вызывает диалог, может иметь один указатель или набор указателей на GPtrArray для управления внутренними структурами данных вашей программы.
Если ваша программа чисто реактивная, этого должно быть достаточно.
Если вы хотите, чтобы движок "думал", пока пользователь обдумывает свое решение на gtkdialog, то вам нужен отдельный поток и управлять связью с обратными вызовами. Это намного сложнее.
Для получения дополнительной информации:
http://developer.gnome.org/gtk/2.24/GtkDialog.html
http://xpt.sourceforge.net/techdocs/language/gtkdialog/gtkde02-GtkdialogExamples/
Edit:
Я скучаю по вашему первоначальному сообщению, поэтому рекомендация GtkDialog
.
Вы реализовали рабочий прототип? Я имею в виду, например, текстовую версию вашего игрового движка? Какие швы переворачиваются без кости.
Если у вас есть работающий пошаговый движок, вы можете использовать обратные вызовы из интерфейса GTK для обработки событий.
Например, если у вас есть GtkButton
с изображениями карт, чтобы идентифицировать их, подключите событие нажатия кнопки к соответствующему обратному вызову, который делает 2 вещи в порядке
1) Установите части пользовательского интерфейса, которые вы хотите отключить, как нечувствительные, пока компьютер думает. Это можно сделать с помощью функции gtk_widget_set_sensitive(widget,FALSE)
с соответствующими виджетами. Это включает в себя только что нажатую / нажатую кнопку.
2) передать данные о том, какая карта была выбрана игровому движку, игровой движок затем извлекает текущее состояние игры и обрабатывает информацию, в то время как движок не возвращается с ответом, ваш обратный вызов также не вернется.
3) Как только движок вернет ответ / переместить / ответить, покажите его пользователю и снова используйте gtk_widget_set_sensitive()
, чтобы включить все пользовательские виджеты.
void callback(GtkButton button,gpointer user_data){
//pointers to a structure which holds game state, pointer to a list of widgets to disable temporarily, other pointers to useful data
GPtrArray* gptr = user_data;
GameEngineResponse* res;
set_UI_insensitive(..,FALSE);
res = call_game_engine(selected *card,other_info,..);//while this functions does not return, the callback will wait here.
set_UI_sensitive(..,TRUE;);
// and now returns to the game everything ready for the user to play again if he did not loose
}