Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-02-2006
hEakfall hEakfall is offline
No confirmado
 
Registrado: nov 2005
Posts: 9
Poder: 0
hEakfall Va por buen camino
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. ^^
Responder Con Cita
  #2  
Antiguo 13-02-2006
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.234
Poder: 20
ElKurgan Va camino a la fama
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
Responder Con Cita
  #3  
Antiguo 17-08-2006
hEakfall hEakfall is offline
No confirmado
 
Registrado: nov 2005
Posts: 9
Poder: 0
hEakfall Va por buen camino
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??
Responder Con Cita
  #4  
Antiguo 17-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 17-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 17-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Parece que dec se me ha adelantado mientras estaba respondiendo
Responder Con Cita
  #7  
Antiguo 18-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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é. Pero, vamos, que no está mal.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
migrar delphi 6 -> Delphi 8 / 2005 ? yigo Varios 3 12-01-2007 20:39:51
Cambiar a Delphi 2005 razadi Varios 1 01-06-2005 17:07:55
Error al instalar Delphi 6 CORBATIN Varios 4 09-08-2004 14:44:57
¿Cual es el futuro de Delphi? Voutarks Debates 33 13-04-2004 19:29:08
Mejoras de delphi 6 frente a delphi 5 frankmch Debates 2 25-09-2003 16:15:30


La franja horaria es GMT +2. Ahora son las 10:25:19.


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
Copyright 1996-2007 Club Delphi