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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2012, 10:08   #11
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Обычно в этом случае принято завести массив, описывающий состояние всех интересующих клавиш клавиатуры, и заполнять его, отслеживая как нажатия, так и отпускания клавиш.
И именно по состоянию этого массива принимать решение на перемещение.
Можно либо осуществить такую обработку в своей программе, либо воспользоваться DirectX, где такой алгоритм уже реализован.
s-andriano вне форума Ответить с цитированием
Старый 08.05.2012, 12:11   #12
Андрей19930323
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
Так всё осинило!
Shift хранит состояние хлавишь Ctrl Shift Alt
Что вам делать
Либо через GetAsyncKeyState/GetKeyState либо делать вот так
мне бы попроще) всё равно большое спасибо).

Цитата:
ток соответствеено проверяйте все сочитания клавиш
Ток сработает ли это я не знаю!
судя по вашему коду надо метку создавать?

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
procedure tform1.Check;
begin
if Hi(GetKeyState(VK_LEFT) > 0 then
// äâèãàåì âëåâî
end;
Спасибо за помощь. можете мне объяснить, откуда взяли эту процедуру?

Цитата:
Сообщение от EUGY Посмотреть сообщение
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;
ваш способ почти работает. нажимаю комбинацию клавиш - всё прекрасно работает. если сразу нажимаю другую комбинацию - реагирует неправильно. исследовав природу это, я пришёл к выводу, что нажав нужную комбинацию клавиш, нужно ещё раз нажать ещё раз эту комбинацию для того, чтобы правильно работала другая комбинация. Очень неудобно. Можно как нибудь улучшить?
Андрей19930323 вне форума Ответить с цитированием
Старый 08.05.2012, 14:46   #13
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
судя по вашему коду надо метку создавать?
эм... всмысле?
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, 15:11   #14
Андрей19930323
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
эм... всмысле?
Label1.Caption := 'KEY_DOWn'; а что означает это действие?
Андрей19930323 вне форума Ответить с цитированием
Старый 08.05.2012, 15:12   #15
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

это я текст вывожу в лейбл
Вот вы координаты меняете если нажато вверх и влево
А я текст просто вывожу!
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, 16:50   #16
Андрей19930323
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
это я текст вывожу в лейбл
Вот вы координаты меняете если нажато вверх и влево
А я текст просто вывожу!
Понятно. Сделал как Вы посоветовали, но всё равно одновременное нажатие
не работает(. Внизу код, может что не так написал.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, 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;
   Old_key: word;
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);
   Old_Key := 0;
end;

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

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

   form:= TBitmap.Create;
   form.LoadFromFile('burd.bmp');
   form.Width:= 1280;
   form.Height:= 837;
   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 Old_Key = 0  then
     Old_Key:= Key;

   if key = VK_LEFT  then
     x:= x - n;

   if key = VK_UP  then
     y:= y - n;

   if key = VK_RIGHT  then
     x:= x + n;

   if key = VK_DOWN  then
     y:= y + n;

   if (key = VK_UP) and (Old_key = VK_LEFT) then begin
     y:= y - n;
     x:= x - n;
   end;
   
   if Key = ord(' ') then
     y:= y - 666;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
const
   n = 5;
begin
   Timer1.Enabled:= false;
   if Old_Key <> 0 then begin
     Old_KEy:= 0;
   end;
end;

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

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

не надо скидывать Old_Key в таймере!
А только 1 раз и в начале программы
как я написал в onCreate
и смысл таков, что по моему коду у вас не будет одновременного нажатия как такового
А работать будет примерно так
вы нажали на верх
В Old_Key сохраниться это значение после чего всё можно обработать
А когда вы не отпуская кнопки вверх нажмёте влево
То в Old_Key отсанется код клавиши на верх и + в key будет лежать код влево
и таким образом можно будет обработать зажатые как бе две клавиши!
А при отпускании одной из кнопок Old_Key сброситься в 0!
+ ко всему
Вам в onKeyDown вам надо сделать обработку по принципу
если Old_Key = 0 тогда обрабатываем вверх вниз влево вправо
иначе если там Уже есть код какойто стрелки
Тогда обрабатываем вверх и влево, вверх и вправо, ВНИЗ и влево, вниз и вправо
Взависимости от того чё мы там нажали
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 в 17:12.
Hacker19_90 вне форума Ответить с цитированием
Старый 08.05.2012, 17:56   #18
Андрей19930323
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
не надо скидывать Old_Key в таймере!
А только 1 раз и в начале программы
как я написал в onCreate
и смысл таков, что по моему коду у вас не будет одновременного нажатия как такового
А работать будет примерно так
вы нажали на верх
В Old_Key сохраниться это значение после чего всё можно обработать
А когда вы не отпуская кнопки вверх нажмёте влево
То в Old_Key отсанется код клавиши на верх и + в key будет лежать код влево
и таким образом можно будет обработать зажатые как бе две клавиши!
А при отпускании одной из кнопок Old_Key сброситься в 0!
+ ко всему
Вам в onKeyDown вам надо сделать обработку по принципу
если Old_Key = 0 тогда обрабатываем вверх вниз влево вправо
иначе если там Уже есть код какойто стрелки
Тогда обрабатываем вверх и влево, вверх и вправо, ВНИЗ и влево, вниз и вправо
Взависимости от того чё мы там нажали
Спасибо огромнейшее за помощь)) Я немного видоизменил Ваш вариант и всё работает идеально)). Ниже код проги.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, 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;
   Old_key: word;
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
   Old_Key:= 0;
   Form1.Width:= 1280;
   Form1.Height:= 837;

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

   form:= TBitmap.Create;
   form.LoadFromFile('burd.bmp');
   form.Width:= 1280;
   form.Height:= 837;
   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 Old_Key = 0  then
     Old_Key:= Key;

   if key = VK_LEFT  then
     x:= x - n;

   if key = VK_UP  then
     y:= y - n;

   if key = VK_RIGHT  then
     x:= x + n;

   if key = VK_DOWN  then
     y:= y + n;

   if ((key = VK_UP) and (Old_key = VK_LEFT)) or ((key = VK_LEFT) and (Old_key = VK_UP)) then begin
     y:= y - n;
     x:= x - n;
   end;

   if ((key = VK_UP) and (Old_key = VK_RIGHT)) or ((key = VK_RIGHT) and (Old_key = VK_UP)) then begin
     y:= y - n;
     x:= x + n;
   end;

   if ((key = VK_DOWN) and (Old_key = VK_LEFT)) or ((key = VK_LEFT) and (Old_key = VK_DOWN)) then begin
     y:= y + n;
     x:= x - n;
   end;

   if ((key = VK_DOWN) and (Old_key = VK_RIGHT)) or ((key = VK_RIGHT) and (Old_key = VK_DOWN)) then begin
     y:= y + n;
     x:= x + n;
   end;
   
   if Key = ord(' ') then
     y:= y - 666;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   Timer1.Enabled:= false;
   if Old_Key <> 0 then begin
     Old_KEy:= 0;
   end;
end;

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

end.
Андрей19930323 вне форума Ответить с цитированием
Старый 08.05.2012, 18:06   #19
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

вот за что я люблю программирование, так это за необьятные, прямо таки вселенского масштаба, просторы для самых диких и аморальных извращений! причём на вопрос "а зачем такое городить?" ответят "так приятно... тьфу, так работает же!" и попробуй тут переубеди человека =)
сорри за оффтоп
GreenWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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