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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2013, 13:45   #1
Serg-Grin
Дивиджей
Пользователь
 
Аватар для Serg-Grin
 
Регистрация: 05.01.2009
Сообщений: 84
По умолчанию Запрет нажатия двух клавиш движения

Здравствуйте, у меня есть такой вопрос:
Есть на форме игрок, он движется с помощью стрелок.
И есть анимация.
Но есть проблема, когда нажимаю обе кнопки вместе, вверх + влево или вверх + право, анимация начинает смешиваться ... как мне запретить нажимания двух клавиш одновременно?!
Впишите в google:
DVJ Serg-Grin
И вы услышите мои песни
Serg-Grin вне форума Ответить с цитированием
Старый 20.08.2013, 14:30   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По-моему их никак не запретить... Нажатия этих клавиш все равно идут последовательно.
Я бы пересмотрел механизм анимации. Возможно сделал бы двойную буфферизацию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2013, 14:42   #3
Serg-Grin
Дивиджей
Пользователь
 
Аватар для Serg-Grin
 
Регистрация: 05.01.2009
Сообщений: 84
По умолчанию

Ясно. А если использовать W-S-A-D как управление, то их одновременное нажатие можно будет запретить?
Впишите в google:
DVJ Serg-Grin
И вы услышите мои песни
Serg-Grin вне форума Ответить с цитированием
Старый 20.08.2013, 14:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если не ошибаюсь винда (думаю о ней идет речь) может одновременно какбы слить в одно нажатие только CTRL ALT SHIFT с другой любой клавишей. Остальные обрабатываться последовательно должны. Врядли удастся их запретить.
Впрочем попробуй так: в OnKeyDown запоминай в некую скажем глобальную переменку код нажатой клавиши. В OnKeyUp эту переменку сбрасывай в ноль.
Если в OnKeyDown при нажатии другой клавиши эта переменка чему-то равна то не обрабатывать.
Т.е. запоминать первую нажатую, и пока она не отпущена другие не обрабатывать.
Это предположение с потолка, но думаю поможет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2013, 15:02   #5
Serg-Grin
Дивиджей
Пользователь
 
Аватар для Serg-Grin
 
Регистрация: 05.01.2009
Сообщений: 84
По умолчанию

Спасибо Stilet, буду разбираться)
Впишите в google:
DVJ Serg-Grin
И вы услышите мои песни
Serg-Grin вне форума Ответить с цитированием
Старый 20.08.2013, 15:18   #6
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

можно попробовать во время нажатия клавиши проверить состояние всех остальных (например что-то типа PRESSED) ... и если результат отрицательный - выполнять нужное
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 22.08.2013, 02:43   #7
Don_Capone
Новичок
Джуниор
 
Регистрация: 22.08.2013
Сообщений: 12
По умолчанию А так будет проще

if ((GetAsyncKeyState(VK_left)<>0) and (GetAsyncKeyState(VK_right)<>0)) then
GetAsyncKeyState(VK_left);

вот если кто то жмет 2 сразу кнопки то человек идет в лево :D
Don_Capone вне форума Ответить с цитированием
Старый 22.08.2013, 07:32   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Либо сделать дополнительную анимацию для ходьбы про диагоналям и работать с ней.
Либо выставить приоритет для анимации "горизонтальной" ходьбы, и при движении по диагонали показывать только её (т.е. если нажата кнопка влево - безусловно показывать анимацию влево, независимо от нажатия кнопок вверх или вниз).
Сделать второе можно через опрос клавиатуры и установкой некоего состояния у объекта спрайта или объекта-игрока, примерно так:
Код:
type TMoveState = (msUp, msDown, msLeft, msRight);
...
if (проверка кнопки Up) then
  Player.MoveState := msUp; // для down аналогично
if (проверка кнопки Left) then
  Player.MoveState := msLeft; // эта строка идёт после проверки на up down и по сути переставит состояние на себя
При отрисовке проверять стейт и анимацию рисовать соотв ему.
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрет движения курсора Ko$ Общие вопросы Delphi 0 22.05.2013 17:28
Запрет нажатия кнопки и запрет неправильного ввода данных De_Kurlzz Помощь студентам 1 15.06.2011 15:14
имитация нажатия клавиш RAVAL(c) HTML и CSS 10 07.02.2011 12:29
перехват нажатия клавиш skalt12 Общие вопросы Delphi 4 17.08.2009 13:06