2011-11-20 4 views
0

GTK로 카드 게임을 프로그래밍 중입니다. 사용자가 카드를 클릭 할 때까지 함수 (예 : human_play 함수)를 종료하지 않는 루프를 만드는 방법이 있습니까? 즉, 사용자가 함수를 반환하고 후속 코드를 계속 실행하기 위해 사용자가 카드를 클릭 할 때까지 기다리는 것과 같습니다 (종료하는 동안 버튼 및 기타 이벤트 위젯을 차단하지 않음).GTK - 후속 코드를 계속 실행하기 위해 이벤트가 발생할 때까지 기다림

더 명확히 할 수 있는지 알려주세요. 답변은 매우 감사하겠습니다.

+1

흠 나는 그다지 분명하지 않습니다. 'gtk_main()'은'gtk_main_quit()'이 호출 될 때까지 실행됩니다.위젯의 "버튼 누르기"또는 "버튼 놓기"이벤트에서 함수를 실행하려면 해당 이벤트에서 트리거 될 콜백을 등록하십시오. 아니면 처리기가 계산에 너무 무거워서 다른 이벤트를 차단하지 않는다고 말하고 있습니까? –

+0

@ another.anon.coward 특정 이벤트가 발생하지 않는 한 콜백 함수를 종료하지 말고 싶습니다. 이 경우, 사용자가 실제로 카드를 클릭하고 자신의 플레이를하기 전까지는 휴먼 플레이 기능이 종료되기를 원하지 않습니다 ... 종료 버튼과 다른 창 부품은 차단되어서는 안됩니다. 내가 분명하다면 좀 더 구체적으로 알려주 길 바란다. – 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 권고가 이해 그리워

.

작동하는 프로토 타입을 구현 했습니까? 예를 들어 게임 엔진의 텍스트 버전을 의미합니까? 거푸집없이 어느 솔기가 돌아가는지.

작업 기반 엔진이 적절한 경우 GTK UI의 콜백을 사용하여 이벤트를 처리 할 수 ​​있어야합니다. 원하는 UI의 부분에 설정)

한 순서

2 일을 해당 콜백에 버튼 클릭 이벤트를 연결하는 예를 들어

당신이 그 (것)들을 식별하기 위해 카드 이미지 일부 GtkButton이있는 경우

, 컴퓨터가 생각하는 동안 무감각으로 해제하십시오. 관련 위젯과 함께 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

관련 문제