2011-11-20 102 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