2014-10-05 18 views
0

Iam新增至c和gu中c。這是我的問題。 這兩個函數都可以獨立正常工作,但是當我按下按鍵時,snake_move函數不會改變它的關鍵值。窗口小部件在執行時甚至不會打開。 如果我不叫蛇移動的每一件事情都很好,即key_event工作!如何更改代碼,以便在按下任何箭頭鍵時,snake_call函數中的key_val會發生變化?當按下任何箭頭鍵時更改函數中的變量

在此先感謝

//Detects the key and puts the value to new 
static gboolean 
key_event(GtkWidget *widget, GdkEventKey *event ,int* new) { 
    if(strcmp(gdk_keyval_name (event->keyval),"Up")==0) { 
     *new = 8; 
     printf("%d\n",*new); 
    } else if(strcmp(gdk_keyval_name (event->keyval),"Down")==0) { 
     *new=2; 
     printf("%d\n",*new); 
    } else if(strcmp(gdk_keyval_name (event->keyval),"Right")==0) { 
     *new=6; 
     printf("%d\n",*new); 
    } else if(strcmp(gdk_keyval_name (event->keyval),"Left")==0) { 
     *new=4; 
     printf("%d\n",*new); 
    } 
    return FALSE; 
} 
//Moves the snake by one bit in the direction specified by new (*new = 8 means up so on 
void snake_loop(int**arr,int lenth,int*new,int*pos_x ,int *pos_y) { 
    int x_pos,y_pos,key_value; 
    x_pos=*pos_x ;y_pos =*pos_y; 
    while(1) { 
     key_value = *new; 
     snake_move(arr ,&lenth ,key_value,&x_pos ,&y_pos); 
     sleep(1); 
    } 
} 

回答

0

你應該重新設計你的遊戲邏輯:GTK +是一個事件驅動系統,以便循環,如一個在snake_loop()是一個很大的禁忌:關鍵事件處理代碼永遠不會被調用是因爲執行被阻塞在永不結束的循環中。如果概念是新的,首先閱讀關於事件驅動編程的概念是很有意義的。

您應該啓動GTK +主循環(使用gtk_main()),並將您的代碼放在基於系統事件調用的短期處理函數中。一個例子是發生的計時器事件,例如,每秒一次:該定時器事件的處理函數可以更新蛇的位置。您可以使用g_timeout_add_seconds()來設置定時器。

或者,您可以爲您的遊戲邏輯創建另一個線程,但這更困難,而且您迄今爲止所顯示的任何內容都表明您需要該線程。