DWORD unix_process(DWORD lparam) { SDL_Event event; while( SDL_PollEvent(&event) ) { switch(event.type) { case SDL_ACTIVEEVENT: if( (event.active.state & SDL_APPACTIVE) || (event.active.state & SDL_APPINPUTFOCUS) ) { if (fAppActive != event.active.gain) { if(!Cmdline_no_unfocus_pause) { if (fAppActive) game_pause(); else game_unpause(); } } fAppActive = event.active.gain; gr_activate(fAppActive); } break; case SDL_KEYDOWN: /*if( (event.key.keysym.mod & KMOD_ALT) && (event.key.keysym.sym == SDLK_RETURN) ) { Gr_screen_mode_switch = 1; gr_activate(1); break; }*/ if( SDLtoFS2[event.key.keysym.sym] ) { key_mark( SDLtoFS2[event.key.keysym.sym], 1, 0 ); } break; case SDL_KEYUP: /*if( (event.key.keysym.mod & KMOD_ALT) && (event.key.keysym.sym == SDLK_RETURN) ) { Gr_screen_mode_switch = 0; break; }*/ if (SDLtoFS2[event.key.keysym.sym]) { key_mark( SDLtoFS2[event.key.keysym.sym], 0, 0 ); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if (event.button.button == SDL_BUTTON_LEFT) mouse_mark_button( MOUSE_LEFT_BUTTON, event.button.state ); else if (event.button.button == SDL_BUTTON_MIDDLE) mouse_mark_button( MOUSE_MIDDLE_BUTTON, event.button.state ); else if (event.button.button == SDL_BUTTON_RIGHT) mouse_mark_button( MOUSE_RIGHT_BUTTON, event.button.state ); break; case SDL_JOYHATMOTION: joy_set_hat_state( event.jhat.value ); break; case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: if (event.jbutton.button < JOY_NUM_BUTTONS) { joy_set_button_state( event.jbutton.button, event.jbutton.state ); } break; } } return 0; }
/* game_loop() has been turned into a SDL based loop. The code for one iteration of the original game_loop is in game_loop_iter. */ static void game_loop() { /* FPS */ int fps = 0; int fps_ema = 0; int fps_target = 25; const float ema_alpha = 0.003; int drag_button = 0; unsigned int last_down[3] = {0}; unsigned int last_click[3] = {0}; unsigned int current_ticks = SDL_GetTicks(); unsigned int accum = 0; unsigned int accum_frames = 0; SDL_Event event; gui_event_t ev; game_loop_run = 1; while (game_loop_run) { if (SDL_PollEvent(&event)) { switch (event.type) { case SDL_MOUSEBUTTONUP: if (drag_button == event.button.button) { ev.type = GUI_EVENT_TYPE_DRAG_END; ev.x = event.button.x; ev.y = event.button.y; ev.button = drag_button; gui_object_handle_event((gui_object_t *)&interface, &ev); drag_button = 0; } ev.type = GUI_EVENT_TYPE_BUTTON_UP; ev.x = event.button.x; ev.y = event.button.y; ev.button = event.button.button; gui_object_handle_event((gui_object_t *)&interface, &ev); if (event.button.button <= 3 && current_ticks - last_down[event.button.button-1] < MOUSE_SENSITIVITY) { ev.type = GUI_EVENT_TYPE_CLICK; ev.x = event.button.x; ev.y = event.button.y; ev.button = event.button.button; gui_object_handle_event((gui_object_t *)&interface, &ev); if (current_ticks - last_click[event.button.button-1] < MOUSE_SENSITIVITY) { ev.type = GUI_EVENT_TYPE_DBL_CLICK; ev.x = event.button.x; ev.y = event.button.y; ev.button = event.button.button; gui_object_handle_event((gui_object_t *)&interface, &ev); } last_click[event.button.button-1] = current_ticks; } break; case SDL_MOUSEBUTTONDOWN: ev.type = GUI_EVENT_TYPE_BUTTON_DOWN; ev.x = event.button.x; ev.y = event.button.y; ev.button = event.button.button; gui_object_handle_event((gui_object_t *)&interface, &ev); if (event.button.button <= 3) last_down[event.button.button-1] = current_ticks; break; case SDL_MOUSEMOTION: if (drag_button == 0) { /* Move pointer normally. */ interface_set_cursor(&interface, event.motion.x, event.motion.y); } for (int button = 1; button <= 3; button++) { if (event.motion.state & SDL_BUTTON(button)) { if (drag_button == 0) { drag_button = button; ev.type = GUI_EVENT_TYPE_DRAG_START; ev.x = event.motion.x; ev.y = event.motion.y; ev.button = drag_button; gui_object_handle_event((gui_object_t *)&interface, &ev); } ev.type = GUI_EVENT_TYPE_DRAG_MOVE; ev.x = event.motion.x; ev.y = event.motion.y; ev.button = drag_button; gui_object_handle_event((gui_object_t *)&interface, &ev); break; } } break; case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_q && (event.key.keysym.mod & KMOD_CTRL)) { game_loop_quit(); break; } switch (event.key.keysym.sym) { /* Map scroll */ case SDLK_UP: { viewport_t *viewport = interface_get_top_viewport(&interface); viewport_move_by_pixels(viewport, 0, -1); } break; case SDLK_DOWN: { viewport_t *viewport = interface_get_top_viewport(&interface); viewport_move_by_pixels(viewport, 0, 1); } break; case SDLK_LEFT: { viewport_t *viewport = interface_get_top_viewport(&interface); viewport_move_by_pixels(viewport, -1, 0); } break; case SDLK_RIGHT: { viewport_t *viewport = interface_get_top_viewport(&interface); viewport_move_by_pixels(viewport, 1, 0); } break; /* Panel click shortcuts */ case SDLK_1: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 0); } break; case SDLK_2: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 1); } break; case SDLK_3: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 2); } break; case SDLK_4: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 3); } break; case SDLK_5: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 4); } break; /* Game speed */ case SDLK_PLUS: case SDLK_KP_PLUS: if (game.game_speed < 40) game.game_speed += 1; LOGI("main", "Game speed: %u", game.game_speed); break; case SDLK_MINUS: case SDLK_KP_MINUS: if (game.game_speed >= 1) game.game_speed -= 1; LOGI("main", "Game speed: %u", game.game_speed); break; case SDLK_0: game.game_speed = DEFAULT_GAME_SPEED; LOGI("main", "Game speed: %u", game.game_speed); break; case SDLK_p: if (game.game_speed == 0) game_pause(0); else game_pause(1); break; /* Audio */ case SDLK_s: sfx_enable(!sfx_is_enabled()); break; case SDLK_m: midi_enable(!midi_is_enabled()); break; /* Misc */ case SDLK_ESCAPE: if (BIT_TEST(interface.click, 7)) { /* Building road */ interface_build_road_end(&interface); } else if (interface.clkmap != 0) { interface_close_popup(&interface); } break; /* Debug */ case SDLK_g: interface.viewport.layers ^= VIEWPORT_LAYER_GRID; break; case SDLK_j: { int current = 0; for (int i = 0; i < 4; i++) { if (interface.player == game.player[i]) { current = i; break; } } for (int i = (current+1) % 4; i != current; i = (i+1) % 4) { if (PLAYER_IS_ACTIVE(game.player[i])) { interface.player = game.player[i]; LOGD("main", "Switched to player %i.", i); break; } } } break; case SDLK_z: if (event.key.keysym.mod & KMOD_CTRL) { save_game(0); } break; default: break; } break; case SDL_QUIT: game_loop_quit(); break; } } unsigned int new_ticks = SDL_GetTicks(); int delta_ticks = new_ticks - current_ticks; current_ticks = new_ticks; accum += delta_ticks; while (accum >= TICK_LENGTH) { game_update(); /* Autosave periodically */ if ((game.const_tick % AUTOSAVE_INTERVAL) == 0 && game.game_speed > 0) { int r = save_game(1); if (r < 0) LOGW("main", "Autosave failed."); } /* FPS */ fps = 1000*((float)accum_frames / accum); if (fps_ema > 0) fps_ema = ema_alpha*fps + (1-ema_alpha)*fps_ema; else if (fps > 0) fps_ema = fps; if ((game.const_tick % (10*TICKS_PER_SEC)) == 0) { LOGV("main", "FPS: %i", fps_ema); } accum -= TICK_LENGTH; accum_frames = 0; } /* Update and draw interface */ interface_update(&interface); interface.flags &= ~BIT(4); interface.flags &= ~BIT(7); gui_object_redraw((gui_object_t *)&interface, game.frame); /* TODO very crude dirty marking algortihm: mark everything. */ sdl_mark_dirty(0, 0, sdl_frame_get_width(game.frame), sdl_frame_get_height(game.frame)); /* Swap video buffers */ sdl_swap_buffers(); accum_frames += 1; /* Reduce framerate to target */ if (fps_target > 0) { int delay = 0; if (fps_ema > 0) delay = (1000/fps_target) - (1000/fps_ema); if (delay > 0) SDL_Delay(delay); } } }
static void game (void) { int button; redraw(); rb->lcd_update(); /*main loop:*/ while (1) { if(frames==5) { frame(); if(frames > 0) frames = 0; } frames++; if(frames == 0) { die(); } else { if(frames < 0) { if(sillydir != dir) { /*it has, great set frames to a positive value again:*/ frames = 1; } } } if (dead) return; draw_apple(); rb->sleep(HZ/speed); button = rb->button_get(false); #ifdef HAS_BUTTON_HOLD if (rb->button_hold()) button = SNAKE2_PLAYPAUSE; #endif switch (button) { case SNAKE2_UP: case SNAKE2_UP | BUTTON_REPEAT: if (dir != SOUTH) set_direction(NORTH); break; case SNAKE2_RIGHT: case SNAKE2_RIGHT | BUTTON_REPEAT: if (dir != WEST) set_direction(EAST); break; case SNAKE2_DOWN: case SNAKE2_DOWN | BUTTON_REPEAT: if (dir != NORTH) set_direction(SOUTH); break; case SNAKE2_LEFT: case SNAKE2_LEFT | BUTTON_REPEAT: if (dir != EAST) set_direction(WEST); break; #ifdef SNAKE2_RC_QUIT case SNAKE2_RC_QUIT: #endif case SNAKE2_QUIT: quit = 1; return; case SNAKE2_PLAYPAUSE: game_pause(); break; default: if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { quit = 2; return; } break; } } }
/* Launch a dialog that asks OK/Cancel for a question, * pausing the game while it waits for input */ bool confirm(char *question) { int c; bool status=true; WINDOW *confirm; /* Cancel alarm */ alarm(0); game_pause(1); /* Only redraw the grid if the help isn't open */ if (!scrl_open) draw_grid(); redraw: confirm = newwin(row * 0.4, col * 0.7, row * 0.3, col * 0.15); /* Draw dialog */ wbkgd(confirm, COLOR_PAIR(C_DIALOG)); box(confirm, 0, 0); mvwaddstr(confirm, 0, col * 0.35 - 4, "Confirm"); mvwaddstr(confirm, 2, col * 0.35 - (strlen(question) / 2), question); /* Draw over top of everything */ overwrite(confirm, stats); /* Draw the options */ ungetch('h'); /* Handle input */ while ((c = getkey())) { switch (c) { case KEY_RESIZE: getmaxyx(stdscr, row, col); draw_all(); goto redraw; case KEY_LEFT: case KEY_RIGHT: case 'h': case 'l': case 'a': case 'd': case CTRL('f'): case CTRL('b'): wattrset(confirm, A_REVERSE); if (!status) { mvwaddstr(confirm, (row * 0.4) -3, col *0.35 - 9, " OK "); wattroff(confirm, A_REVERSE); mvwaddstr(confirm, (row * 0.4) -3, col *0.35, " Cancel "); } else { mvwaddstr(confirm, (row * 0.4) -3, col *0.35, " Cancel "); wattroff(confirm, A_REVERSE); mvwaddstr(confirm, (row * 0.4) -3, col *0.35 - 9, " OK "); } status = !status; wrefresh(confirm); break; /* Enter pressed */ case 10: werase(confirm); delwin(confirm); if (!scrl_open) { game_pause(0); } catch_alarm(0); fbar_time=0; return status; default: break; } } return 0; }
/* Launch a dialog that asks user for a string (e.g name) */ char *getstring(char *question) { int c, width, apos=0; WINDOW *dialog; char *answer; /* Cancel alarm */ alarm(0); game_pause(1); draw_grid(); scrl_open=1; answer = malloc(21); redraw: width = clamp(col*0.7, col*0.7, 60); dialog = newwin(8, width, row * 0.3, col*0.5 - width/2); /* Draw dialog */ wbkgd(dialog, COLOR_PAIR(C_DIALOG)); box(dialog, 0, 0); mvwaddstr(dialog, 2, width/2 - (strlen(question) / 2), question); /* Draw input box */ mvwhline(dialog, 4, 3, ACS_HLINE, width-7); mvwhline(dialog, 6, 3, ACS_HLINE, width-7); mvwaddch(dialog, 4, 3, ACS_ULCORNER); mvwaddch(dialog, 6, 3, ACS_LLCORNER); mvwaddch(dialog, 5, 3, ACS_VLINE); mvwaddch(dialog, 5, width-4, ACS_VLINE); mvwaddch(dialog, 4, width-4, ACS_URCORNER); mvwaddch(dialog, 6, width-4, ACS_LRCORNER); if (apos > 0) mvwaddstr(dialog, 5, 4, answer); wmove(dialog, 5, 4+apos); /* Draw over top of everything */ overwrite(dialog, stats); wrefresh(dialog); /* Handle input */ while ((c = getkey())) { switch (c) { case KEY_RESIZE: getmaxyx(stdscr, row, col); draw_all(); curs_set(1); goto redraw; /* Enter pressed */ case 10: werase(dialog); delwin(dialog); game_pause(0); catch_alarm(0); fbar_time=0; scrl_open=0; return answer; case KEY_BACKSPACE: case 127: /* Katch the Konsole backspace */ case 12: if (apos > 0) { mvwprintw(dialog, 5, 3+apos, " "); answer[--apos] = '\0'; wmove(dialog, 5, 4+apos); wrefresh(dialog); } break; default: if ((c >= 'A' && c<= 'Z') || (c>='a' && c<= 'z') || c==32 || c=='_' || (c>='1' && c<='9')) { if (apos>=20) break; answer[apos]=c; answer[++apos]='\0'; mvwaddch(dialog, 5, 3+apos, c); wmove(dialog, 5, 4+apos); wrefresh(dialog); } break; } } scrl_open=0; return NULL; }
/* game_loop() has been turned into a SDL based loop. The code for one iteration of the original game_loop is in game_loop_iter. */ static void game_loop() { /* FPS */ int fps = 0; float fps_ema = 0; int fps_target = 25; /* TODO: compute alpha dynamically based on frametime */ const float ema_alpha = 0.07; const int frametime_target = 1000 / fps_target; /* in milliseconds */ int last_frame = SDL_GetTicks(); int drag_button = 0; unsigned int last_down[3] = {0}; unsigned int last_click[3] = {0}; unsigned int current_ticks = SDL_GetTicks(); unsigned int accum = 0; SDL_Event event; gui_event_t ev; game_loop_run = 1; while (game_loop_run) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_MOUSEBUTTONUP: if (drag_button == event.button.button) { ev.type = GUI_EVENT_TYPE_DRAG_END; ev.x = event.button.x; ev.y = event.button.y; ev.button = drag_button; gui_object_handle_event((gui_object_t *)&interface, &ev); drag_button = 0; } ev.type = GUI_EVENT_TYPE_BUTTON_UP; ev.x = event.button.x; ev.y = event.button.y; ev.button = event.button.button; gui_object_handle_event((gui_object_t *)&interface, &ev); if (event.button.button <= 3 && current_ticks - last_down[event.button.button-1] < MOUSE_SENSITIVITY) { ev.type = GUI_EVENT_TYPE_CLICK; ev.x = event.button.x; ev.y = event.button.y; ev.button = event.button.button; gui_object_handle_event((gui_object_t *)&interface, &ev); if (current_ticks - last_click[event.button.button-1] < MOUSE_SENSITIVITY) { ev.type = GUI_EVENT_TYPE_DBL_CLICK; ev.x = event.button.x; ev.y = event.button.y; ev.button = event.button.button; gui_object_handle_event((gui_object_t *)&interface, &ev); } last_click[event.button.button-1] = current_ticks; } break; case SDL_MOUSEBUTTONDOWN: ev.type = GUI_EVENT_TYPE_BUTTON_DOWN; ev.x = event.button.x; ev.y = event.button.y; ev.button = event.button.button; gui_object_handle_event((gui_object_t *)&interface, &ev); if (event.button.button <= 3) last_down[event.button.button-1] = current_ticks; break; case SDL_MOUSEMOTION: if (drag_button == 0) { /* Move pointer normally. */ interface_set_cursor(&interface, event.motion.x, event.motion.y); } for (int button = 1; button <= 3; button++) { if (event.motion.state & SDL_BUTTON(button)) { if (drag_button == 0) { drag_button = button; ev.type = GUI_EVENT_TYPE_DRAG_START; ev.x = event.motion.x; ev.y = event.motion.y; ev.button = drag_button; gui_object_handle_event((gui_object_t *)&interface, &ev); } ev.type = GUI_EVENT_TYPE_DRAG_MOVE; ev.x = event.motion.x; ev.y = event.motion.y; ev.button = drag_button; gui_object_handle_event((gui_object_t *)&interface, &ev); break; } } break; case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_q && (event.key.keysym.mod & KMOD_CTRL)) { game_loop_quit(); break; } switch (event.key.keysym.sym) { /* Map scroll */ case SDLK_UP: { viewport_t *viewport = interface_get_top_viewport(&interface); viewport_move_by_pixels(viewport, 0, -1); } break; case SDLK_DOWN: { viewport_t *viewport = interface_get_top_viewport(&interface); viewport_move_by_pixels(viewport, 0, 1); } break; case SDLK_LEFT: { viewport_t *viewport = interface_get_top_viewport(&interface); viewport_move_by_pixels(viewport, -1, 0); } break; case SDLK_RIGHT: { viewport_t *viewport = interface_get_top_viewport(&interface); viewport_move_by_pixels(viewport, 1, 0); } break; /* Panel click shortcuts */ case SDLK_1: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 0); } break; case SDLK_2: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 1); } break; case SDLK_3: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 2); } break; case SDLK_4: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 3); } break; case SDLK_5: { panel_bar_t *panel = interface_get_panel_bar(&interface); panel_bar_activate_button(panel, 4); } break; case SDLK_TAB: if (event.key.keysym.mod & KMOD_SHIFT) { interface_return_from_message(&interface); } else { interface_open_message(&interface); } break; /* Game speed */ case SDLK_PLUS: case SDLK_KP_PLUS: if (game.game_speed < 40) game.game_speed += 1; LOGI("main", "Game speed: %u", game.game_speed); break; case SDLK_MINUS: case SDLK_KP_MINUS: if (game.game_speed >= 1) game.game_speed -= 1; LOGI("main", "Game speed: %u", game.game_speed); break; case SDLK_0: game.game_speed = DEFAULT_GAME_SPEED; LOGI("main", "Game speed: %u", game.game_speed); break; case SDLK_p: if (game.game_speed == 0) game_pause(0); else game_pause(1); break; /* Audio */ case SDLK_s: sfx_enable(!sfx_is_enabled()); break; case SDLK_m: midi_enable(!midi_is_enabled()); break; /* Video */ case SDLK_f: if (event.key.keysym.mod & KMOD_CTRL) { sdl_set_fullscreen(!sdl_is_fullscreen()); } break; /* Misc */ case SDLK_ESCAPE: if (GUI_OBJECT(&interface.popup)->displayed) { interface_close_popup(&interface); } else if (interface.building_road) { interface_build_road_end(&interface); } break; /* Debug */ case SDLK_g: interface.viewport.layers ^= VIEWPORT_LAYER_GRID; break; case SDLK_b: interface.viewport.show_possible_build = !interface.viewport.show_possible_build; break; case SDLK_j: { int current = 0; for (int i = 0; i < 4; i++) { if (interface.player == game.player[i]) { current = i; break; } } for (int i = (current+1) % 4; i != current; i = (i+1) % 4) { if (PLAYER_IS_ACTIVE(game.player[i])) { interface.player = game.player[i]; LOGD("main", "Switched to player %i.", i); break; } } } break; case SDLK_z: if (event.key.keysym.mod & KMOD_CTRL) { save_game(0); } break; case SDLK_F10: interface_open_game_init(&interface); break; default: break; } break; case SDL_VIDEORESIZE: sdl_set_resolution(event.resize.w, event.resize.h, 0); frame_t *screen = sdl_get_screen_frame(); int width = sdl_frame_get_width(screen); int height = sdl_frame_get_height(screen); screen_frame.clip.w = width; screen_frame.clip.h = height; gui_object_set_size((gui_object_t *)&interface, width, height); break; case SDL_QUIT: game_loop_quit(); break; } } unsigned int new_ticks = SDL_GetTicks(); int delta_ticks = new_ticks - current_ticks; current_ticks = new_ticks; /* Update FPS EMA per frame */ fps = 1000*(1.0 / (float)delta_ticks); if (fps_ema > 0) fps_ema = ema_alpha*fps + (1-ema_alpha)*fps_ema; else if (fps > 0) fps_ema = fps; accum += delta_ticks; while (accum >= TICK_LENGTH) { game_update(); /* Autosave periodically */ if ((game.const_tick % AUTOSAVE_INTERVAL) == 0 && game.game_speed > 0) { int r = save_game(1); if (r < 0) LOGW("main", "Autosave failed."); } /* Print FPS */ if ((game.const_tick % (10*TICKS_PER_SEC)) == 0) { LOGV("main", "FPS: %i", (int)fps_ema); } accum -= TICK_LENGTH; } /* Update and draw interface */ interface_update(&interface); gui_object_redraw(GUI_OBJECT(&interface), game.frame); /* TODO very crude dirty marking algortihm: mark everything. */ sdl_mark_dirty(0, 0, sdl_frame_get_width(game.frame), sdl_frame_get_height(game.frame)); /* Swap video buffers */ sdl_swap_buffers(); /* Reduce framerate to target if we finished too fast */ int now = SDL_GetTicks(); int frametime_spent = now - last_frame; if (frametime_spent < frametime_target) { SDL_Delay(frametime_target - frametime_spent); } last_frame = SDL_GetTicks(); } }
void sys_input() { while(SDL_PollEvent(&event)) { if( event.type == SDL_KEYDOWN ) { // Gameplay if(gamestate_over == false && gamestate_title == false) { if(event.key.keysym.sym == SDLK_LEFT) action_moveleft = true; if(event.key.keysym.sym == SDLK_RIGHT) action_moveright = true; if(event.key.keysym.sym == SDLK_UP) action_moveup = true; if(event.key.keysym.sym == SDLK_DOWN) action_movedown = true; if(event.key.keysym.sym == 'z') action_fire = true; // Pause screen if(event.key.keysym.sym == 'p' || event.key.keysym.sym == SDLK_ESCAPE) game_pause(); if(gamestate_pause == true) if(event.key.keysym.sym == 'q') game_titlescreen(); } // Title screen menu if(gamestate_over == true && gamestate_title == true) { if(event.key.keysym.sym == SDLK_DOWN && menu_selection+1 < 3) menu_selection += 1; if(event.key.keysym.sym == SDLK_UP && menu_selection > 0) menu_selection -= 1; if(menu_level == 0) // main menu { if(event.key.keysym.sym == 'z') { if(menu_selection == 0) game_newgame(); if(menu_selection == 1) { menu_level = 1; menu_selection = 0; } if(menu_selection == 2) quit = true; } } else if (menu_level == 1) // options menu { if(event.key.keysym.sym == SDLK_LEFT) { if(menu_selection == 0) if(sound_volfx-1 >= 0) sound_setvolumes(sound_volfx-1,sound_volmus); if(menu_selection == 1) if(sound_volmus-1 >= 0) sound_setvolumes(sound_volfx,sound_volmus-1); } if(event.key.keysym.sym == SDLK_RIGHT) { if(menu_selection == 0) if(sound_volfx+1 <= 12) sound_setvolumes(sound_volfx+1,sound_volmus); if(menu_selection == 1) if(sound_volmus+1 <= 12) sound_setvolumes(sound_volfx,sound_volmus+1); } if(event.key.keysym.sym == 'z') { if(menu_selection == 2) { menu_level = 0; menu_selection = 0; } } } } // Game over if(gamestate_over == true && gamestate_title == false) { if(event.key.keysym.sym == 'q') game_titlescreen(); } } else if( event.type == SDL_KEYUP ) { // Regular gameplay if(gamestate_over == false) { if(event.key.keysym.sym == SDLK_LEFT) action_moveleft = false; if(event.key.keysym.sym == SDLK_RIGHT) action_moveright = false; if(event.key.keysym.sym == SDLK_UP) action_moveup = false; if(event.key.keysym.sym == SDLK_DOWN) action_movedown = false; if(event.key.keysym.sym == 'z') action_fire = false; } } if(event.type == SDL_QUIT) { quit = true; } } }
/*char isStuck() { m_wait(100); //localize(data); distfrombound = data[1] + ((float)BOUNDARYTHRESHOLD)*sin((data[2]+90.0)*3.14/180.0*-1.0); if (distfrombound > 60.0 || distfrombound < -60.0) { return 1; } m_usb_tx_int((int)distfrombound); m_usb_tx_char('\n'); } long loccounter = 0; float prevx = 0.0; float prevy = 0.0; */ int main(void) { //goal side clear(DDRB,1); clear(PORTB,1); if (check(PINB,1)) { goal = 1; } set(DDRB,0); set(PORTB,0); set(DDRD,5); set(DDRD,3); //wireless stuffs m_bus_init(); m_rf_open(CHANNEL, RXADDRESS, PACKET_LENGTH); int counter = 0; // //m_num_init(); int flag; m_clockdivide(0); m_disableJTAG(); //TIMER 0: For Controlling the solenoid // // set(TCCR0B, WGM02); // set(TCCR0A, WGM01); // set(TCCR0A, WGM01); // // set(TCCR0A, COM0B1); // clear(TCCR0A, COM0B0); // // set(TCCR0B, CS02); // set(TCCR0B, CS01); // set(TCCR0B, CS00); // set(DDRB,7); // OCR0A = 0xFF; // OCR0B = 0xff; // //TIMER 1: For Controlling the left wheel set(TCCR1B, WGM13); set(TCCR1B, WGM12); set(TCCR1A, WGM11); set(TCCR1A, WGM10); set(TCCR1A, COM1B1); clear(TCCR1A, COM1B0); clear(TCCR1B, CS12); clear(TCCR1B, CS11); set(TCCR1B, CS10); set(DDRB,6); OCR1A = 0xFFFF; OCR1B = 0; //TIMER 3: For Controlling the right wheel //up to ICR3, clear at OCR3A & set at rollover set(TCCR3B, WGM33); set(TCCR3B, WGM32); set(TCCR3A, WGM31); clear(TCCR3A, WGM30); set(TCCR3A, COM3A1); clear(TCCR3A, COM3A0); clear(TCCR3B, CS32); clear(TCCR3B, CS31); set(TCCR3B, CS30); ICR3 = 0xFFFF; OCR3A = 0; // //Set TCNT0 to go up to OCR0A // clear(TCCR0B, WGM02); // set (TCCR0A, WGM01); // clear(TCCR0A, WGM00); // // // Don't change pin upon hitting OCR0B // clear(TCCR0A, COM0A1); // clear(TCCR0A, COM0A0); // // // Set clock scale to /1024 // set(TCCR0B, CS02); // clear(TCCR0B, CS01); // set(TCCR0B, CS00); // // // Set Frequency of readings to 1/SAMPLERATE; dt = 1/SAMPLERATE // OCR0A = (unsigned int) ((float) F_CPU / 1024 / REPORTRATE); // OCR0B = 1; // Set up interrupt for reading values at sampling rate //Pin for controlling solenoid pulse set(DDRB,7); //Pins for controlling speed of left and right wheel set(DDRB,6); set(DDRC,6); //Pins for determining direction of wheels set(DDRB,2); set(DDRB,3); //Blue LED for Comm Test //set(DDRB,5); //ADC's sei(); //Set up interrupts set(ADCSRA, ADIE); clear(ADMUX, REFS1); //Voltage reference is AR pin (5V) clear(ADMUX, REFS0); //^ set(ADCSRA, ADPS2); //Set scale to /128 set(ADCSRA, ADPS1); //^ set(ADCSRA, ADPS0); //^ set(DIDR0, ADC0D); //Disable digital input for F0 set(DIDR0, ADC1D), set(DIDR0, ADC4D); set(DIDR0, ADC5D); set(DIDR0, ADC6D); set(DIDR0, ADC7D); set(DIDR2, ADC8D); set(DIDR2, ADC9D); set(ADCSRA, ADATE); //Set trigger to free-running mode chooseInput(0); set(ADCSRA, ADEN); //Enable/Start conversion set(ADCSRA, ADSC); //^ set(ADCSRA, ADIF); //Enable reading results //Limit Switch stuffs // clear(DDRB,0); //set to input, RIGHT LIMIT SWITCH // clear(DDRB,1); //set to input, LEFT LIMIT SWITCH // // clear(PORTB,0); //disable internal pull up resistor // clear(PORTB,1); //disable internal pull up resistor //int state; // state variable state = 0; //set state play = 0; long count = 0; if (state == 70) { m_usb_init(); // connect usb while(!m_usb_isconnected()); //wait for connection } //m_bus_init(); m_wii_open(); //m_usb_init(); m_red(ON); local_init(); localize(data); m_red(OFF); //set(TIMSK0, OCIE0A); while(1) { if (play) {m_red(ON);} else {m_red(OFF);} // m_wait(100); // m_red(TOGGLE); // localize(data); /*if (loccounter == LOCCOUNT) { if (sqrt((data[0]-prevx)*(data[0]-prevx)+(data[1]-prevy)-(data[1]-prevy)) < 1.0) { m_red(ON); reverse(); m_wait(100); state = 6; } else { m_red(OFF); state = 2; } prevx = data[0]; prevy = data[1]; loccounter = 0; }*/ //loccounter++; // localize(data); // locdata[1] = (char)data[0]; // locdata[2] = (char)data[1]; // toggle(PORTD,3); changedState = 0; angle_dif = 0; //Detect weather we have the puck getADC(); //if (!play) game_pause(); if (ADCarr[7] > 500) { //set(PORTD,5); //set(PORTD,5); iHaveThePuck = 1; m_green(ON); if (play && goal == A) state = 3; if (play && goal == B) state = 4; } else { //clear(PORTD,5); iHaveThePuck = 0; m_green(OFF); if (play) state = 2; } if(iHaveThePuck && state == 2) { //set(PORTB,5); //drive_to_goalA(); } else { //clear(PORTB,5); //if (state != 0) state = 2; } // if(isStuck()) { // //set(PORTD,5);u // } // else { // //clear(PORTD,5); // } //localize(data); // if (check(PINB,0)) { // set(PORTD,5); // state = 0x1A; // } else { // clear(PORTD,5); // state = 2; // } if (!play) state = buffer[0]; //switch states switch (state) { case -2: getADC(); if (ADCarr[0] > 500) { m_green(ON); } else {m_green(OFF)} break; case -1: //test Limit switches //m_green(ON); if (check(PINB,1)) { m_green(ON); } else if (check(PINB,0)) { m_red(ON); } else { m_red(OFF); m_green(OFF); } break; case 0: //drive_to_point2(-100,0); game_pause(); break; case 1: findPuck(); break; case 2: //m_red(ON); if (!iHaveThePuck) { if (play) drive_to_puck(); } break; case 3: if (play) drive_to_goalA(); break; case 4: if (play) drive_to_goalB(); break; case 5: getADC(); if (ADCarr[7] > 500) { //set(PORTD,5); } else { //clear(PORTD,5); } break; case 6: if (data[2] > 0) { rotate(RIGHT,1); } else { rotate(LEFT,1); } break; case 7: drive_to_point2(-50,0); break; case 0xA0: comm_test(); break; case 0xA1: play = 1; drive_to_puck(); break; case 0xA2: play = 0; game_pause(); break; case 0xA3: play = 0; game_pause(); break; case 0xA4: play = 0; game_pause(); break; case 0xA6: play = 0; game_pause(); break; case 0xA7: game_pause(); break; case 69: set(PORTB,2); set(PORTB,3); OCR1B = OCR1A; OCR3A = ICR3; break; case 70: reportADC(); break; default: game_pause(); break; } } }