我正在用GTK编写纸牌游戏。有没有办法创建一个不会退出函数的循环(例如human_play函数),直到用户点击一张卡片?我的意思是,它就像等待用户点击一张卡片(同时这样做,而不是阻止退出按钮和其他事件小部件),以便函数返回并继续运行后续代码。GTK - 等待事件发生才能继续运行后续代码
让我知道我是否可以更清楚。回应将非常感激。
我正在用GTK编写纸牌游戏。有没有办法创建一个不会退出函数的循环(例如human_play函数),直到用户点击一张卡片?我的意思是,它就像等待用户点击一张卡片(同时这样做,而不是阻止退出按钮和其他事件小部件),以便函数返回并继续运行后续代码。GTK - 等待事件发生才能继续运行后续代码
让我知道我是否可以更清楚。回应将非常感激。
看起来你想要的是一个GtkDialog小部件来接受用户输入(选择一张卡片)。一个GtkDialog不会返回到调用它的函数,直到给出足够的响应。
这只是一个编码你的gtkdialog的问题。赋予调用对话框的回调的user_data gpointer可以在GPtrArray上有一个指针或一组指针来管理程序的内部数据结构。
如果您的程序纯粹是反应性的,应该足够了。
如果您希望引擎在用户思考其gtkdialog的决定时“思考”,那么您需要一个单独的线程并管理与回调的通信。 Byt远远更复杂。
欲了解更多信息:
http://developer.gnome.org/gtk/2.24/GtkDialog.html
http://xpt.sourceforge.net/techdocs/language/gtkdialog/gtkde02-GtkdialogExamples/
编辑:
我想念你的理解战后初期,因此GtkDialog
recomendation。
您是否实施过工作原型?我的意思是例如你的游戏引擎的文本版本?没有骰子,哪个接缝转动。
如果您有适当的基于工作回合的引擎,您应该能够使用GTK UI中的回调来处理事件。
例如,如果你有一些GtkButton
用卡的图像来识别它们,一个按钮点击事件连接到一个相应的回调,其确实为了
1 2米的东西)设置你想要的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
}
你不需要使用线程做“在后台”的东西,你也可以使用空闲的回调。每当GTK +只是坐在等待输入时,它就会调用该函数。 – unwind
您也可以在每循环x毫秒的主循环中使用一个带有定时器的回调。有很多办法可以做事,例如一个现实的国际象棋游戏会运行自己的线程,一个简单的人轮流考虑x毫秒。有很多变化,海报纸牌游戏的确切工作是未知的。线程很复杂,并且很容易出现难以调试的问题,我给你提供了。使用什么取决于你的目标。 – RedComet
@RedComet以您的国际象棋游戏为例...我想做的不是让人们转向,除非电脑完成了所有的思考,实际上打了一张牌,不管花了多少时间......尽管如此,用户应该能够按下按钮,如退出按钮或新游戏按钮......让我知道你是否想要任何其他的鼓励。 – PALEN
嗯,它对我来说不是很清楚。 'gtk_main()'会运行直到调用gtk_main_quit()。如果您希望在窗口小部件上的“按钮按下”或“按钮释放”事件上执行某个功能,请注册要在该事件中触发的回调。还是你说这个处理程序在计算上太重了,以至于阻止了其他事件? –
@ another.anon.coward我想要做的不是退出回调函数,除非发生特定事件。在这种情况下,我不希望human_play函数结束,直到用户实际点击一张卡片并进行播放为止。窗口的退出按钮和其他小部件不应该被阻止。我希望我清楚,让我知道如果我需要更具体请 – PALEN