2011-11-20 56 views
0

我正在用GTK编写纸牌游戏。有没有办法创建一个不会退出函数的循环(例如human_play函数),直到用户点击一张卡片?我的意思是,它就像等待用户点击一张卡片(同时这样做,而不是阻止退出按钮和其他事件小部件),以便函数返回并继续运行后续代码。GTK - 等待事件发生才能继续运行后续代码

让我知道我是否可以更清楚。回应将非常感激。

+1

嗯,它对我来说不是很清楚。 'gtk_main()'会运行直到调用gtk_main_quit()。如果您希望在窗口小部件上的“按钮按下”或“按钮释放”事件上执行某个功能,请注册要在该事件中触发的回调。还是你说这个处理程序在计算上太重了,以至于阻止了其他事件? –

+0

@ another.anon.coward我想要做的不是退出回调函数,除非发生特定事件。在这种情况下,我不希望human_play函数结束,直到用户实际点击一张卡片并进行播放为止。窗口的退出按钮和其他小部件不应该被阻止。我希望我清楚,让我知道如果我需要更具体请 – PALEN

回答

0

看起来你想要的是一个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 
} 
+0

你不需要使用线程做“在后台”的东西,你也可以使用空闲的回调。每当GTK +只是坐在等待输入时,它就会调用该函数。 – unwind

+0

您也可以在每循环x毫秒的主循环中使用一个带有定时器的回调。有很多办法可以做事,例如一个现实的国际象棋游戏会运行自己的线程,一个简单的人轮流考虑x毫秒。有很多变化,海报纸牌游戏的确切工作是未知的。线程很复杂,并且很容易出现难以调试的问题,我给你提供了。使用什么取决于你的目标。 – RedComet

+0

@RedComet以您的国际象棋游戏为例...我想做的不是让人们转向,除非电脑完成了所有的思考,实际上打了一张牌,不管花了多少时间......尽管如此,用户应该能够按下按钮,如退出按钮或新游戏按钮......让我知道你是否想要任何其他的鼓励。 – PALEN

相关问题