Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2012, 23:06   #1
Андрей19930323
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 17
По умолчанию Одновременное нажатие стрелок

Пишу графическую программку. Не могу сделать передвижение графического объекта при нажатии двух стрелок одновременно. Подскажите, пожалуйста,как это сделать. Внизу код программы.

Код HTML:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
   Form1: TForm1;
   form,burd,plan: TBitmap;
   x,y: integer;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   form.Canvas.Draw(0, 0, burd);
   form.Canvas.Draw(x, y, plan);
   Form1.Canvas.Draw(0, 0, form);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Form1.Width := 1280;
   Form1.Height := 800;

   burd:= TBitmap.Create;
   burd.LoadFromFile('burd.bmp');
   burd.Width:= 1280;
   burd.Height:= 800;

   form:= TBitmap.Create;
   form.LoadFromFile('burd.bmp');
   form.Width:= 1280;
   form.Height:= 800;
   Canvas.Draw(0, 0, burd);

   plan:= TBitmap.Create;
   plan.LoadFromFile('plan.bmp');
   plan.Transparent:= True;
   plan.TransparentColor:= plan.Canvas.Pixels[1,1];
   Canvas.Draw(120, 120, plan);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
const
   n = 5;
begin
   Timer1.Enabled:= true;

   if Key = 37 then
     x:= x - n;

   if Key = 38 then
     y:= y - n;

   if Key = 39 then
     x:= x + n;

   if Key = 40 then
     y:= y + n;

   if Key = ord(' ') then
     y:= y - 666;

   {if ((key=37) and (key=38)) then
     begin
      x:= x - n;
      y:= y - n;
      end; }
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   Timer1.Enabled:= false;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
      form.Destroy;
      burd.Destroy;
      plan.Destroy;
      Timer1.Enabled:= false;
end;

end.
Андрей19930323 вне форума Ответить с цитированием
Старый 07.05.2012, 23:15   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Ох... мда точно не скажу
но попробуй так
проверять по VK
типо так
Код:
if Key = КОД_СТРЕЛКИ_НА_ВЕРХ(я не помню) and VK_LEFT in Shift then
   обрабатывай вверх на лево
тоже и для VK_DOWN VK_RIGHT VK_UP
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 07.05.2012, 23:29   #3
Андрей19930323
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
Ох... мда точно не скажу
но попробуй так
Код:
if Key = КОД_СТРЕЛКИ_НА_ВЕРХ(я не помню) and VK_LEFT in Shift then
   обрабатывай вверх на лево
сделал

Код:
   if (key=ord('38')) and VK_LEFT in Shift then
     begin
      y:= y - n;
      x:= x - n;
      end;
компилятор находит какую то ошибку(
Андрей19930323 вне форума Ответить с цитированием
Старый 07.05.2012, 23:35   #4
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Код:
ord(38)
?
да вы шутите! код строки 38 откуда компидятор его знает
как то так
Код:
 if (key = 38) and (VK_LEFT in Shift) then
     begin
      y:= y - n;
      x:= x - n;
      end;
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 07.05.2012, 23:42   #5
Андрей19930323
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
Код:
ord(38)
?
да вы шутите! код строки 38 откуда компидятор его знает
тупанул что то))

Цитата:
Сообщение от как то так
Код:
 if (key = 38) and (VK_LEFT in Shift) then
     begin
      y:= y - n;
      x:= x - n;
      end;
теперь компилятор пишет несовместимые типы
Андрей19930323 вне форума Ответить с цитированием
Старый 07.05.2012, 23:49   #6
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

вы в OnKeyDown или OnKeyPress обрабатываете?
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 07.05.2012, 23:52   #7
Андрей19930323
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
вы в OnKeyDown или OnKeyPress обрабатываете?
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
Андрей19930323 вне форума Ответить с цитированием
Старый 08.05.2012, 00:17   #8
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Так всё осинило!
Shift хранит состояние хлавишь Ctrl Shift Alt
Что вам делать
Либо через GetAsyncKeyState/GetKeyState либо делать вот так
Код:
var
  Form1: TForm1;
  Old_key: word;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Old_Key := 0;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Old_Key = 0  then
    Old_Key := Key;
  if (key = VK_UP) and (Old_key = VK_LEFT) then
  begin
    Label1.Caption := 'KEY_DOWn';
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Old_Key <> 0 then
  begin
    Old_KEy := 0;
    Label1.Caption := 'Key UP'
  end;

end;
ток соответствеено проверяйте все сочитания клавиш
Ток сработает ли это я не знаю!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 08.05.2012, 00:32   #9
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Код:
procedure tform1.Check;
begin
  if Hi(GetKeyState(VK_LEFT) > 0 then
    // äâèãàåì âëåâî
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift:
  TShiftState);
begin
  Check;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Check;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
  Check;
end;
и не паримся, и всем нравимся) только может на GetAsyncKeyState придётся перейти
вообще же, всё это убого, лучше замутить сингелтон KeyboardManager и через его интерфейс получать состояние клавиш... тогда будет легче менять логику взаимодействия с устройствами ввода


все вопросы к хакеру, он же девелопер, а я так, жалкий архитектор =) спать смылся

Последний раз редактировалось GreenWizard; 08.05.2012 в 00:34.
GreenWizard вне форума Ответить с цитированием
Старый 08.05.2012, 01:35   #10
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);
var tk: TKeyboardState;
begin
 GetKeyboardState(tk);
 if 0 <> tk[VK_LEFT]  then
  // чего_то_там
 if 0 <> tk[VK_RIGHT]  then
  // итд
end;
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
одновременное нажатие glebast Общие вопросы Delphi 2 30.04.2012 13:59
[Qt] Одновременное нажатие клавиш Voltrex Помощь студентам 1 20.05.2011 22:06
Одновременное нажатие N клавишь tanas Win Api 1 23.06.2010 13:06
одновременное нажатие клавиш DeDoK Общие вопросы Delphi 3 08.01.2010 16:59
Одновременное нажатие клавиш. Вадим Буренков Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 08.04.2009 18:17