Avatar billede trolle Nybegynder
07. juli 2000 - 16:42 Der er 3 kommentarer og
4 løsninger

OnKeydown vs. OnKeypress

Hej

Jeg er i gang med at lave et godt gammeldags "orme-spil". Men jeg er stødt ind i alvorligt problem:
Jeg kan ikke få spillet til at registerer når der bliver trykket på en tast (piletasterne)!!!
ER der en der venligst kan foreklare dette på baby sprog, thi jeg er rimelig uerfaren inden for området!!!
Det er såadan i spillet at når en piletast bliver trykket ned, så skal ormen jo naturligvis dreje, hvilket jeg får den til via forskellige funktioner (og formenlig en "timer", som jeg heller ikke ved hvordan man bruger, men det kommer der nok snart et andet spårgsmål med!'s')
Avatar billede damir Nybegynder
07. juli 2000 - 17:05 #1
På Swiss Delphi Centre kan du downloade *et godt gammeldages* orme spil;
          |
          V
http://www.swissdelphicenter.ch/en/beispiele.php3

Avatar billede dj Nybegynder
07. juli 2000 - 17:06 #2
onKeyDown = Når tasten BLIVER trykket ned.
onKeyPress = Når tasten ER trykket ned og evt. bliver holdt nede.

Mvh. _DJ_
Avatar billede damir Nybegynder
07. juli 2000 - 17:07 #3
Kig under Snake Spiel;
Avatar billede sjensen Nybegynder
08. juli 2000 - 08:55 #4
Når du vil kigge på piletasterne er det events OnKeyDown (eller OnKeyUp) du skal bruge:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if shiftstate = [] then  // ingen shift, ctrl, alt eller kombination heraf trykket samtidig
  begin
    if key = VK_LEFT then // venstre pil
    begin
      // drej ormen til venstre
    end;
    if key = VK_RIGHT then // højre pil
    begin
      // drej ormen til højre
    end;
    if key = VK_UP then // op pil
    begin
      // drej ormen opad
    end;
    if key = VK_DOWN then // ned pil
    begin
      // drej ormen nedad
    end;
  end;
end;

Så enkelt er det. Her er i øvrigt en list over de virtuelle "keycodes" in Win32:

  VK_LBUTTON = 1;
  VK_RBUTTON = 2;
  VK_CANCEL = 3;
  VK_MBUTTON = 4;  { NOT contiguous with L & RBUTTON }
  VK_BACK = 8;
  VK_TAB = 9;
  VK_CLEAR = 12;
  VK_RETURN = 13;
  VK_SHIFT = $10;
  VK_CONTROL = 17;
  VK_MENU = 18;
  VK_PAUSE = 19;
  VK_CAPITAL = 20;
  VK_KANA = 21;
  VK_HANGUL = 21;
  VK_JUNJA = 23;
  VK_FINAL = 24;
  VK_HANJA = 25;
  VK_KANJI = 25;
  VK_CONVERT = 28;
  VK_NONCONVERT = 29;
  VK_ACCEPT = 30;
  VK_MODECHANGE = 31;
  VK_ESCAPE = 27;
  VK_SPACE = $20;
  VK_PRIOR = 33;
  VK_NEXT = 34;
  VK_END = 35;
  VK_HOME = 36;
  VK_LEFT = 37;
  VK_UP = 38;
  VK_RIGHT = 39;
  VK_DOWN = 40;
  VK_SELECT = 41;
  VK_PRINT = 42;
  VK_EXECUTE = 43;
  VK_SNAPSHOT = 44;
  VK_INSERT = 45;
  VK_DELETE = 46;
  VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
  VK_LWIN = 91;
  VK_RWIN = 92;
  VK_APPS = 93;
  VK_NUMPAD0 = 96;
  VK_NUMPAD1 = 97;
  VK_NUMPAD2 = 98;
  VK_NUMPAD3 = 99;
  VK_NUMPAD4 = 100;
  VK_NUMPAD5 = 101;
  VK_NUMPAD6 = 102;
  VK_NUMPAD7 = 103;
  VK_NUMPAD8 = 104;
  VK_NUMPAD9 = 105;
  VK_MULTIPLY = 106;
  VK_ADD = 107;
  VK_SEPARATOR = 108;
  VK_SUBTRACT = 109;
  VK_DECIMAL = 110;
  VK_DIVIDE = 111;
  VK_F1 = 112;
  VK_F2 = 113;
  VK_F3 = 114;
  VK_F4 = 115;
  VK_F5 = 116;
  VK_F6 = 117;
  VK_F7 = 118;
  VK_F8 = 119;
  VK_F9 = 120;
  VK_F10 = 121;
  VK_F11 = 122;
  VK_F12 = 123;
  VK_F13 = 124;
  VK_F14 = 125;
  VK_F15 = 126;
  VK_F16 = 127;
  VK_F17 = 128;
  VK_F18 = 129;
  VK_F19 = 130;
  VK_F20 = 131;
  VK_F21 = 132;
  VK_F22 = 133;
  VK_F23 = 134;
  VK_F24 = 135;
  VK_NUMLOCK = 144;
  VK_SCROLL = 145;
{ VK_L & VK_R - left and right Alt, Ctrl and Shift virtual keys.
  Used only as parameters to GetAsyncKeyState() and GetKeyState().
  No other API or message will distinguish left and right keys in this way. }
  VK_LSHIFT = 160;
  VK_RSHIFT = 161;
  VK_LCONTROL = 162;
  VK_RCONTROL = 163;
  VK_LMENU = 164;
  VK_RMENU = 165;
  VK_PROCESSKEY = 229;
  VK_ATTN = 246;
  VK_CRSEL = 247;
  VK_EXSEL = 248;
  VK_EREOF = 249;
  VK_PLAY = 250;
  VK_ZOOM = 251;
  VK_NONAME = 252;
  VK_PA1 = 253;
  VK_OEM_CLEAR = 254;
Avatar billede pellelil Nybegynder
08. juli 2000 - 11:18 #5
Ved at bruge formens OnKeyDown og OnKeyUp kan du faktisk læse flere taster på samme tid (eksempelvis om brugeren både trykker på Pil-Højre og Pil-Op).

Du lader din form have et array "Keys : Array[0..255] of boolean;". I din forms "OnCreate" sætter du alle værdier til false.

I din OnKeyDown sætter du værdierne "True", men det er så også her du skal teste på hvad brugeren har trykket på:
<SNIP>
  FKeys[(Key and $FF)] := True;
  if (FKeys[VK_RIGHT]) and (FKeys[VK_UP]) then begin
    // Brugeren trykker både pil_op og pil_ned
  end;
</SNIP>

I din OnKeyUP sætter du værdierne False:
<SNIP>
  FKeys[(Key and $FF)] := True;
</SNIP>
Avatar billede pellelil Nybegynder
10. juli 2000 - 14:13 #6
I "OnKeyUP" skal den selvfælgelig sætte verdien (i array'et) til "False" i stedet for "True"...
Avatar billede trolle Nybegynder
14. juli 2000 - 20:51 #7
Jeg er ked af at jeg først svarer nu, men det er vel trods alt sommerferie!!!

I mellem tiden har jeg dog fundet ud af hvad der er galt!
Det er yderst simpelt:
I formes properties er der et sted der hedder "KeyPreview" Og denne skal jo naturligvis være True!!!  Såre simpelt og så køre resten af sig selv!!!

Derfor vil jeg bare tildele pointsne ud til alle svarene!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester