Obsługa klawiatury w delphi

0

Witam wszystkich;)

Przeglądałam to forum już kilka razy i nie napotkałam na temat który w pełni zaspokoił by moje ort!
i który by mi pomógł w 100%.

Mianowicie chodzi o co, chodzi o to że pisze sobie Arkanoida i mam problem z kierowaniem "deski" za pomocą klawiatury. Jak nacisnę :"Nowagra" wygeneruja mi sie sciany do zbijania i deska(pileczke <ort>na razie</ort> zrostawiam) i jak dobrze rozumie w momencie jak nacisne k lub l deska powinna sie poruszac a tak sie nie dzieje. Ponizej zalaczam w jaki sposob napisalam te procedury jakby ktos mogl mi wskazac blad to ort! wdzieczna:

procedure TForm1.Nowagra1Click(Sender: TObject);
begin
 x:=150;                       //polozenie po x
 y:=50;                       //polozenie po y
 fi:=0;                      //kat
 p:=300;                    //polozenie deski po x
 sciana1;                   //wywolanie utworzenia sciany 1
 sciana2;                   //wywolanie utworzenia sciany 2
 sciana3;                   //wywolanie utworzenia sciany 3
 sciana4;                   //wywolanie utworzenia sciany 4
 deska2:=TBitmap.Create;     //utworzenie bitmapy
 Deska2.LoadFromFile('deska.bmp');   //wczytanie bitmapy
 Image1.Canvas.Draw(p,Image1.Height-20,deska2);   //wyswietlenie bitmapy
 deska2.free;                  //zwolnienie bitmapy
end;

//przesuniecie deski w lewo

procedure TForm1.deska_w_lewo;
begin
 deska:=TBitmap.Create;     //utworzenie bitmapy
 Deska.LoadFromFile('deska.bmp');   //wczytanie bitmapy
 Image1.Canvas.Draw(p,Image1.Height-20,deska);   //wyswietlenie bitmapy
 deska.free;                  //zwolnienie bitmapy
 p:=p-5;                      //zmiana wspolrzedniej x
 deska2:=TBitmap.Create;     //utworzenie bitmapy
 Deska2.LoadFromFile('deska.bmp');   //wczytanie bitmapy
 Image1.Canvas.Draw(p,Image1.Height-20,deska2);   //wyswietlenie bitmapy
 deska2.free;                  //zwolnienie bitmapy
end;

//przesuniecie deski w lewo

procedure TForm1.deska_w_prawo;
begin
 deska:=TBitmap.Create;     //utworzenie bitmapy
 Deska.LoadFromFile('deska.bmp');   //wczytanie bitmapy
 Image1.Canvas.Draw(p,Image1.Height-20,deska);   //wyswietlenie bitmapy
 deska.free;                  //zwolnienie bitmapy
 p:=p+5;                      //zmiana wspolrzedniej x
 deska2:=TBitmap.Create;     //utworzenie bitmapy
 Deska2.LoadFromFile('deska.bmp');   //wczytanie bitmapy
 Image1.Canvas.Draw(p,Image1.Height-20,deska2);   //wyswietlenie bitmapy
 deska2.free;                  //zwolnienie bitmapy
end;

//wlaczenie/wylaczenie pauzy

procedure TForm1.pauza;
begin
 if not Timer1.Enabled then
  Timer1.Enabled:=true
  else
  Timer1.Enabled:=False;
  ShowMessage('Pauza zalaczona');

end;

//nacisniecie klaiwsza na klawiaturze

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  case key of
  'k' : deska_w_lewo;
  'l' : deska_w_prawo;
  'p' : pauza;
  end;
end;

z gory dziekuje za pomoc

dorota.

0

Zamiast takiej obsługi klawiatury w komunikacie (który może trafić do innego aktywnego komponentu na formie), lepiej na przykład w timerze (25ms) sprawdzać klawiaturę przez GetAsyncKeyState - unikniesz niepotrzebnej pracy i efektu opóźnienia przy przytrzymaniu klawisza.

0

Czemu każde przesunięcie wywołuje ponowne zaczytanie rysunku? Przecież lepiej byłoby wczytać go raz na początku do image'a, a potem przemieszczać samego image'a.

Poza tym.
CASE działa tylko z wartościami liczbowymi(przynajmniej tak było w starszych wersjach Delphi), wobec tego zostają tylko ify.
Pamiętaj też, że ktoś może mieć włączony caps lock i ten kod już nie zadziała :>

Czyli

  if (key = 'k') or (key = 'K') then....
0
Juhas napisał(a)

CASE działa tylko z wartościami liczbowymi(przynajmniej tak było w starszych wersjach Delphi), wobec tego zostają tylko ify.

Może i tak było w starszych wersjach, ale jestem pewien, że w delphi 7, (nawet chyba w d6) case obsługuje char....

0

Delphi i Pascal zawsze obsługuje w case dane liczbowe i char.

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