Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pulsar dos teclas a la vez - Delphi (https://www.clubdelphi.com/foros/showthread.php?t=30212)

hEakfall 11-02-2006 15:24:43

Pulsar dos teclas a la vez - Delphi
 
olaxx, tengo una curiosidad, alguien sabe como hacer que una aplicacion pueda soportar dos teclas a la vez? estoy haciendo una juego de una nave que se mueve por la forma, y lo hace, pero solo para los costados y arriba abajo, pero no en diagonal y yo kiero que la nave sea capaz de moverse en diagonal. Estoy usando el Keypress para mover la nave. Espero que sepan la respuesta ^^. Chaufa.

Ahh, y si alguien sabe la respuesta en c++, muxo mejor. ^^

ElKurgan 13-02-2006 08:16:42

En Delphi puedes usar el evento OnKeyDown, que tiene dos parámetros de teclas, uno para una tecla normal y otro para teclas de tipo "Shift" (mayúsculas, Alt, Ctrl,...)

Un saludo

hEakfall 17-08-2006 23:27:07

no px, la cosa es q yo kiero apretar , x ejemplo, la tecla para arriba y la tecla para derecha y kiero q mi navecita se mueva en diagonal, manyas??

dec 17-08-2006 23:42:58

Hola,

Echa un vistazo a esta "cosa" que escribí en su momento, cuando se trató en estos Foros algo similar a lo que dices:

Código Delphi [-]
{*******************************************************}
{                                                       }
{       Pelota Loca, un programa inútil (?)             }
{                                                       }
{       Copyright (c) 2006 David Esperalta              }
{                                                       }
{               GNU Public License                      }
{                                                       }
{*******************************************************}

program PelotaLoca;

{$APPTYPE CONSOLE}

uses
  Forms,
  Windows,
  Classes,
  SysUtils,
  Controls,
  ExtCtrls,
  Graphics;

const
  CANTIDAD_MOVIMIENTO = 15; { Cantidad de movimiento }

var
  FForm  : TForm;
  FShape : TShape;

type
  TAuxiliar = class
  private
    FTimer: TTimer;
    procedure TimerTick(Sender: TObject);
    procedure KeyDownEvent(Sender: TObject;
               var Key: Word; Shift: TShiftState);
  public
    constructor Create;
    destructor Destroy; override;
  end;

{ TAuxiliar }

constructor TAuxiliar.Create;
begin
  FTimer := TTimer.Create(nil);
  FTimer.Interval := 100;
  FTimer.Enabled  := true;
  FTimer.OnTimer  := TimerTick;
end;

destructor TAuxiliar.Destroy;
begin
  FTimer.Free;
  inherited Destroy;
end;

procedure TAuxiliar.KeyDownEvent(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  with FShape do case Key of
    VK_UP:    Top  := Top  - CANTIDAD_MOVIMIENTO;
    VK_RIGHT: Left := Left + CANTIDAD_MOVIMIENTO;
    VK_DOWN:  Top  := Top  + CANTIDAD_MOVIMIENTO;
    VK_LEFT:  Left := Left - CANTIDAD_MOVIMIENTO;
  end;
end;

procedure TAuxiliar.TimerTick(Sender: TObject);
resourcestring
  rsCaption = 'Top: %d - Left: %d';
begin
  with FShape do
  begin
    FForm.Caption := Format(rsCaption, [Top, Left]);

    if (Left > FForm.Width)  then Left := 2;
    if (Top  > FForm.Height) then Top  := 2;

    if (Left < 0) then Left := (FForm.Width  - Width);
    if (Top  < 0) then Top  := (FForm.Height - Height);

    if (GetKeyState(VK_UP) and $4000) > 0
      then Top  := Top  - CANTIDAD_MOVIMIENTO;

    if (GetKeyState(VK_DOWN) and $4000) > 0
      then Top  := Top  + CANTIDAD_MOVIMIENTO;

    if (GetKeyState(VK_LEFT) and $4000) > 0
      then Left := Left - CANTIDAD_MOVIMIENTO;

    if (GetKeyState(VK_RIGHT) and $4000) > 0
      then Left := Left + CANTIDAD_MOVIMIENTO;
  end;
end;

procedure Inicializar();
var
  FAuxilar: TAuxiliar;
begin
  FAuxilar := TAuxiliar.Create;
  FForm    := TForm.Create(nil);
  FShape   := TShape.Create(FForm);

  with FForm do
  begin
    Width       := 400;
    Height      := 300;
    Color       := clWhite;
    KeyPreview  := true;
    BorderStyle := bsDialog;
    Position    := poDesktopCenter;
    OnKeyDown   := FAuxilar.KeyDownEvent;
  end;

  with FShape do
  begin
    Width       := 20;
    Height      := 20;
    Parent      := FForm;
    Brush.Color := clRed;
    Pen.Color   := clWhite;
    Shape       := stCircle;
    Top         := CANTIDAD_MOVIMIENTO;
    Left        := CANTIDAD_MOVIMIENTO;
  end;

  try
    FForm.ShowModal;
  finally
    FForm.Free;
    FAuxilar.Free;
  end;
end;

begin { application }

  Inicializar();

end.

seoane 17-08-2006 23:47:17

Seguro que hay algún método mejor de hacerlo, pero por que no comprobar que teclas están pulsadas. Podemos comprobarlo en el evento OnKeyDown, por ejemplo, o con algún Timer.

Código Delphi [-]
var
  izquierda, derecha, arriba, abajo: boolean;
begin
  izquierda:= (GetKeyState(VK_LEFT) and $80) > 0;
  derecha:= (GetKeyState(VK_RIGHT) and $80) > 0;
  arriba:= (GetKeyState(VK_UP) and $80) > 0;
  abajo:= (GetKeyState(VK_DOWN) and $80) > 0;
  // Aqui haz lo que quieras con las variables
end;

Aquí un ejemplo muy simple de una pelota moviéndose por el formulario

seoane 17-08-2006 23:48:41

Parece que dec se me ha adelantado mientras estaba respondiendo :)

dec 18-08-2006 00:17:29

Hola,

Cita:

Empezado por Seoane
Parece que dec se me ha adelantado mientras estaba respondiendo :)

No; no es que lo parezca, es que me adelanté. :eek: :eek: :cool: :p :cool: :D :D Pero, vamos, que no está mal. ;)

Ñuño Martínez 18-08-2006 12:33:18

Si quieres programar juegos no utilices la API de Delphi ni de Windows. Ten en cuenta que esta fue diseñada para hacer aplicaciones, no juegos.

Te recomiendo que busques y utilices librerías especializadas en juegos de ordenador, saldrás ganando porque te será más fácil hacer juegos y (la mayor ventaja en mi opinión) podrán ser portados a otros sistemas (incluso consolas) más fácilmente (si te transformas en un profesional del videojuego te será más fácil).

Te recomiendo SDL ya que tiene un conjunto de funciones robusto y utiliza OpenGL (la librería gráfica por excelencia), aunque personalmente no me gusta su sistema de "respuesta a eventos". Además existe un paquete para Delphi.

Te aviso de que es "muy profesional" así que si no tienes idea sobre "teoría de juegos" y "sistemas interactivos" te tropezarás constantemente. Si lo ves muy complicado echa un vistazo a Mingro. Es un proyecto en el que estoy trabajando con el que pretendo crear una librería para juegos simple dirigida a principiantes y aficionados. Es mucho más simple que SDL y funciona nativamente con Delphi. Así, de paso, puedes ayudarme a mejorarla con tus comentarios :D, y conocer al diseñador es una grandísima ventaja.


La franja horaria es GMT +2. Ahora son las 14:00:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi