X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fengine%2Fe_input.pas;h=b16508fb3a4171a85f99630c9b18776be47a27e3;hb=5d49aa6a925e49d43993305b3e4071fd70286a90;hp=67e0b5d9a2201ad51cbbf4a4e310cf7f715a5f1d;hpb=dfd3e97bffa213f5b21206b8a292b80180bab948;p=d2df-sdl.git diff --git a/src/engine/e_input.pas b/src/engine/e_input.pas index 67e0b5d..b16508f 100644 --- a/src/engine/e_input.pas +++ b/src/engine/e_input.pas @@ -5,65 +5,76 @@ interface uses SysUtils, e_log, - SDL; + SDL2; const - e_MaxKbdKeys = 321; + e_MaxKbdKeys = SDL_NUM_SCANCODES; e_MaxJoys = 4; e_MaxJoyBtns = 32; e_MaxJoyAxes = 4; e_MaxJoyHats = 4; - + e_MaxJoyKeys = e_MaxJoyBtns + e_MaxJoyAxes*2 + e_MaxJoyHats*4; - + e_MaxInputKeys = e_MaxKbdKeys + e_MaxJoys*e_MaxJoyKeys - 1; // $$$..$$$ - 321 Keyboard buttons/keys // $$$..$$$ - 4*32 Joystick buttons // $$$..$$$ - 4*4 Joystick axes (- and +) // $$$..$$$ - 4*4 Joystick hats (L U R D) - + // these are apparently used in g_gui and g_game and elsewhere - IK_UNKNOWN = SDLK_UNKNOWN; IK_INVALID = 65535; - IK_ESCAPE = SDLK_ESCAPE; - IK_RETURN = SDLK_RETURN; - IK_ENTER = SDLK_RETURN; - IK_UP = SDLK_UP; - IK_DOWN = SDLK_DOWN; - IK_LEFT = SDLK_LEFT; - IK_RIGHT = SDLK_RIGHT; - IK_DELETE = SDLK_DELETE; - IK_HOME = SDLK_HOME; - IK_INSERT = SDLK_INSERT; - IK_SPACE = SDLK_SPACE; - IK_CONTROL = SDLK_LCTRL; - IK_SHIFT = SDLK_LSHIFT; - IK_TAB = SDLK_TAB; - IK_PAGEUP = SDLK_PAGEUP; - IK_PAGEDN = SDLK_PAGEDOWN; - IK_F2 = SDLK_F2; - IK_F3 = SDLK_F3; - IK_F4 = SDLK_F4; - IK_F5 = SDLK_F5; - IK_F6 = SDLK_F6; - IK_F7 = SDLK_F7; - IK_F8 = SDLK_F8; - IK_F9 = SDLK_F9; - IK_F10 = SDLK_F10; - IK_END = SDLK_END; - IK_BACKSPACE = SDLK_BACKSPACE; - IK_BACKQUOTE = SDLK_BACKQUOTE; - IK_PAUSE = SDLK_PAUSE; + IK_ESCAPE = SDL_SCANCODE_ESCAPE; + IK_RETURN = SDL_SCANCODE_RETURN; + IK_KPRETURN= SDL_SCANCODE_KP_ENTER; + IK_ENTER = SDL_SCANCODE_RETURN; + IK_UP = SDL_SCANCODE_UP; + IK_KPUP = SDL_SCANCODE_KP_8; + IK_DOWN = SDL_SCANCODE_DOWN; + IK_KPDOWN = SDL_SCANCODE_KP_2; + IK_LEFT = SDL_SCANCODE_LEFT; + IK_KPLEFT = SDL_SCANCODE_KP_4; + IK_RIGHT = SDL_SCANCODE_RIGHT; + IK_KPRIGHT = SDL_SCANCODE_KP_6; + IK_DELETE = SDL_SCANCODE_DELETE; + IK_HOME = SDL_SCANCODE_HOME; + IK_KPHOME = SDL_SCANCODE_KP_7; + IK_INSERT = SDL_SCANCODE_INSERT; + IK_SPACE = SDL_SCANCODE_SPACE; + IK_CONTROL = SDL_SCANCODE_LCTRL; + IK_SHIFT = SDL_SCANCODE_LSHIFT; + IK_TAB = SDL_SCANCODE_TAB; + IK_PAGEUP = SDL_SCANCODE_PAGEUP; + IK_KPPAGEUP= SDL_SCANCODE_KP_9; + IK_PAGEDN = SDL_SCANCODE_PAGEDOWN; + IK_KPPAGEDN= SDL_SCANCODE_KP_3; + IK_F2 = SDL_SCANCODE_F2; + IK_F3 = SDL_SCANCODE_F3; + IK_F4 = SDL_SCANCODE_F4; + IK_F5 = SDL_SCANCODE_F5; + IK_F6 = SDL_SCANCODE_F6; + IK_F7 = SDL_SCANCODE_F7; + IK_F8 = SDL_SCANCODE_F8; + IK_F9 = SDL_SCANCODE_F9; + IK_F10 = SDL_SCANCODE_F10; + IK_END = SDL_SCANCODE_END; + IK_KPEND = SDL_SCANCODE_KP_1; + IK_BACKSPACE = SDL_SCANCODE_BACKSPACE; + IK_BACKQUOTE = SDL_SCANCODE_GRAVE; + IK_GRAVE = SDL_SCANCODE_GRAVE; + IK_PAUSE = SDL_SCANCODE_PAUSE; + IK_Y = SDL_SCANCODE_Y; + IK_N = SDL_SCANCODE_N; // TODO: think of something better than this shit - IK_LASTKEY = 320; - + IK_LASTKEY = SDL_NUM_SCANCODES-1; + AX_MINUS = 0; AX_PLUS = 1; HAT_LEFT = 0; HAT_UP = 1; HAT_RIGHT = 2; HAT_DOWN = 3; - + function e_InitInput(): Boolean; procedure e_ReleaseInput(); procedure e_ClearInputBuffer(); @@ -112,7 +123,7 @@ type var KeyBuffer: array [0..e_MaxKbdKeys] of Boolean; - Joysticks: array of TJoystick = nil; + Joysticks: array of TJoystick = nil; function OpenJoysticks(): Byte; var @@ -156,7 +167,7 @@ begin SDL_JoystickClose(Handle); SetLength(Joysticks, 0); end; - + function PollKeyboard(): Boolean; var Keys: PByte; @@ -164,15 +175,15 @@ var i: Cardinal; begin Result := False; - Keys := SDL_GetKeyState(@NKeys); + Keys := SDL_GetKeyboardState(@NKeys); if (Keys = nil) or (NKeys < 1) then Exit; for i := 0 to NKeys do KeyBuffer[i] := ((PByte(Cardinal(Keys) + i)^) <> 0); for i := NKeys to High(KeyBuffer) do KeyBuffer[i] := False; -end; - +end; + function PollJoysticks(): Boolean; var i, j: Word; @@ -205,12 +216,8 @@ var begin // keyboard key names for i := 0 to IK_LASTKEY do - begin - e_KeyNames[i] := SDL_GetKeyName(i); - if e_KeyNames[i] = 'unknown key' then - e_KeyNames[i] := ''; - end; - + e_KeyNames[i] := SDL_GetScancodeName(i); + // joysticks for j := 0 to e_MaxJoys-1 do begin @@ -236,7 +243,7 @@ begin end; end; end; - + function e_InitInput(): Boolean; begin Result := False; @@ -253,7 +260,7 @@ begin ReleaseJoysticks(); e_JoysticksAvailable := 0; end; - + procedure e_ClearInputBuffer(); var i, j, d: Integer; @@ -270,7 +277,7 @@ begin for j := Low(Joysticks[i].HatBuf) to High(Joysticks[i].HatBuf) do for d := Low(Joysticks[i].HatBuf[j]) to High(Joysticks[i].HatBuf[j]) do Joysticks[i].HatBuf[j, d] := False; - end; + end; end; function e_PollInput(): Boolean; @@ -289,12 +296,12 @@ var begin Result := False; if (Key = IK_INVALID) or (Key = 0) then Exit; - + if (Key < KBRD_END) then begin // Keyboard buttons/keys Result := KeyBuffer[Key]; end - + else if (Key >= JOYK_BEG) and (Key < JOYK_END) then begin // Joystick buttons JoyI := (Key - JOYK_BEG) div e_MaxJoyBtns; @@ -306,7 +313,7 @@ begin Result := Joysticks[JoyI].ButtBuf[Key]; end; end - + else if (Key >= JOYA_BEG) and (Key < JOYA_END) then begin // Joystick axes JoyI := (Key - JOYA_BEG) div (e_MaxJoyAxes*2); @@ -318,13 +325,13 @@ begin dir := Key mod 2; if dir = AX_MINUS then Result := Joysticks[JoyI].AxisBuf[Key div 2] < -e_JoystickDeadzones[JoyI] - else + else Result := Joysticks[JoyI].AxisBuf[Key div 2] > e_JoystickDeadzones[JoyI] - end; + end; end - + else if (Key >= JOYH_BEG) and (Key < JOYH_END) then - begin // Joystick hats + begin // Joystick hats JoyI := (Key - JOYH_BEG) div (e_MaxJoyHats*4); if JoyI >= e_JoysticksAvailable then Result := False @@ -333,7 +340,7 @@ begin Key := (Key - JOYH_BEG) mod (e_MaxJoyHats*4); dir := Key mod 4; Result := Joysticks[JoyI].HatBuf[Key div 4, dir]; - end; + end; end; end; @@ -342,12 +349,12 @@ var JoyI, dir: Integer; begin if (Key = IK_INVALID) or (Key = 0) then Exit; - + if (Key < KBRD_END) then begin // Keyboard buttons/keys keyBuffer[key] := (state <> 0); end - + else if (Key >= JOYK_BEG) and (Key < JOYK_END) then begin // Joystick buttons JoyI := (Key - JOYK_BEG) div e_MaxJoyBtns; @@ -359,9 +366,9 @@ begin Joysticks[JoyI].ButtBuf[Key] := (state <> 0); end; end - + else if (Key >= JOYA_BEG) and (Key < JOYA_END) then - begin // Joystick axes + begin // Joystick axes JoyI := (Key - JOYA_BEG) div (e_MaxJoyAxes*2); if JoyI >= e_JoysticksAvailable then Exit @@ -369,11 +376,11 @@ begin begin Key := (Key - JOYA_BEG) mod (e_MaxJoyAxes*2); Joysticks[JoyI].AxisBuf[Key div 2] := state; - end; + end; end - + else if (Key >= JOYH_BEG) and (Key < JOYH_END) then - begin // Joystick hats + begin // Joystick hats JoyI := (Key - JOYH_BEG) div (e_MaxJoyHats*4); if JoyI >= e_JoysticksAvailable then Exit @@ -382,7 +389,7 @@ begin Key := (Key - JOYH_BEG) mod (e_MaxJoyHats*4); dir := Key mod 4; Joysticks[JoyI].HatBuf[Key div 4, dir] := (state <> 0); - end; + end; end; end;