Szybkie przechwytywanie eventów klawiatury

0

Witam,

mam problem taki, że przechwytuje eventy klawiatury w taki sposób:

procedure TGame.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if((Key=VK_LEFT) AND (Self.MenuPause.Checked=False)) then Bar.moveLeft(SHIFT_PX);
  if((Key=VK_RIGHT) AND (Self.MenuPause.Checked=False)) then Bar.moveRight(SHIFT_PX);
end;

A jako, że piszę grę typu arkanoid to muszę szybko przechwytywać eventy klawiatury. Problem mój z tą metodą polega na tym, że jeżeli przesuwam w lewo i nagle chce zmienić kierunek to niestety muszę kliknąć kliknąć kilka razy, żeby się to stało i mogę znów trzymać wciśnięty klawisz. Chciałbym, żeby bez przechwytywania myszy (tylko sterowanie belką za pomocą klawiatury) zrobić szybką zmianę kierunku. Dodam od razu, że kod ten jest bezpośrednio w formularzu (jej poruszanie jest w głównym wątku formularza). Belka jest obiektem TImage i korzystająć z "obiektowości" dodałem metody moveLeft(shift : Byte) oraz moveRight(shift : Byte), które działają tak, że przypisują belce nowe położenie tak:

Self.Left := Self.Left + shift;
//lub
Self.Left := Self.Left - shift;

W zależności od kierunku. Za pomoc z góry dzięki.

0

Spróbuj zmienić z "KeyDown" na "KeyPress".

0

Ale wtedy nie mogę przechwycić strzałek na klawiaturze. Czy da się to jakoś zrobić?

0

Przeanalizuj kod, który dołaczyłem do tego posta. Korzysta on z funkcji GetKeyboardState przez co reaguje na trzymanie przecisku lub obsługę dwóch klawiszy na raz. Może się to Tobie do czegoś przyda. Bo raczej nic lepszego nie wymyślę, może ktoś inny coś jeszcze tutaj Ci lepszego doradzi.

0

Dzięki bardzo. Jak zaimplemetuję ten mechanizm to będzie działać bo to jest to, o co mi chodziło.

0

W swoich kilku mizernych grach zawsze używałem czegoś takiego

type
  TKeys = record
    kUp, kDown, kLeft, kRight: Boolean;
  end;
var
  Keys: TKeys;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Case Char(Key) of
  'W': Keys.kUp := True;
  'S': Keys.kDown := True;
  'A': Keys.kLeft := True;
  'D': Keys.kRight := True;
end;
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Case Char(Key) of
  'W': Keys.kUp := False;
  'S': Keys.kDown := False;
  'A': Keys.kLeft := False;
  'D': Keys.kRight := False;
end;
end;

To chyba najlepsze możliwe wyjście, zawsze można się odwołać do tej klasy, i nie wiem kto Ci powiedział że w OnKeyDwon/OnKeyUp nie działają strzałki? Zastąp tylko litery tymi numerkami i na 100% zadziała.
#40 - doł
#39 - prawo
#38 - góra
#37 - lewo

I jeżeli ruszasz swoim bohaterem w ten sposób Boheter.Left := Bohter.Left + 10 to nie rób tego w OnKeyDown tylko w jakimś Timerze,

if Keys.kLeft then Bohater.Left := Bohater.Left - 10;
0

Dzięki bardzo wszystkim za odpowiedzi. Naprowadziły mnie co nieco w tym temacie. Obecnie zmagam się z pętlą czasu rzeczywistego...

1 użytkowników online, w tym zalogowanych: 0, gości: 1