• Miércoles 20 de Noviembre de 2024, 16:17

Autor Tema:  Keydown Reacionante A Dos Teclas  (Leído 2850 veces)

Chinta Nemoto

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Keydown Reacionante A Dos Teclas
« en: Sábado 3 de Enero de 2004, 00:03 »
0
mi evento keydown, tiene el procedure asociado:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
    edit1.Text := inttostr(key);
    If Key = 40 Then //abajo
        if shape3.top <= 149 then shape3.top := shape3.Top + 6;
    If Key = 38 Then //arriba
        if shape3.Top >= 3 then shape3.Top := shape3.Top - 6;
    If Key = 65 Then //A
        if shape2.Top >= 3 then shape2.Top := shape2.Top - 6;
    If Key = 90 Then //Z
        if shape2.Top <= 149 then shape2.Top := shape2.Top + 6;
    if key = 113 then//F2
    begin
        timer1.Enabled := not timer1.enabled
    end;
end;

el programa hace 5 comprobaciones, el programa es el antiguo PONG (el de los palitos y la pelota).

si se presiona A o Z, el programa moverá la shape2 arriba o abajo respectivamente. (jugador 1)

si se presiona la flecha arriba o la flecha abajo, en esas direcciones irá el jugador 2.

ahora el problema: cuando presiono una tecla y la mantengo presionada, el eventi se mantiene, y el cosito se mueve hasta que se deje de presionar la tecla, pero si mantengo la primera tecla, y a la vez mantengo presionada una segunda tecla, entonces lo que pasará es que se dejará de mover el primer coso en la primer direccion en que se estaba moviendo, para empezar a moverse el segundo (o el primer coso en una nueva direccion, depende de las teclas que se presionan).

Lo que quiero hacer es que se reconozcan ambas teclas a la ves, asi los jugadores se mueven con libertad ( en el rango reglamentario del ping pong: arriba o abajo)

BlackTigerX

  • Miembro activo
  • **
  • Mensajes: 92
    • Ver Perfil
Re: Keydown Reacionante A Dos Teclas
« Respuesta #1 en: Sábado 3 de Enero de 2004, 18:54 »
0
lo que describes es exactamente lo que le estas diciendo que haga... si lo que quieres es que puedas tener varias teclas a la vez, tienes que guardar el status de las teclas en algun lado, en un array por ejemplo

Keys: array [0..255] of Boolean;

luego en tu evento, simplemente tener algo como

Código: Text
  1. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  2.   Shift: TShiftState);
  3. begin
  4.   if (Key&#62;=65) and (Key&#60;=90) then
  5.     Keys[Key]:=True;
  6.   //a partir de aqui, se puede reemplazar con una llamada a &#34;MoverObjetos&#34;
  7.   if (Keys[Ord('A')]) then
  8.     label1.Caption:='A presionada';
  9.   if (Keys[Ord('B')]) then
  10.     label2.Caption:='B presionada'
  11.  

si tu defines una funcion MoverObjetos, simplemente tienes que leer el array para saber que teclas estan presionadas... una cosa que te recomiendo para hacer juegos es que no uses muchos diferentes eventos para realizar tareas que afecten el juego, lo que quiero decir, es que todo debe estar centralizado por ejemplo en el codigo de OnTimer, el codigo de FormKeyDown solo utilizalo para llenar el array con las teclas que necesites, pero para manejar el movimiento, hazlo en el evento de tu OnTimer de esa manera tu programa funciona igual para computadoras lentas que rapidas, porque tu controlas el tiempo, si lo haces en el evento KeyDown, algunas computadoras podran responder lento, otras no tanto, etc...

finalmente, para desactivar las teclas, tendrias que tener este codigo

Código: Text
  1. procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  2.   Shift: TShiftState);
  3. begin
  4.   if (Key&#62;=65) and (Key&#60;=90) then
  5.     Keys[Key]:=False;
  6.   //a partir de aqui no necesitas este codigo, solo lo puse para la prueba
  7.   if not (Keys[Ord('A')]) then
  8.     label1.Caption:='A suelta';
  9.   if not (Keys[Ord('B')]) then
  10.     label2.Caption:='B suelta'
  11. end;
  12.  
  13.  
BlackTigerX

Chinta Nemoto

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Keydown Reacionante A Dos Teclas
« Respuesta #2 en: Sábado 3 de Enero de 2004, 22:18 »
0
Me diste una ideaza. tiene que ver con el keyup. gracias.

BlackTigerX

  • Miembro activo
  • **
  • Mensajes: 92
    • Ver Perfil
Re: Keydown Reacionante A Dos Teclas
« Respuesta #3 en: Domingo 4 de Enero de 2004, 09:01 »
0
combina eso con el arreglo de teclas y podras tener control sobre multiples teclas
salu2
BlackTigerX

baygon

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Keydown Reacionante A Dos Teclas
« Respuesta #4 en: Lunes 2 de Febrero de 2004, 01:43 »
0
Hay una mejor manera de hacer esto y es a traves de windows,
en el uses agregá "uses windows;"

ahora cuando keres saber si esta presionada la tecla llamá en
el OnKeyDown

if GetKeyState(VK_INTRO) shr 31 <>0 then //se presiono
 begin
   //lo que quieras
 end;

 VK_INTRO lo podes reemplazar por lo que quieras, por ejemplo VK_A, VK_B, VK_SPACE, etc

BlackTigerX

  • Miembro activo
  • **
  • Mensajes: 92
    • Ver Perfil
Re: Keydown Reacionante A Dos Teclas
« Respuesta #5 en: Jueves 5 de Febrero de 2004, 20:24 »
0
muy cierto, de hecho esto ultimo es lo que estoy usando en un proyectito que se me vino a la mente hace algunos dias (un robot en Delphi para que "juegue" un juego grafico), mientras yo lo observo, cuando le quiero mandar instrucciones (para detenerlo o echarlo a andar otravez), simplemente presiono una secuencia de teclas y tengo el codigo que mencionas en un Timer
BlackTigerX