Implemented basic joystick control : dir+AB on most platforms, pad+AB on GP2X
Implemented accelerating cursor with joystick / kb cursor Fixed up the contextual help, somehow git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@583 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
db02be0e41
commit
1150dcea21
13
clavier.c
13
clavier.c
@ -310,6 +310,8 @@ word Touche_pour_scancode(word scancode)
|
||||
word Conversion_Touche(SDL_keysym Sym)
|
||||
{
|
||||
word Retour = 0;
|
||||
word Mod;
|
||||
|
||||
// On ignore shift, alt et control isolés.
|
||||
if (Sym.sym == SDLK_RSHIFT || Sym.sym == SDLK_LSHIFT ||
|
||||
Sym.sym == SDLK_RCTRL || Sym.sym == SDLK_LCTRL ||
|
||||
@ -326,11 +328,16 @@ word Conversion_Touche(SDL_keysym Sym)
|
||||
Retour = (Sym.scancode & 0x07FF) | 0x0800;
|
||||
}
|
||||
|
||||
if (Sym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))
|
||||
// Normally I should test Sym.mod here, but on windows the implementation
|
||||
// is buggy: if you release a modifier key, the following keys (when they repeat)
|
||||
// still name the original modifiers.
|
||||
Mod=SDL_GetModState();
|
||||
// SDL_GetModState() seems to get the right up-to-date info.
|
||||
if (Mod & (KMOD_LSHIFT | KMOD_RSHIFT))
|
||||
Retour |= MOD_SHIFT;
|
||||
if (Sym.mod & (KMOD_LCTRL | KMOD_RCTRL))
|
||||
if (Mod & (KMOD_LCTRL | KMOD_RCTRL))
|
||||
Retour |= MOD_CTRL;
|
||||
if (Sym.mod & (KMOD_LALT | KMOD_RALT | KMOD_MODE))
|
||||
if (Mod & (KMOD_LALT | KMOD_RALT | KMOD_MODE))
|
||||
Retour |= MOD_ALT;
|
||||
return Retour;
|
||||
}
|
||||
|
||||
336
input.c
336
input.c
@ -31,6 +31,17 @@
|
||||
void Handle_Window_Resize(SDL_Event* event);
|
||||
void Handle_Window_Exit(SDL_Event* event);
|
||||
|
||||
byte Directional_up;
|
||||
byte Directional_up_right;
|
||||
byte Directional_right;
|
||||
byte Directional_down_right;
|
||||
byte Directional_down;
|
||||
byte Directional_down_left;
|
||||
byte Directional_left;
|
||||
byte Directional_up_left;
|
||||
long Directional_delay;
|
||||
long Directional_last_move;
|
||||
long Directional_step;
|
||||
|
||||
// Called each time there is a cursor move, either triggered by mouse or keyboard shortcuts
|
||||
int Move_cursor_with_constraints()
|
||||
@ -187,60 +198,23 @@ int Handle_Key_Press(SDL_Event* event)
|
||||
|
||||
if(Touche == Config_Touche[SPECIAL_MOUSE_UP])
|
||||
{
|
||||
//si on est déjà en haut on peut plus bouger
|
||||
if(INPUT_Nouveau_Mouse_Y!=0)
|
||||
{
|
||||
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
|
||||
INPUT_Nouveau_Mouse_Y=INPUT_Nouveau_Mouse_Y<Loupe_Facteur?0:INPUT_Nouveau_Mouse_Y-Loupe_Facteur;
|
||||
else
|
||||
INPUT_Nouveau_Mouse_Y--;
|
||||
if(Move_cursor_with_constraints()) return 0;
|
||||
return 1;
|
||||
}
|
||||
Directional_up=1;
|
||||
return 0;
|
||||
}
|
||||
else if(Touche == Config_Touche[SPECIAL_MOUSE_DOWN])
|
||||
{
|
||||
if(INPUT_Nouveau_Mouse_Y<Hauteur_ecran-1)
|
||||
{
|
||||
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
|
||||
{
|
||||
INPUT_Nouveau_Mouse_Y+=Loupe_Facteur;
|
||||
if (INPUT_Nouveau_Mouse_Y>=Hauteur_ecran)
|
||||
INPUT_Nouveau_Mouse_Y=Hauteur_ecran-1;
|
||||
}
|
||||
else
|
||||
INPUT_Nouveau_Mouse_Y++;
|
||||
if(Move_cursor_with_constraints()) return 0;
|
||||
return 1;
|
||||
}
|
||||
Directional_down=1;
|
||||
return 0;
|
||||
}
|
||||
else if(Touche == Config_Touche[SPECIAL_MOUSE_LEFT])
|
||||
{
|
||||
if(INPUT_Nouveau_Mouse_X!=0)
|
||||
{
|
||||
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
|
||||
INPUT_Nouveau_Mouse_X-=Loupe_Facteur;
|
||||
else
|
||||
INPUT_Nouveau_Mouse_X--;
|
||||
if(Move_cursor_with_constraints()) return 0;
|
||||
return 1;
|
||||
}
|
||||
Directional_left=1;
|
||||
return 0;
|
||||
}
|
||||
else if(Touche == Config_Touche[SPECIAL_MOUSE_RIGHT])
|
||||
{
|
||||
if(INPUT_Nouveau_Mouse_X<Largeur_ecran-1)
|
||||
{
|
||||
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
|
||||
{
|
||||
INPUT_Nouveau_Mouse_X+=Loupe_Facteur;
|
||||
if (INPUT_Nouveau_Mouse_X>=Largeur_ecran)
|
||||
INPUT_Nouveau_Mouse_X=Largeur_ecran-1;
|
||||
}
|
||||
else
|
||||
INPUT_Nouveau_Mouse_X++;
|
||||
if(Move_cursor_with_constraints()) return 0;
|
||||
return 1;
|
||||
}
|
||||
Directional_right=1;
|
||||
return 0;
|
||||
}
|
||||
else if(Touche == Config_Touche[SPECIAL_CLICK_LEFT])
|
||||
{
|
||||
@ -288,14 +262,50 @@ int Handle_Key_Press(SDL_Event* event)
|
||||
|
||||
void Handle_Key_Release(SDL_Event* event)
|
||||
{
|
||||
int ToucheR = Conversion_Touche(event->key.keysym);
|
||||
int Modifieur;
|
||||
int ToucheR = Conversion_Touche(event->key.keysym) & 0x0FFF;
|
||||
|
||||
if(ToucheR == Config_Touche[SPECIAL_CLICK_LEFT])
|
||||
switch(event->key.keysym.sym)
|
||||
{
|
||||
case SDLK_RSHIFT:
|
||||
case SDLK_LSHIFT:
|
||||
Modifieur=MOD_SHIFT;
|
||||
break;
|
||||
case SDLK_RCTRL:
|
||||
case SDLK_LCTRL:
|
||||
Modifieur=MOD_CTRL;
|
||||
break;
|
||||
case SDLK_RALT:
|
||||
case SDLK_LALT:
|
||||
case SDLK_MODE:
|
||||
Modifieur=MOD_ALT;
|
||||
break;
|
||||
default:
|
||||
Modifieur=0;
|
||||
}
|
||||
|
||||
if(ToucheR == (Config_Touche[SPECIAL_MOUSE_UP]&0x0FFF) || (Config_Touche[SPECIAL_MOUSE_UP]&Modifieur))
|
||||
{
|
||||
Directional_up=0;
|
||||
}
|
||||
if(ToucheR == (Config_Touche[SPECIAL_MOUSE_DOWN]&0x0FFF) || (Config_Touche[SPECIAL_MOUSE_DOWN]&Modifieur))
|
||||
{
|
||||
Directional_down=0;
|
||||
}
|
||||
if(ToucheR == (Config_Touche[SPECIAL_MOUSE_LEFT]&0x0FFF) || (Config_Touche[SPECIAL_MOUSE_LEFT]&Modifieur))
|
||||
{
|
||||
Directional_left=0;
|
||||
}
|
||||
if(ToucheR == (Config_Touche[SPECIAL_MOUSE_RIGHT]&0x0FFF) || (Config_Touche[SPECIAL_MOUSE_RIGHT]&Modifieur))
|
||||
{
|
||||
Directional_right=0;
|
||||
}
|
||||
if(ToucheR == (Config_Touche[SPECIAL_CLICK_LEFT]&0x0FFF) || (Config_Touche[SPECIAL_CLICK_LEFT]&Modifieur))
|
||||
{
|
||||
INPUT_Nouveau_Mouse_K &= ~1;
|
||||
Move_cursor_with_constraints();
|
||||
}
|
||||
else if(ToucheR == Config_Touche[SPECIAL_CLICK_RIGHT])
|
||||
if(ToucheR == (Config_Touche[SPECIAL_CLICK_RIGHT]&0x0FFF) || (Config_Touche[SPECIAL_CLICK_RIGHT]&Modifieur))
|
||||
{
|
||||
INPUT_Nouveau_Mouse_K &= ~2;
|
||||
Move_cursor_with_constraints();
|
||||
@ -311,12 +321,133 @@ void Handle_Key_Release(SDL_Event* event)
|
||||
|
||||
void Handle_Joystick_Press(SDL_Event* event)
|
||||
{
|
||||
|
||||
if (event->jbutton.which==0) // joystick number 0
|
||||
{
|
||||
#ifdef __gp2x__
|
||||
switch(event->jbutton.button)
|
||||
{
|
||||
case 0:
|
||||
Directional_up=1;
|
||||
break;
|
||||
case 7:
|
||||
Directional_up_right=1;
|
||||
break;
|
||||
case 6:
|
||||
Directional_right=1;
|
||||
break;
|
||||
case 5:
|
||||
Directional_down_right=1;
|
||||
break;
|
||||
case 4:
|
||||
Directional_down=1;
|
||||
break;
|
||||
case 3:
|
||||
Directional_down_left=1;
|
||||
break;
|
||||
case 2:
|
||||
Directional_left=1;
|
||||
break;
|
||||
case 1:
|
||||
Directional_up_left=1;
|
||||
break;
|
||||
case 12: // A
|
||||
INPUT_Nouveau_Mouse_K=1;
|
||||
break;
|
||||
case 13: // B
|
||||
INPUT_Nouveau_Mouse_K=2;
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch(event->jbutton.button)
|
||||
{
|
||||
case 0: // A
|
||||
INPUT_Nouveau_Mouse_K=1;
|
||||
break;
|
||||
case 1: // B
|
||||
INPUT_Nouveau_Mouse_K=2;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void Handle_Joystick_Release(SDL_Event* event)
|
||||
{
|
||||
if (event->jbutton.which==0) // joystick number 0
|
||||
{
|
||||
#ifdef __gp2x__
|
||||
switch(event->jbutton.button)
|
||||
{
|
||||
case 0:
|
||||
Directional_up=0;
|
||||
break;
|
||||
case 7:
|
||||
Directional_up_right=0;
|
||||
break;
|
||||
case 6:
|
||||
Directional_right=0;
|
||||
break;
|
||||
case 5:
|
||||
Directional_down_right=0;
|
||||
break;
|
||||
case 4:
|
||||
Directional_down=0;
|
||||
break;
|
||||
case 3:
|
||||
Directional_down_left=0;
|
||||
break;
|
||||
case 2:
|
||||
Directional_left=0;
|
||||
break;
|
||||
case 1:
|
||||
Directional_up_left=0;
|
||||
break;
|
||||
case 12: // A
|
||||
INPUT_Nouveau_Mouse_K &= ~1;
|
||||
break;
|
||||
case 13: // B
|
||||
INPUT_Nouveau_Mouse_K &= ~2;
|
||||
break;
|
||||
}
|
||||
#else
|
||||
switch(event->jbutton.button)
|
||||
{
|
||||
case 0: // A
|
||||
INPUT_Nouveau_Mouse_K &= ~1;
|
||||
break;
|
||||
case 1: // B
|
||||
INPUT_Nouveau_Mouse_K &= ~2;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void Handle_Joystick_Movement(SDL_Event* event)
|
||||
{
|
||||
if (event->jaxis.which==0) // joystick number 0
|
||||
{
|
||||
if (event->jaxis.axis==0) // X
|
||||
{
|
||||
Directional_right=Directional_left=0;
|
||||
if (event->jaxis.value<-1000)
|
||||
{
|
||||
Directional_left=1;
|
||||
}
|
||||
else if (event->jaxis.value>1000)
|
||||
Directional_right=1;
|
||||
}
|
||||
else if (event->jaxis.axis==1) // Y
|
||||
{
|
||||
Directional_up=Directional_down=0;
|
||||
if (event->jaxis.value<-1000)
|
||||
{
|
||||
Directional_up=1;
|
||||
}
|
||||
else if (event->jaxis.value>1000)
|
||||
Directional_down=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Main input handling function
|
||||
@ -327,6 +458,7 @@ int Get_input(void)
|
||||
int User_Feedback_Required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
|
||||
|
||||
Touche_ANSI = 0;
|
||||
Touche = 0;
|
||||
|
||||
// Process as much events as possible without redrawing the screen.
|
||||
// This mostly allows us to merge mouse events for people with an high
|
||||
@ -369,20 +501,116 @@ int Get_input(void)
|
||||
break;
|
||||
|
||||
case SDL_JOYBUTTONUP:
|
||||
Handle_Joystick_Press(&event);
|
||||
break;
|
||||
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
Handle_Joystick_Release(&event);
|
||||
User_Feedback_Required = 1;
|
||||
break;
|
||||
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
Handle_Joystick_Press(&event);
|
||||
User_Feedback_Required = 1;
|
||||
break;
|
||||
|
||||
case SDL_JOYAXISMOTION:
|
||||
Handle_Joystick_Movement(&event);
|
||||
break;
|
||||
|
||||
default:
|
||||
DEBUG("Unhandled SDL event number : ",event.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Directional controller
|
||||
if (!(Directional_up||Directional_up_right||Directional_right||
|
||||
Directional_down_right||Directional_down||Directional_down_left||
|
||||
Directional_left||Directional_up_left))
|
||||
{
|
||||
Directional_delay=-1;
|
||||
Directional_last_move=SDL_GetTicks();
|
||||
}
|
||||
else
|
||||
{
|
||||
long Now;
|
||||
|
||||
Now=SDL_GetTicks();
|
||||
|
||||
if (Now>Directional_last_move+Directional_delay)
|
||||
{
|
||||
if (Directional_delay==-1)
|
||||
{
|
||||
Directional_delay=150;
|
||||
Directional_step=16;
|
||||
}
|
||||
else if (Directional_delay==150)
|
||||
Directional_delay=40;
|
||||
else if (Directional_delay!=0)
|
||||
Directional_delay=Directional_delay*8/10;
|
||||
else if (Directional_step<16*4)
|
||||
Directional_step++;
|
||||
Directional_last_move = Now;
|
||||
|
||||
// Directional controller UP
|
||||
if ((Directional_up||Directional_up_left||Directional_up_right) &&
|
||||
!(Directional_down_right||Directional_down||Directional_down_left))
|
||||
{
|
||||
//si on est déjà en haut on peut plus bouger
|
||||
if(INPUT_Nouveau_Mouse_Y!=0)
|
||||
{
|
||||
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
|
||||
INPUT_Nouveau_Mouse_Y=INPUT_Nouveau_Mouse_Y<Loupe_Facteur?0:INPUT_Nouveau_Mouse_Y-Loupe_Facteur;
|
||||
else
|
||||
INPUT_Nouveau_Mouse_Y-=Directional_step/16;
|
||||
Move_cursor_with_constraints();
|
||||
}
|
||||
}
|
||||
// Directional controller RIGHT
|
||||
if ((Directional_up_right||Directional_right||Directional_down_right) &&
|
||||
!(Directional_down_left||Directional_left||Directional_up_left))
|
||||
{
|
||||
if(INPUT_Nouveau_Mouse_X<Largeur_ecran-1)
|
||||
{
|
||||
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
|
||||
{
|
||||
INPUT_Nouveau_Mouse_X+=Loupe_Facteur;
|
||||
if (INPUT_Nouveau_Mouse_X>=Largeur_ecran)
|
||||
INPUT_Nouveau_Mouse_X=Largeur_ecran-1;
|
||||
}
|
||||
else
|
||||
INPUT_Nouveau_Mouse_X+=Directional_step/16;
|
||||
Move_cursor_with_constraints();
|
||||
}
|
||||
}
|
||||
// Directional controller DOWN
|
||||
if ((Directional_down_right||Directional_down||Directional_down_left) &&
|
||||
!(Directional_up_left||Directional_up||Directional_up_right))
|
||||
{
|
||||
if(INPUT_Nouveau_Mouse_Y<Hauteur_ecran-1)
|
||||
{
|
||||
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
|
||||
{
|
||||
INPUT_Nouveau_Mouse_Y+=Loupe_Facteur;
|
||||
if (INPUT_Nouveau_Mouse_Y>=Hauteur_ecran)
|
||||
INPUT_Nouveau_Mouse_Y=Hauteur_ecran-1;
|
||||
}
|
||||
else
|
||||
INPUT_Nouveau_Mouse_Y+=Directional_step/16;
|
||||
Move_cursor_with_constraints();
|
||||
}
|
||||
}
|
||||
// Directional controller LEFT
|
||||
if ((Directional_down_left||Directional_left||Directional_up_left) &&
|
||||
!(Directional_up_right||Directional_right||Directional_down_right))
|
||||
{
|
||||
if(INPUT_Nouveau_Mouse_X!=0)
|
||||
{
|
||||
if(Loupe_Mode && INPUT_Nouveau_Mouse_Y < Menu_Ordonnee && INPUT_Nouveau_Mouse_X > Principal_Split)
|
||||
INPUT_Nouveau_Mouse_X-=Loupe_Facteur;
|
||||
else
|
||||
INPUT_Nouveau_Mouse_X-=Directional_step/16;
|
||||
Move_cursor_with_constraints();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Vidage de toute mise à jour de l'affichage à l'écran qui serait encore en attente.
|
||||
// (c'est fait ici car on est sur que cette fonction est apellée partout ou on a besoin d'interragir avec l'utilisateur)
|
||||
Flush_update();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user