Obsługa klawiatury w delphi

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>wątpliwośći</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>bylabym</ort> wdzieczna:

Kopiuj
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

Kopiuj
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

Kopiuj
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

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

end;

//nacisniecie klaiwsza na klawiaturze

Kopiuj
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.

SZ
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 15 lat
  • Postów:3356
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.


Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir "Szczawik" Włodkowski
JU
  • Rejestracja:około 22 lata
  • Ostatnio:3 miesiące
  • Postów:5042
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

Kopiuj
  if (key = 'k') or (key = 'K') then....
LE
  • Rejestracja:ponad 20 lat
  • Ostatnio:około 12 lat
  • Postów:144
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....


Piszę proste programy i stronki internetowe na zlecenie, zaliczenie...
Delphi, Pascal, C++, HTML, CSS, JAVASCRIPT, MySQL, PHP
Kontakt: gg:1477872 e-mail: lewymati@wp.pl
WIktorDelphi
  • Rejestracja:prawie 19 lat
  • Ostatnio:prawie 17 lat
0

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


<img src="http://www.drajwer.iglu.cz/syg/display.php?id=113" alt="user image" />

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.