void gui_draw(struct gui *G) { dword x=0; dword entry=0; dword cy=4; dword cx=3; byte *text; gui_base(G); current=G->first; G->tmp=(G->gui1)+(cy*G->width)+cx; while((current)&&(cy<G->height)) { text=current->item; for(x=0;x<8;x++) { G->rc=x; if(G->select==entry) { gui_text(G,text,G->scol); } else { gui_text(G,text,G->bkcol); } cy++; G->tmp=(G->tmp)+(G->width); } current=current->next; entry++; } gui_render(&gui_bitmap); }
/** * @brief Renders the game itself (player flying around and friends). * * Blitting order (layers): * - BG * - stars and planets * - background player stuff (planet targetting) * - background particles * - back layer weapons * - N * - NPC ships * - front layer weapons * - normal layer particles (above ships) * - FG * - player * - foreground particles * - text and GUI */ static void render_all (void) { double dt; dt = (paused) ? 0. : game_dt; /* setup */ spfx_begin(dt); /* BG */ space_render(dt); planets_render(); weapons_render(WEAPON_LAYER_BG, dt); /* N */ pilots_render(dt); weapons_render(WEAPON_LAYER_FG, dt); spfx_render(SPFX_LAYER_BACK); /* FG */ player_render(dt); spfx_render(SPFX_LAYER_FRONT); space_renderOverlay(dt); spfx_end(); gui_render(dt); display_fps( real_dt ); /* Exception. */ }
static void render_gui(Renderer * renderer, GUI * gui) { gui_render(gui); }
//Render for States void state_render () { if (state_switched) return; if (state_terminated) return; state_to_render = 1; state_to_force_render = 0; //To Set up for Transition Render if (state_trans_curf >= 0) { if (rbufferorig == NULL) rbufferorig = al_clone_bitmap (rbuffer); if (transrbuffer == NULL) transrbuffer = al_clone_bitmap (rbuffer); } //Common for All Games al_set_target_bitmap (rbuffer); handlers[state].proc_render (); //Transition Render if (state_trans_curf >= 0 && state_trans_curf < state_trans_totf && strans && rbufferorig && transrbuffer) { strans (rbufferorig, rbuffer, transrbuffer, state_trans_curf++, state_trans_totf); state_to_force_render = 1; } //To Destroy Transition if (strans && (state_trans_curf >= state_trans_totf)) { trans_stop (); state_to_force_render = 1; } //Switch Modes if (state_to_switch_render) init_screen (); //This is Because of GUI. state_to_force_render = 1; if (state_to_force_render || state_to_switch_render || state_to_render) { //Render to Screen al_set_target_backbuffer (screen); if (transrbuffer) blit (transrbuffer, 0, 0, 0, 0, xres, yres, 0); else blit (rbuffer, 0, 0, 0, 0, xres, yres, 0); gui_render (); #ifdef LINUX //VSync helped remove bad artifacts in Linux al_wait_for_vsync (); #endif //LINUX al_flip_display (); } state_to_switch_render = 0; }
int main(int argc, char *argv[]) { /* gui structures */ struct gui_state gstate; struct gui_dialog_info dialog; struct gui_dialog_item dialog_msg; /* temps */ int c; int yn_selected; int res; int next_index; /* status */ int running; unsigned tick; /* global options */ /* int server; */ /* constants */ const int check[] = {0x6E, 0x69, 0x67, 0x67, 0x61}; #ifdef USING_WINDOWS /* windows-only vars */ HANDLE console_buffer; CONSOLE_SCREEN_BUFFER_INFO old_console_info; COORD console_size; SMALL_RECT console_window; LPTSTR error_string = NULL; DWORD error; /* get console handle */ console_buffer = GetStdHandle(STD_OUTPUT_HANDLE); /* store old console information */ res = GetConsoleScreenBufferInfo(console_buffer, &old_console_info); if (!res) { error = GetLastError(); res = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, res, 0, error_string, 256, NULL); if (!res || error_string == NULL) { fprintf(stderr, "Setting console size to maximum of (%d, %d) failed, error code %d\n", console_size.X, console_size.Y, (int) error); } else { fprintf(stderr, "Setting console size to maximum of (%d, %d) failed:\n%s\n", console_size.X, console_size.Y, error_string); } return -1; } /* make console fill the screen */ console_size = GetLargestConsoleWindowSize(console_buffer); console_size.X -= 2; console_size.Y -= 2; res = SetConsoleScreenBufferSize(console_buffer, console_size); if (!res) { error = GetLastError(); res = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, res, 0, error_string, 256, NULL); if (!res || error_string == NULL) { fprintf(stderr, "Setting console size to maximum of (%d, %d) failed, error code %d\n", console_size.X, console_size.Y, (int) error); } else { fprintf(stderr, "Setting console size to maximum of (%d, %d) failed:\n%s\n", console_size.X, console_size.Y, error_string); } return -1; } console_window.Left = 0; console_window.Top = 0; console_window.Right = console_size.X - 1; console_window.Bottom = console_size.Y - 1; res = SetConsoleWindowInfo(console_buffer, TRUE, &console_window); if (!res) { error = GetLastError(); res = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, res, 0, error_string, 256, NULL); if (!res || error_string == NULL) { fprintf(stderr, "Setting console size to maximum of (%d, %d) failed, error code %d\n", console_size.X, console_size.Y, (int) error); } else { fprintf(stderr, "Setting console size to maximum of (%d, %d) failed:\n%s\n", console_size.X, console_size.Y, error_string); } return -1; } #endif /* process args (none supported currently) */ if (argc > 1) { fprintf(stderr, "unrecognised argument(s)\n"); return -1; } /* init curses */ initscr(); /* give warning dialog if colours are not supported */ if (has_colors() == FALSE) { /* set up message */ dialog_msg.type = GUI_DIALOG_ITEM_MESSAGE; dialog_msg.str = "Your terminal doesn't support colours. This will look REALLY weird. Continue? (y/n)"; /* set up dialog info */ dialog.items = &dialog_msg; dialog.num_items = 1; dialog.title = "No colours!"; dialog.centered = 1; dialog.autosize = 1; /* render dialog */ gui_render_dialog(&dialog, -1); /* ask for y/n */ yn_selected = 0; while (!yn_selected) { c = wgetch(stdscr); /* continue as normal if 'y' hit */ if (c == 'y' || c == 'Y') { yn_selected = 1; /* quit program if 'n' hit */ } else if (c == 'n' || c == 'N') { erase(); refresh(); endwin(); return 0; } } /* if colours are supported, init them */ } else { start_color(); colours_init(); } /* non-blocking read */ timeout(0); /* F-key support */ keypad(stdscr, TRUE); /* no line buffering */ raw(); /* detect return key */ nonl(); /* non-echoing getch */ noecho(); /* fill GUI state with default attributes */ gui_default_state(&gstate); /* main loop */ running = 1; tick = 0; next_index = 0; while (running) { ++tick; /* push GUI to screen */ res = gui_render(&gstate); if (res != 0) { endwin(); fprintf(stderr, "tick %d:\ngui_render failed\n", tick); return -1; } /* receive input (ERR received if none) */ c = wgetch(stdscr); /* none received, back to top */ if (c == ERR) { continue; } /* key combination check algorithm (no effect yet) */ if (c == check[next_index]) { ++next_index; if (next_index == 5) { next_index = 0; } } else { next_index = 0; } switch (c) { case 'q': /* send to quit confirmation, if already there then quit */ if (gstate.focus != GUI_FOCUS_QUIT_CONFIRM) { gstate.focus = GUI_FOCUS_QUIT_CONFIRM; } else { running = 0; } break; /* curses seems to use \r instead of KEY_ENTER */ case '\r': switch (gstate.focus) { case GUI_FOCUS_MAIN_MENU: if (gstate.selected_item >= gstate.main_menu_dialog.num_items) { endwin(); fprintf(stderr, "Index of selected dialog item (%d) out of range (main menu), max is %d\n", gstate.selected_item, gstate.main_menu_dialog.num_items); return -1; } gstate.main_menu_dialog.items[gstate.selected_item].callback(&gstate, NULL); break; case GUI_FOCUS_QUIT_CONFIRM: running = 0; default: break; } break; case KEY_UP: switch (gstate.focus) { case GUI_FOCUS_MAIN_MENU: --gstate.selected_item; if (gstate.selected_item < 0) { gstate.selected_item = gstate.main_menu_dialog.num_items - 1; } default: break; } break; case KEY_DOWN: switch (gstate.focus) { case GUI_FOCUS_MAIN_MENU: ++gstate.selected_item; if (gstate.selected_item >= gstate.main_menu_dialog.num_items) { gstate.selected_item = 0; } default: break; } default: break; } } /* show end splash, quit curses and stop normally */ gui_render_endscreen(); timeout(-1); wgetch(stdscr); erase(); refresh(); endwin(); #ifdef USING_WINDOWS /* attempt to restore previous console size + position */ console_window = old_console_info.srWindow; SetConsoleWindowInfo(console_buffer, TRUE, &console_window); console_size = old_console_info.dwSize; SetConsoleScreenBufferSize(console_buffer, console_size); /* clear */ system("cls"); #endif return 0; }