Dobra mam coś takiego:
unit gEngine_Keyboard;
{==============================================================================}
{$mode objfpc}{$H+}
{==============================================================================}
interface
{==============================================================================}
uses
Classes, SysUtils;
{==============================================================================}
var
Keys : array[0..255] of boolean; // Tablica przechowująca stan klawiszy (true - wciśnięty, false - niewciśnięty)
SpecialKeys : array[0..20] of boolean; // Tablica przechowująca stan specjalnych klawiszy (F1-F12 itp) (true - wciśnięty, false - niewciśnięty)
SpecialKeyPressed : boolean; // Zmienna przechowująca informacje czy naciśnięto specjalny klawisz.
NormalKeyPressed : boolean; // Zmienna przechwująca informacje czy naciśnięto normalny klawisz.
{==============================================================================}
procedure KeyDown(Key : Byte; X, Y : Integer); cdecl;
procedure KeyUp(Key : Byte; X, Y : Integer); cdecl;
procedure SpecialKeyDown(Key : Integer; X, Y : longint); cdecl;
procedure SpecialKeyUp(Key : Integer; X, Y : longint); cdecl;
function GetKey(Key : Integer) : Boolean;
function GetSpecialKey(Key : Integer) : Boolean;
procedure ClearKeys;
{==============================================================================}
implementation
{==============================================================================}
// Callback do glutKeyboardFunc.
//--------------------------
procedure KeyDown(Key : Byte; X, Y : Longint); cdecl;
begin
Keys[Key] := true;
NormalKeyPressed := true;
SpecialKeys[Key] := false;
SpecialKeyPressed := false;
end;
{------------------------------------------------------------------------------}
// Callback do glutKeyboardUpFunc.
//----------------------------
procedure KeyUp(Key : Byte; X, Y : Longint); cdecl;
begin
Keys[Key] := false;
NormalKeyPressed := false;
SpecialKeys[Key] := false;
SpecialKeyPressed := false;
end;
{------------------------------------------------------------------------------}
// Callback do glutSpecialFunc.
//-----------------------------
procedure SpecialKeyDown(Key : Integer; X, Y : longint); cdecl;
begin
SpecialKeys[Key] := true;
SpecialKeyPressed := true;
Keys[Key] := false;
NormalKeyPressed := false;
end;
{------------------------------------------------------------------------------}
// Callback do glutSpecialUpFunc.
//-----------------------------
procedure SpecialKeyUp(Key : Integer; X, Y : longint); cdecl;
begin
SpecialKeys[Key] := false;
SpecialKeyPressed := false;
Keys[Key] := false;
NormalKeyPressed := false;
end;
{------------------------------------------------------------------------------}
// Pobiera stan klawisza "Key".
//-----------------------------
function GetKey(Key : Integer) : Boolean;
begin
result := Keys[Key]
end;
{------------------------------------------------------------------------------}
function GetSpecialKey(Key : Integer) : Boolean;
begin
result := SpecialKeys[Key]
end;
{------------------------------------------------------------------------------}
// Ustawia stan wszystkich klawiszy na niewciśnięte.
//--------------------------------------------------
procedure ClearKeys;
var
i : Byte;
begin
for i := 0 to 255 do
Keys[i] := false;
for i := 0 to 20 do
SpecialKeys[i] := false;
end;
{==============================================================================}
end.
Jak zakomentowałem wszystko co dotyczy tablicy Keys (procedury funkcje itp). To kod dalej działał. Wykrywał poprawnie wszystkie specjalne klawisze których wartość przekracza 20.
GLUT_KEY_LEFT: 100
GLUT_KEY_UP: 101
GLUT_KEY_RIGHT: 102
GLUT_KEY_DOWN: 103
GLUT_KEY_PAGE_UP: 104
GLUT_KEY_PAGE_DOWN: 105
GLUT_KEY_HOME: 106
GLUT_KEY_END: 107
GLUT_KEY_INSERT: 108
Niby skoro działa to mógłbym zostawić ale chciałbym wiedzieć czemu działa mimo, że niby nie powinno.