From b23a7698a18843e7eaca596c175e5ac76285edf9 Mon Sep 17 00:00:00 2001 From: Ingo Ruhnke Date: Tue, 23 Mar 2004 01:30:16 +0000 Subject: [PATCH] - fixed joystick code a bit SVN-Revision: 326 --- src/gameloop.cpp | 136 +++++++++++++++++++++++++++---------------------------- src/globals.h | 2 + src/player.cpp | 10 ++-- src/player.h | 32 ++++++------- src/worldmap.cpp | 29 +++++++++++- 5 files changed, 117 insertions(+), 92 deletions(-) diff --git a/src/gameloop.cpp b/src/gameloop.cpp index 618a4d398..1d071e378 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -8,7 +8,7 @@ http://www.newbreedsoftware.com/supertux/ April 11, 2000 - March 15, 2004 - */ +*/ #include #include @@ -67,8 +67,6 @@ void drawstatus(void); void drawendscreen(void); void drawresultscreen(void); -#define JOYSTICK_DEAD_ZONE 4096 - void levelintro(void) { /* Level Intro: */ @@ -223,9 +221,9 @@ void game_event(void) score += 1000; case SDLK_f: if(debug_fps) - debug_fps = false; + debug_fps = false; else - debug_fps = true; + debug_fps = true; break; default: break; @@ -237,20 +235,28 @@ void game_event(void) { case JOY_X: if (event.jaxis.value < -JOYSTICK_DEAD_ZONE) - tux.input.left = DOWN; + { + tux.input.left = DOWN; + tux.input.right = UP; + } else if (event.jaxis.value > JOYSTICK_DEAD_ZONE) - tux.input.left = UP; - - if (event.jaxis.value > JOYSTICK_DEAD_ZONE) - tux.input.right = DOWN; - else if (event.jaxis.value < -JOYSTICK_DEAD_ZONE) - tux.input.right = UP; + { + tux.input.left = UP; + tux.input.right = DOWN; + } + else + { + tux.input.left = DOWN; + tux.input.right = DOWN; + } break; case JOY_Y: if (event.jaxis.value > JOYSTICK_DEAD_ZONE) tux.input.down = DOWN; else if (event.jaxis.value < -JOYSTICK_DEAD_ZONE) tux.input.down = UP; + else + tux.input.down = UP; /* Handle joystick for the menu */ if(show_menu) @@ -287,7 +293,6 @@ void game_event(void) } /* switch */ } /* while */ - } /* --- GAME ACTION! --- */ @@ -647,7 +652,7 @@ int gameloop(const char * subset, int levelnb, int mode) while (SDL_PollEvent(&event)) - {} + {} game_draw(); do @@ -657,7 +662,7 @@ int gameloop(const char * subset, int levelnb, int mode) /* Calculate the movement-factor */ frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE); if(frame_ratio > 1.5) /* Quick hack to correct the unprecise CPU clocks a little bit. */ - frame_ratio = 1.5 + (frame_ratio - 1.5) * 0.85; + frame_ratio = 1.5 + (frame_ratio - 1.5) * 0.85; if(!timer_check(&frame_timer)) { @@ -711,10 +716,10 @@ int gameloop(const char * subset, int levelnb, int mode) if(!game_pause && !show_menu) { - /*float z = frame_ratio; - frame_ratio = 1; - while(z >= 1) - {*/ + /*float z = frame_ratio; + frame_ratio = 1; + while(z >= 1) + {*/ if (game_action() == 0) { /* == 0: no more lives */ @@ -722,7 +727,7 @@ int gameloop(const char * subset, int levelnb, int mode) return 0; } /* --z; - }*/ + }*/ } else { @@ -736,11 +741,11 @@ int gameloop(const char * subset, int levelnb, int mode) /*Draw the current scene to the screen */ /*If the machine running the game is too slow skip the drawing of the frame (so the calculations are more precise and - the FPS aren't affected).*/ + the FPS aren't affected).*/ /*if( ! fps_fps < 50.0 ) - game_draw(); - else - jump = true;*/ /*FIXME: Implement this tweak right.*/ + game_draw(); + else + jump = true;*/ /*FIXME: Implement this tweak right.*/ game_draw(); /* Time stops in pause mode */ @@ -756,11 +761,11 @@ int gameloop(const char * subset, int levelnb, int mode) /* Pause till next frame, if the machine running the game is too fast: */ /* FIXME: Works great for in OpenGl mode, where the CPU doesn't have to do that much. But - the results in SDL mode aren't perfect (thought the 100 FPS are reached), even on an AMD2500+. */ + the results in SDL mode aren't perfect (thought the 100 FPS are reached), even on an AMD2500+. */ if(last_update_time >= update_time - 12 && !jump) SDL_Delay(10); /*if((update_time - last_update_time) < 10) - SDL_Delay((11 - (update_time - last_update_time))/2);*/ + SDL_Delay((11 - (update_time - last_update_time))/2);*/ @@ -771,10 +776,10 @@ int gameloop(const char * subset, int levelnb, int mode) /* are we low on time ? */ if ((timer_get_left(&time_left) < TIME_WARNING) && (get_current_music() != HURRYUP_MUSIC)) /* play the fast music */ - { + { set_current_music(HURRYUP_MUSIC); play_current_music(); - } + } } else @@ -1185,7 +1190,7 @@ void loadshared(void) // NULL or something else. And it will be dangerous to // play with not-initialized pointers. // This is also true with if (use_music) - Send a mail to me: neoneurone@users.sf.net, if you have another opinion. :) + Send a mail to me: neoneurone@users.sf.net, if you have another opinion. :) */ for (i = 0; i < NUM_SOUNDS; i++) sounds[i] = load_sound(datadir + soundfilenames[i]); @@ -1483,40 +1488,40 @@ void bumpbrick(float x, float y) void tryemptybox(float x, float y, int col_side) { -if (!isfullbox(x, y)) - return; - -// according to the collision side, set the upgrade direction - -if(col_side == LEFT) - col_side = RIGHT; -else - col_side = LEFT; - -switch(shape(x,y)) - { - case 'A': /* Box with a distro! */ - add_bouncy_distro(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32 - 32); - play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER); - score = score + SCORE_DISTRO; - distros++; - break; - case 'B': /* Add an upgrade! */ - if (tux.size == SMALL) /* Tux is small, add mints! */ - add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_MINTS); - else /* Tux is big, add coffee: */ - add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_COFFEE); - play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER); - break; - case '!': /* Add a golden herring */ - add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_HERRING); - break; - default: - break; - } - -/* Empty the box: */ -level_change(¤t_level,x, y, 'a'); + if (!isfullbox(x, y)) + return; + + // according to the collision side, set the upgrade direction + + if(col_side == LEFT) + col_side = RIGHT; + else + col_side = LEFT; + + switch(shape(x,y)) + { + case 'A': /* Box with a distro! */ + add_bouncy_distro(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32 - 32); + play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER); + score = score + SCORE_DISTRO; + distros++; + break; + case 'B': /* Add an upgrade! */ + if (tux.size == SMALL) /* Tux is small, add mints! */ + add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_MINTS); + else /* Tux is big, add coffee: */ + add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_COFFEE); + play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER); + break; + case '!': /* Add a golden herring */ + add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_HERRING); + break; + default: + break; + } + + /* Empty the box: */ + level_change(¤t_level,x, y, 'a'); } @@ -1546,9 +1551,7 @@ void trybumpbadguy(float x, float y) { unsigned int i; - /* Bad guys: */ - for (i = 0; i < bad_guys.size(); i++) { if (bad_guys[i].base.x >= x - 32 && bad_guys[i].base.x <= x + 32 && @@ -1566,7 +1569,6 @@ void trybumpbadguy(float x, float y) /* Upgrades: */ - for (i = 0; i < upgrades.size(); i++) { if (upgrades[i].base.height == 32 && @@ -1717,8 +1719,6 @@ void loadgame(int slot) } else { - - fgets(str, 100, fi); strcpy(level_subset, str); level_subset[strlen(level_subset)-1] = '\0'; diff --git a/src/globals.h b/src/globals.h index 48c2884a3..c476a3cdc 100644 --- a/src/globals.h +++ b/src/globals.h @@ -40,4 +40,6 @@ extern char *st_dir, *st_save_dir; extern SDL_Joystick * js; +#define JOYSTICK_DEAD_ZONE 4096 + #endif /* SUPERTUX_GLOBALS_H */ diff --git a/src/player.cpp b/src/player.cpp index 5b2d4a9de..7fdbd2e2f 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -68,11 +68,11 @@ void player_init(player_type* pplayer) player_input_init(&pplayer->input); - pplayer->keymap.jump = SDLK_UP; - pplayer->keymap.duck = SDLK_DOWN; - pplayer->keymap.left = SDLK_LEFT; + pplayer->keymap.jump = SDLK_UP; + pplayer->keymap.duck = SDLK_DOWN; + pplayer->keymap.left = SDLK_LEFT; pplayer->keymap.right = SDLK_RIGHT; - pplayer->keymap.fire = SDLK_LCTRL; + pplayer->keymap.fire = SDLK_LCTRL; timer_init(&pplayer->invincible_timer,true); timer_init(&pplayer->skidding_timer,true); @@ -89,7 +89,7 @@ int player_key_event(player_type* pplayer, SDLKey key, int state) pplayer->input.right = state; return true; } - else if( key == pplayer->keymap.left) + else if(key == pplayer->keymap.left) { pplayer->input.left = state; return true; diff --git a/src/player.h b/src/player.h index 435f39c7a..488432472 100644 --- a/src/player.h +++ b/src/player.h @@ -37,26 +37,24 @@ #define SCORE_BRICK 5 #define SCORE_DISTRO 25 -typedef struct player_keymap_type +struct player_keymap_type { - int jump; - int duck; - int left; - int right; - int fire; -} -player_keymap_type; + int jump; + int duck; + int left; + int right; + int fire; +}; -typedef struct player_input_type +struct player_input_type { - int right; - int left; - int up; - int down; - int fire; - int old_fire; -} -player_input_type; + int right; + int left; + int up; + int down; + int fire; + int old_fire; +}; void player_input_init(player_input_type* pplayer_input); diff --git a/src/worldmap.cpp b/src/worldmap.cpp index c6f9d2d1f..07bdd8de4 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -284,6 +284,7 @@ WorldMap::get_input() SDL_Event event; enter_level = false; + input_direction = NONE; while (SDL_PollEvent(&event)) { @@ -307,13 +308,37 @@ WorldMap::get_input() break; } break; + + case SDL_JOYAXISMOTION: + switch(event.jaxis.axis) + { + case JOY_X: + if (event.jaxis.value < -JOYSTICK_DEAD_ZONE) + input_direction = WEST; + else if (event.jaxis.value > JOYSTICK_DEAD_ZONE) + input_direction = EAST; + break; + case JOY_Y: + if (event.jaxis.value > JOYSTICK_DEAD_ZONE) + input_direction = SOUTH; + else if (event.jaxis.value < -JOYSTICK_DEAD_ZONE) + input_direction = NORTH; + break; + } + break; + + case SDL_JOYBUTTONDOWN: + if (event.jbutton.button == JOY_B) + enter_level = true; + break; + + default: + break; } } Uint8 *keystate = SDL_GetKeyState(NULL); - input_direction = NONE; - if (keystate[SDLK_LEFT]) input_direction = WEST; else if (keystate[SDLK_RIGHT]) -- 2.11.0