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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2009, 17:51   #1
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
Вопрос Одновременное нажатие клавиш.

Я начал делать игру на Delphi 7 и столкнулся с проблемой. Мне нужно организовать движение предмета с координатами X и Y по экрану.
Я назначил на событие OnKeyPress следующее:
Код:
procedure TForm1.Control(Sender: TObject; var Key: Char);
begin
if Key = 'a' then X:=X-2;
if Key = 'd' then X:=X+2;

if Key = 'w' then Y:=Y-2;
if Key = 's' then Y:=Y+2;
end;
Обьект движется по экрану, но процедура работает только если одновременно нажата только одна клавиша. Как можно этот устранить, ведь помимо кнопок движения будут еще например кнопка выстрела, которая может быть нажата одновременно с кнопками движения?
Вадим Буренков вне форума Ответить с цитированием
Старый 20.03.2009, 17:59   #2
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Профессионалы на этом форуме советуют делать так:
создаешь функцию
Код:
function keypressed(key: byte): boolean;
var
  keys: TKeyboardState;
begin
  result:=false;
  GetKeyboardState(keys);
  if(keys[key]=128)or(keys[key]=129)then result:=true;
end;
потом в основном таймере программы такой код:

Код:
  if keypressed(39) then  // стрелка вправо
    sx:=1;
  if keypressed(37) then // стрелка влево
    sx:=-1;

  px:=px+sx;
  sx:=0;
px - это координаты объекта, которым управляешь.
sx - это его скорость. Т.е., если скорость со знаком "-", то обьект движется в противоположную сторону
Алекс Ялта вне форума Ответить с цитированием
Старый 20.03.2009, 18:04   #3
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Естественно, нужно в глобальных переменных добавить px,sx - если движение только по горизонтали. В архиве пример простой программы с коментами, составленной на основе примеров, которые изложены умными людьми этого форума. Там также пример создания уровня с проходимостью и коллизией
Вложения
Тип файла: zip плавное движение.zip (207.5 Кб, 52 просмотров)
Алекс Ялта вне форума Ответить с цитированием
Старый 20.03.2009, 18:11   #4
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Работает! А как узнать коды всех клавиш клавиатуры для этой функции?
Вадим Буренков вне форума Ответить с цитированием
Старый 20.03.2009, 18:30   #5
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

38 - вверх, 40 - вниз, 27 - Esc, 13 - Enter
Остальные пока сам не знаю, не интересовался
Алекс Ялта вне форума Ответить с цитированием
Старый 20.03.2009, 18:35   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
А как узнать коды всех клавиш клавиатуры для этой функции?
Например вот так - код нажатой клавиши появится в заголовке формы

Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Form1.Caption:=IntToStr(Key);
end;
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 20.03.2009, 18:44   #7
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Существует еще куча способов, например:
Код:
if GetKeyState(27) shr 31=1 then exit;
или завести массив и туда писать нажатые и удалять отпущеные клавиши:
Код:
var
  keys: array[0..255]of boolean;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  keys[key]:=true;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  keys[key]:=false;
end;
или тот же способ под WinAPI, обрабатываем сообщения:
Код:
var
  keys: array[0..255]of boolean;
...
case msg of
WM_KEYDOWN: keys[wParam]:=true;
WM_KEYUP: keys[wParam]:=false;
end;

Последний раз редактировалось Kostia; 20.03.2009 в 18:47.
Kostia вне форума Ответить с цитированием
Старый 20.03.2009, 18:50   #8
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Я правильно понял, что в примере таймер нужен для постоянного выполнения кода (с интервалом в 1 мс), а в паскале для этого можно было использовать Repeat - until?
Вадим Буренков вне форума Ответить с цитированием
Старый 20.03.2009, 19:21   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

да, но в паскале для того чтобы определить одновременно нажатые клавиши нужно воспользоваться сторонней библиотекой или самому на asm.
Я использовал библиотеку UKEYB. Она является альтернативой CRT для управления клавиатурой в программах, требующих более плавного управления клавишами, в первую очередь - играх.
Kostia вне форума Ответить с цитированием
Старый 21.03.2009, 23:21   #10
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
А как узнать коды всех клавиш клавиатуры для этой функции?
Сделал для себя простенькую прогу - держи как калькулятор на столе.
Вложения
Тип файла: rar Project1.rar (165.9 Кб, 57 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
одновременное нажатие нескольких кнопок DANIЯR Общие вопросы Delphi 8 27.11.2008 21:47
Нажатие клавиш bashkos JavaScript, Ajax 6 23.09.2008 19:01
Операторы ветвлений (нажатие клавиш) barahlysh Общие вопросы C/C++ 6 12.12.2007 12:19
Нажатие клавиш VanDerKeen Win Api 1 03.06.2007 21:13