我在GTK编写一个纸牌游戏。有没有办法创建一个不会退出函数的循环(例如human_play函数),直到用户点击卡片为止?我的意思是,它就像等待用户点击一张卡(同时这样做,不阻止退出按钮和其他事件小部件),以便函数返回并继续运行后续代码。
如果我能更清楚,请告诉我。回复将非常感激。
答案 0 :(得分:0)
首先,您想要的是一个GtkDialog小部件来获取用户输入(选择一张卡)。在给出足够的响应之前,GtkDialog不会返回调用它的函数。
这只是编码gtkdialog的问题。给调用对话框的回调的user_data gpointer可以在GPtrArray上有一个指针或一组指针来管理程序的内部数据结构。
如果你的程序纯粹是被动的,那就足够了。
如果您希望在用户在gtkdialog上思考其决策时“思考”引擎,那么您需要一个单独的线程并管理与回调的通信。那太复杂了。
欲了解更多信息:
http://developer.gnome.org/gtk/2.24/GtkDialog.html
http://xpt.sourceforge.net/techdocs/language/gtkdialog/gtkde02-GtkdialogExamples/
编辑:
我想念您的初始帖子,因此GtkDialog
推荐。
您是否实施了原型?我的意思是你的游戏引擎的文本版本?哪个接缝基于没有骰子转动。
如果你有一个适当的工作回转引擎,你应该能够使用GTK UI的回调来处理事件。
例如,如果您有一些卡片图像GtkButton
来标识它们,请将按钮点击事件连接到相应的回调,按顺序执行2项操作
1)在计算机思考时,将要禁用的UI部分设置为不敏感。这可以使用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
}