📄 llk_main.c
字号:
GdkPixbuf *pixbuf; GdkRectangle update_rect; gint i; gint width,height; if(p1.x == p2.x) { if(p1.y < p2.y) for(i=p1.y; i<p2.y; i++) { pixbuf = gdk_pixbuf_new_from_inline(-1,horizon_inline,FALSE,NULL); width = gdk_pixbuf_get_width(pixbuf); height = gdk_pixbuf_get_height(pixbuf); gdk_pixbuf_render_to_drawable_alpha(pixbuf,ui_double_pixmap, 0,0,UI_FIXED_START_DRAW_LEFT - algorithm_game.difficulty*40 + i*40 + 20,UI_FIXED_START_DRAW_TOP + p1.x*50, width,height, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_pixbuf_unref(pixbuf); } else for(i=p2.y; i<p1.y; i++) { pixbuf = gdk_pixbuf_new_from_inline(-1,horizon_inline,FALSE,NULL); width = gdk_pixbuf_get_width(pixbuf); height = gdk_pixbuf_get_height(pixbuf); gdk_pixbuf_render_to_drawable_alpha(pixbuf,ui_double_pixmap, 0,0,UI_FIXED_START_DRAW_LEFT - algorithm_game.difficulty*40 + i*40 + 20,UI_FIXED_START_DRAW_TOP + p1.x*50, width,height, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_pixbuf_unref(pixbuf); } } else /*p1.y == p2.y*/ { if(p1.x < p2.x) for(i=p1.x; i<p2.x; i++) { pixbuf = gdk_pixbuf_new_from_inline(-1,vertical_inline,FALSE,NULL); width = gdk_pixbuf_get_width(pixbuf); height = gdk_pixbuf_get_height(pixbuf); gdk_pixbuf_render_to_drawable_alpha(pixbuf,ui_double_pixmap, 0,0,UI_FIXED_START_DRAW_LEFT - algorithm_game.difficulty*40 + p1.y*40,UI_FIXED_START_DRAW_TOP + i*50 + 25, width,height, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_pixbuf_unref(pixbuf); } else for(i=p2.x; i<p1.x; i++) { pixbuf = gdk_pixbuf_new_from_inline(-1,vertical_inline,FALSE,NULL); width = gdk_pixbuf_get_width(pixbuf); height = gdk_pixbuf_get_height(pixbuf); gdk_pixbuf_render_to_drawable_alpha(pixbuf,ui_double_pixmap, 0,0,UI_FIXED_START_DRAW_LEFT - algorithm_game.difficulty*40 + p1.y*40,UI_FIXED_START_DRAW_TOP + i*50 + 25, width,height, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_pixbuf_unref(pixbuf); } } /*重绘窗口*/ update_rect.x = 0; update_rect.y = 0; update_rect.width = ui_drawingarea->allocation.width; update_rect.height = ui_drawingarea->allocation.height; gtk_widget_draw (ui_drawingarea, &update_rect); }void ui_link(struct AlgorithmPoint p1, struct AlgorithmPoint p2){ if(algorithm_can_direct_link(p1,p2)) { ui_draw_line(p1,p2); } else { struct AlgorithmPoint p3,p4; algorithm_can_link(p1,p2,&p3,&p4); ui_draw_line(p1,p3); if(p3.x != p4.x || p3.y != p4.y)ui_draw_line(p3,p4); ui_draw_line(p4,p2); } }/* 作弊*/void ui_game_cheat(GtkWidget *w,gpointer data){ if(algorithm_game.status != ALGORITHM_GAME_STOP) { algorithm_game.life = 99; algorithm_game.hint = 99; time_remain = ui_get_time_limited(); ui_refresh_top(); }}/* 使用自己的牌面图案*/void ui_use_mycards(GtkWidget *w,gpointer data){ GtkWidget *dialog; GtkMessageType type; static gint count = 0; gchar *message = (gchar *)g_malloc(sizeof(gchar)*100); gchar *filename; /*用count,是为了放置在本函数中重设active时,会再次触发本函数而弹出两次警告窗口*/ if(count == 0) { count ++; } else { g_free(message); return; } if(algorithm_game.status == ALGORITHM_GAME_RUN) { sprintf(message,"不要了吧,游戏中切换可能导致图案混乱,你只能在游戏停止或暂停时切换!"); type = GTK_MESSAGE_INFO; } else { if(gtk_check_menu_item_get_active(item_use_mycards)) { type = GTK_MESSAGE_INFO; /*打开文件*/ dialog = gtk_file_chooser_dialog_new ("选择牌面图片", GTK_WINDOW(w), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); if(ui_pixbuf)gdk_pixbuf_unref(ui_pixbuf); ui_pixbuf = gdk_pixbuf_new_from_file(filename,NULL); if(ui_pixbuf) { if(gdk_pixbuf_get_width(ui_pixbuf) == 1656 && gdk_pixbuf_get_height(ui_pixbuf) == 110) { sprintf(message,"切换牌面成功!"); } else { sprintf(message,"\'%s\'的尺寸不对,应该是1656×110!!\n切换失败,仍使用默认牌面.",filename); gdk_pixbuf_unref(ui_pixbuf); ui_pixbuf = gdk_pixbuf_new_from_inline(-1,image_cards_inline,FALSE,NULL); gtk_check_menu_item_set_active (item_use_mycards,FALSE); } } else { sprintf(message,"打开文件\'%s\'时出错!\n切换失败,仍使用默认牌面.",filename); ui_pixbuf = gdk_pixbuf_new_from_inline(-1,image_cards_inline,FALSE,NULL); gtk_check_menu_item_set_active (item_use_mycards,FALSE); } g_free(filename); } else { gtk_check_menu_item_set_active(item_use_mycards,FALSE); sprintf(message,"您放弃了选择图片操作,牌面图片不变."); } gtk_widget_destroy (dialog); } else { sprintf(message,"您取消了自定义牌面,以后将使用默认牌面."); type = GTK_MESSAGE_WARNING; if(ui_pixbuf)gdk_pixbuf_unref(ui_pixbuf); ui_pixbuf = gdk_pixbuf_new_from_inline(-1,image_cards_inline,FALSE,NULL); } } dialog = gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,type,GTK_BUTTONS_OK,message); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_free(message); count = 0;}/* 创建一个适当大小的后端位图 */static gintconfigure_event (GtkWidget *widget, GdkEventConfigure *event){ if (ui_double_pixmap) gdk_pixmap_unref(ui_double_pixmap); ui_double_pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); gdk_draw_rectangle (ui_double_pixmap, widget->style->black_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); return TRUE;}/* 从后端位图重新绘制屏幕 */static gintexpose_event (GtkWidget *widget, GdkEventExpose *event){ gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], ui_double_pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE;}/* 主函数,创建窗体,进入消息循环。 注意,其中创建fixed之后,给全局变量llk_fixed赋值.*/int main (int argc , char* argv[]){ GtkWidget *window; GtkWidget *main_vbox,*vbox,*hbox; GtkWidget *menubar; GdkPixbuf *pixbuf; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window),"delete_event", G_CALLBACK(gtk_main_quit),NULL); gtk_window_set_title(GTK_WINDOW(window),"连连看-linux Version 1.0 by Alpher"); gtk_window_set_default_size(GTK_WINDOW(window),770+4,600+30); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_window_set_policy(GTK_WINDOW(window),TRUE,FALSE,FALSE); pixbuf = gdk_pixbuf_new_from_inline(-1,logo_inline,FALSE,NULL); gtk_window_set_icon(GTK_WINDOW(window),pixbuf); main_vbox = gtk_vbox_new(FALSE,1); gtk_container_set_border_width(GTK_CONTAINER(main_vbox),1); gtk_container_add(GTK_CONTAINER(window),main_vbox); gtk_widget_show(main_vbox); /*这里处理菜单*/ vbox = gtk_vbox_new(FALSE,1); gtk_container_set_border_width(GTK_CONTAINER(vbox),1); gtk_box_pack_start(GTK_BOX(main_vbox),vbox,FALSE,TRUE,0); gtk_widget_show(vbox); get_main_menu(window,&menubar); /*第一个false是说菜单不填满整个main_vbox,最后的0,表示菜单栏于main_vbox上端之间的间距*/ gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,TRUE,0); gtk_widget_show(menubar); /*这里处理游戏区上方的信息*/ hbox = gtk_hbox_new(FALSE,1); gtk_box_pack_start(GTK_BOX(main_vbox),hbox,FALSE,TRUE,0); gtk_widget_show(hbox); ui_top.label_difficulty = gtk_label_new_with_mnemonic("难度:"); gtk_widget_set_size_request(ui_top.label_difficulty,100,20); gtk_label_set_justify(GTK_LABEL(ui_top.label_difficulty),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_difficulty,FALSE,FALSE,0); gtk_widget_show(ui_top.label_difficulty); ui_top.label_level = gtk_label_new_with_mnemonic("级别:"); gtk_widget_set_size_request(ui_top.label_level,100,20); gtk_label_set_justify(GTK_LABEL(ui_top.label_level),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_level,FALSE,FALSE,0); gtk_widget_show(ui_top.label_level); ui_top.label_change_type = gtk_label_new_with_mnemonic("变化类型:"); gtk_widget_set_size_request(ui_top.label_change_type,200,20); gtk_label_set_justify(GTK_LABEL(ui_top.label_change_type),GTK_JUSTIFY_CENTER); gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_change_type,FALSE,FALSE,0); gtk_widget_show(ui_top.label_change_type); ui_top.label_score = gtk_label_new_with_mnemonic("0"); gtk_widget_set_size_request(ui_top.label_score,100,20); gtk_label_set_justify(GTK_LABEL(ui_top.label_score),GTK_JUSTIFY_LEFT); gtk_box_pack_end(GTK_BOX(hbox),ui_top.label_score,FALSE,FALSE,0); gtk_widget_show(ui_top.label_score); hbox = gtk_hbox_new(FALSE,1); gtk_box_pack_start(GTK_BOX(main_vbox),hbox,FALSE,TRUE,0); gtk_widget_show(hbox); ui_top.label_life = gtk_label_new_with_mnemonic("生命:"); gtk_widget_set_size_request(ui_top.label_life,100,20); gtk_label_set_justify(GTK_LABEL(ui_top.label_life),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_life,FALSE,FALSE,0); gtk_widget_show(ui_top.label_life); ui_top.label_hint = gtk_label_new_with_mnemonic("提示:"); gtk_widget_set_size_request(ui_top.label_hint,100,20); gtk_label_set_justify(GTK_LABEL(ui_top.label_hint),GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_hint,FALSE,FALSE,0); gtk_widget_show(ui_top.label_hint); ui_top.progress_bar = gtk_progress_bar_new(); gtk_widget_set_size_request(ui_top.progress_bar,200,20); gtk_box_pack_start(GTK_BOX(hbox),ui_top.progress_bar,FALSE,FALSE,0); gtk_widget_show(ui_top.progress_bar); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ui_top.progress_bar),0); /*这里处理游戏区*/ vbox = gtk_vbox_new(FALSE,1); gtk_container_set_border_width(GTK_CONTAINER(vbox),0); gtk_box_pack_start(GTK_BOX(main_vbox),vbox,FALSE,TRUE,0); gtk_widget_show(vbox); ui_drawingarea = gtk_drawing_area_new(); gtk_widget_set_size_request(ui_drawingarea,770,550); gtk_box_pack_start( GTK_BOX(main_vbox),ui_drawingarea,FALSE,TRUE,0); gtk_signal_connect (GTK_OBJECT (ui_drawingarea), "expose_event", (GtkSignalFunc) expose_event, NULL); gtk_signal_connect (GTK_OBJECT(ui_drawingarea),"configure_event", (GtkSignalFunc) configure_event, NULL); gtk_signal_connect (GTK_OBJECT (ui_drawingarea), "button_press_event", (GtkSignalFunc) ui_drawingarea_clicked, NULL); gtk_widget_set_events (ui_drawingarea, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_HINT_MASK); /*绘制并显示背景图片,undo*/ /*main_fixed_draw_bg(nameofthepic);*/ gtk_widget_show(ui_drawingarea); ui_pixbuf = gdk_pixbuf_new_from_inline(-1,image_cards_inline,FALSE,NULL); gtk_widget_show(window); ui_game_init(); /*初始化,准备开始游戏*/ gtk_main(); /*进入消息循环*/ return FALSE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -