/****************************************************************************** * FILE: main.cc * The main function and general functionality of the tetris game. * * Author: Dana Vrajitoru, IUSB * Class: C481 B581 Computer Graphics ******************************************************************************/ #include using namespace std; #include #include #include #include "tetris_brick.h" #include "gui_handle.h" #include "draw.h" gint Next_frame(gpointer data); void Connect_signals(GtkWidget *app, GtkWidget *area); gint Event_press_key(GtkWidget *widget, GdkEvent *event, gpointer data); void Event_move_left(GtkWidget *widget); void Event_move_right(GtkWidget *widget); void Event_drop(GtkWidget *widget); void New_game(); void Change_statusbar(char *message); Table_type the_table; Tetris_brick the_brick; int game_end = 0; GtkWidget *status_bar; const int INTERVAL = 300; int main(int argc, char **argv) { int i; GtkWidget *app; GtkWidget *area; srand(time(NULL)); gnome_init("tetris", "1.0", argc, argv); app = gnome_app_new("tetris", "Gnome Tetris"); Make_menus(app); area = gtk_drawing_area_new(); gtk_widget_set_usize(area, T_WIDTH*C_WIDTH, T_HEIGHT*C_HEIGHT); gnome_app_set_contents(GNOME_APP(app),area); status_bar = gtk_statusbar_new(); gnome_app_set_statusbar(GNOME_APP(app), status_bar); Change_statusbar("A simple Tetris game"); Insert_menu(app); Connect_signals(app, area); gtk_widget_show_all(app); Init_gc(area); Init_pixmaps(area); Make_empty_table(the_table); Draw_table(the_table); Draw_brick(the_brick); //Test_pixmaps(area); //gtk_signal_connect(GTK_OBJECT(area), "event", // GTK_SIGNAL_FUNC(Event_draw), NULL); gtk_timeout_add(INTERVAL, Next_frame, (gpointer) area); gtk_main(); exit(0); } // Defines the events to be applied to the application. void Connect_signals(GtkWidget *app, GtkWidget *area) { gtk_signal_connect(GTK_OBJECT(app), "delete_event", GTK_SIGNAL_FUNC(Event_delete), NULL); gtk_signal_connect(GTK_OBJECT(app), "destroy", GTK_SIGNAL_FUNC(Event_destroy), NULL); gtk_signal_connect(GTK_OBJECT(app), "key_press_event", GTK_SIGNAL_FUNC(Event_press_key), (gpointer)area); } // The most important function in the game that defines the next move. gint Next_frame(gpointer data) { int old_x, old_y; if (!game_end) { old_x = the_brick.pos_x; old_y = the_brick.pos_y; if (!the_brick.Move_down(the_table)) { the_brick.Write_brick(the_table); the_brick.Set_brick(); if (!the_brick.Check_position(the_table)) game_end = 1; } else { Erase_brick(the_brick, old_x, old_y); Draw_brick(the_brick); } Draw((GtkWidget *)data); } } // Callback for a key being pressed. gint Event_press_key(GtkWidget *widget, GdkEvent *event, gpointer data) { GdkEventKey *key = (GdkEventKey *) event; if (key->keyval == GDK_Left) Event_move_left((GtkWidget *)data); else if (key->keyval == GDK_Right) Event_move_right((GtkWidget *)data); else if (key->keyval == GDK_space) Event_drop((GtkWidget *)data); } // Move the brick to the left. void Event_move_left(GtkWidget *widget) { int old_x = the_brick.pos_x; int old_y = the_brick.pos_y; if (the_brick.Move_left(the_table)) { Erase_brick(the_brick, old_x, old_y); Draw_brick(the_brick); Draw(widget); } } // Move the brick to the right. void Event_move_right(GtkWidget *widget) { int old_x = the_brick.pos_x; int old_y = the_brick.pos_y; if (the_brick.Move_right(the_table)) { Erase_brick(the_brick, old_x, old_y); Draw_brick(the_brick); Draw(widget); } } // Move the brick all the way down. void Event_drop(GtkWidget *widget) { int old_x = the_brick.pos_x; int old_y = the_brick.pos_y; while (the_brick.Move_down(the_table)); Erase_brick(the_brick, old_x, old_y); Draw_brick(the_brick); Draw(widget); } void New_game() { game_end = 0; Make_empty_table(the_table); Draw_table(the_table); the_brick.Set_brick(); Draw_brick(the_brick); } // Function to update the score shown on the status bar gint Event_score(gpointer data) { char score_str[50]; // returning "true" keeps the timer going return (true); } void Change_statusbar(char *message) { int context_id; // get a context ID for successive calls context_id = gtk_statusbar_get_context_id((GtkStatusbar *)status_bar, "StatusBar"); // pop off the old message from the status bar stack gtk_statusbar_pop((GtkStatusbar *)status_bar, context_id); // push the message onto the status bar stack gtk_statusbar_push((GtkStatusbar *)status_bar, context_id, message); }