我如何“暂停”用户按下按钮的应用程序? GTK

问题描述 投票:0回答:1

我正在使用GTK 3.0在C语言中进行纸牌游戏。我有两个窗口的两个函数,openMenu()打开菜单,newGame()创建带有卡片表的新窗口。玩家正在与两个机器人进行比赛,这两个机器人将随机选择其牌。我需要玩家选择一张牌来开始游戏。打开菜单:

static void openMenu(int argc, char *argv[]){
GtkBuilder *builder;
GtkWidget *window;
GObject *button;
GError *error = NULL;

gtk_init(&argc, &argv);
builder = gtk_builder_new_from_file("menu_window_glade.glade");
window = GTK_WIDGET(gtk_builder_get_object(builder, "menu_window"));
gtk_builder_connect_signals(builder, NULL);
gtk_widget_show(window);

gtk_main();}

新游戏:

void newGame(){

GtkBuilder *builder;
GtkWidget *window;
GtkImage *image;
widgetsPtrs *widgets = malloc(sizeof(widgetsPtrs));
char imageStr[] = "image00";
char aImgstr[] = "A0";
char dImgstr[] = "D0";
builder = gtk_builder_new_from_file("game_glade.glade");
window = GTK_WIDGET(gtk_builder_get_object(builder, "game_glade_window"));
gtk_builder_connect_signals(builder, NULL);
gtk_widget_show(window);

shuffleTheDeck();
printAll(Deck);

card *player = malloc(sizeof(card));
card *leftBot = malloc(sizeof(card));
card *rightBot = malloc(sizeof(card));

deal(player, 0);
deal(leftBot, 0);
deal(rightBot, 0);

/***************Puts images into buttons***********/
tmpCard = player;
for (size_t i = 0; i < 6; i++)
{
 tmpCard = tmpCard->next;
 imgPath[20] = zero + tmpCard->rank; 
 imgPath[21] = zero + tmpCard->suit;
 gtk_image_set_from_file(GTK_IMAGE(widgets->w_playersHandPtr[i]), imgPath);   
}

int a = firstTurnCheck();
playersTurn(player, leftBot, rightBot);}

问题出在这里:我想到了一个循环,只有在更改全局布尔值(在单击事件中使用的函数中将其更改)时,该循环才能被打破。 但是,没有显示带有游戏桌的窗口,因此我无法单击任何按钮,因此该应用程序冻结。

void playersTurn(card *player, card *leftBot, card *rightBot){
bool DEFENDERTOOKTHECARDS = false;
bool RBHASMORE = true;
PLAYERCHOOSING = true;
int attackCounter = 0;
int *appearedRanks = calloc(9, sizeof(int));
card *cardsOnTheTable = malloc(sizeof(card)); //cardsOnTheTable[0] is a pointer to the table
char answer;

puts("Player's Turn");
puts("Choose a card.");
/*****************The spot where the mistake might be****************/
while(PLAYERCHOOSING);//PLAYERCHOOSING is a global bool.
puts("You've chosen a card.");}

On_card_click函数:

void on_card_clicked(GtkButton *button,
         gpointer *data){ 

gtk_widget_hide(GTK_WIDGET(data));PLAYERCHOOSING = false;}

c user-interface gtk gtk3
1个回答
1
投票

除其他事项外,此行是一个问题:(正如您在评论中所猜测的。)

while(PLAYERCHOOSING);//PLAYERCHOOSING is a global bool.

它将进入,永不离开。至少它应该具有检查标记以查看是否已按下按钮的能力:

while(PLAYERCHOOSING)
{
    if(buttonToggled)//define as another global boolean value, and set when button is pressed
    {
        PLAYERCHOOSING = false;
        buttonToggled = false;
    }
    else Sleep(1000); //sleep for 1 second
}

一种更好的方法是在主线程中运行用户界面,然后将内务处理(按钮按下检测和处理)放在第二个线程中。回调函数可以定义为按钮按下处理程序。(void on_card_clicked(GtkButton *button, gpointer *data)似乎是一个回调。)

© www.soinside.com 2019 - 2024. All rights reserved.