Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

[DelphiX] Как узнать что кнопка отпущена   Найти похожие ветки 

 
mozg   (2003-09-25 14:05) [0]

Вот вообщем-то и вопрос: как определить, что отпущена кнопка и обработать это событие (наподобие OnKeyUp в Delphi)?


 
cyborg ©   (2003-09-25 14:37) [1]

Какая кнопка?


 
pasha_676 ©   (2003-09-25 15:34) [2]

Может мыши? Или на клаве? А может на джойстике? В любом случае придешь к DXInput. Забыл как компонент в DelphiX Называется но он есть...


 
mozg   (2003-09-25 15:48) [3]

Кнопка на клаве...
Да в делфиX есть компонент DXInput.И с помощью него можно определить что кнопка нажата (if isLeft in Form1.DXInput1.States then...) а каким путем(может функция какая-нить) определить что кнопка отпускается...Без этого никак :(((


 
cyborg ©   (2003-09-25 15:54) [4]

if (Key and $80) then нажата else отжата.


 
pasha_676 ©   (2003-09-25 16:14) [5]


> if isLeft in Form1.DXInput1.States then..

Хм... Разобрался бы ты что ли... Это к мыше код вроде


 
mozg   (2003-09-25 16:46) [6]

to Cyborg: спасибо, буду пробывать (останется только это понять :)))

to pasha_676: Совет отличный! Очень хочу разобраться..да блин даже хелпа нету, а все что я нашел в статьях это именно этот код...Кстати этот код для клавы работает :)))

Короче спасибо, народ, за то что есть куда обратиться...без Вас ваще труба....


 
mozg   (2003-09-25 17:11) [7]

>>>if (Key and $80) then нажата else отжата.
2 CYBORG: Это будет обработка через DXinput или это сам Дельфи определит? Просто говорили, что через DXinput быстрее...


 
cyborg ©   (2003-09-25 17:16) [8]

DXInput, при приходе сигналов от клавиатуры они идут к тебе, а что за сигнал пришёл, ты так разбираешься, если восьмой бит "включён", то значит была клавиша нажата, если его нет, то была отжата.


 
mozg   (2003-09-25 17:26) [9]

Я так понимаю, вместо "key" надо вставить код клавиши или что-то еще???

ЗЫ:задолбал я наверное вопросами...но, блин, ХОЧЕТСЯ НАУЧИТЬСЯ!!!


 
Илья   (2003-09-25 17:42) [10]

if key=#80 then


 
mozg   (2003-09-25 18:52) [11]

2 Илья: и так попробую...завтра время появится...попробую...
Но все-таки, мне надо знать что именно !данная! клавиша отпущена...значит вместо "key" нужно вставить код клавиши? Какие это коды (хотя бы для стрелок влево-вправо).


 
cyborg ©   (2003-09-25 20:22) [12]

Данные тебе приходят в буффер состоящий из TDIDEVICEOBJECTDATA.
TDIDEVICEOBJECTDATA.dwOfs - код клавиши
TDIDEVICEOBJECTDATA.dwData - что с ней произошло.

Case TDIDEVICEOBJECTDATA.dwOfs of
DIK_ESCAPE : if TDIDEVICEOBJECTDATA.dwData and $80<>0 then нажата else отжата;
...


 
mozg   (2003-09-26 07:22) [13]

2 cyborg: Спасибо...попробую...
Только кажется мне что это решение через DirectX (а я в него ВООБЩЕ не совался, даже не знаю как его в Дельфи использовать).
Для простоты я использую библиотеку DelphiX, в частности ее компонент DXinput. Если там решение моей проблемы?


 
Sapersky ©   (2003-09-26 11:39) [14]

Если уж такие проблемы с DX, лучше использовать что-нибудь вроде:

Var KbdBuf, OldBuf : TKeyboardState;

procedure CheckKeys;

 function KeyUp(Code : Byte) : Boolean;
 begin
 Result:=(OldBuf[Code]>=128) and (KbdBuf[Code]<128);
 end;

 function KeyDown(Code : Byte) : Boolean;
 begin
 Result:=(OldBuf[Code]<128) and (KbdBuf[Code]>=128);
 end;

begin
GetKeyboardState(KbdBuf);

If KeyUp(VK_LEFT) then Label1.Caption:="Left arrow is up";
If KeyDown(VK_RIGHT) then Label1.Caption:="Right arrow is down";
// для примера проверим правую и левую стрелки...
// константы VK_xxx - те же самые, что и в стандартном OnKeyDown

OldBuf:=KbdBuf;
end;

Это WinAPI, безо всякого DirectX. Но работает достаточно быстро.
А сакральный смысл выражения (Key and $80)=$80 (или, если условие тут же, (Key and $80)) состоит в проверке состояния старшего бита числа. Т.е. при нажатии значение возвращаемого значения будет (в двоичной форме) 10000000 (= $80 = 128). Просто сравнить (Key=128) можно, но лучше не, т.к. у некоторых кнопок есть ещё состояние "включена /выключена" (00000001/00000000 соответственно). Поэтому выполняем операцию AND : Key and 10000000 = 10000000 (или <>0 = True) только в том случае, если Key=1xxxxxxx, где x - любое (ага, большой выбор - 0 или 1 :)). Аналогичного эффекта можно добиться условием Key>=128 (т.к. 1xxxxxxx>=10000000), но почему-то все пишут AND - чтобы выглядело круче, наверное :)


 
cyborg ©   (2003-09-26 12:18) [15]

[14] Sapersky ©   (26.09.03 11:39)
AND не чтобы круче было, а не мешало бы почитать о битовых операциях

AND - если оба бита взведены, то исход будет еденица, в противном случае ноль.

Операцией Key and $80 узнаётся взведён ли 8 бит, если нет, то на выходе получится 0, в противном случае получится $80.


 
Sapersky ©   (2003-09-26 13:48) [16]

AND не чтобы круче было

Я просто хотел сказать, что Key>=128 выглядит гораздо проще и понятнее, особенно для новичка, которого пугают доллары и and"ы с числами. И, кстати, работает процентов на 10 быстрее :) (хотя, возможно, это погрешность измерения).


 
pasha_676 ©   (2003-09-26 15:23) [17]


> AND не чтобы круче было, а не мешало бы почитать о битовых
> операциях

Ну не придирайся :) Сам то пишешь далеко не по научному -
> AND - если оба бита взведены, то исход будет еденица, в
> противном случае ноль.

Т.е. бит бывает взведеный, единицей и нулем. Это интересно.


> . И, кстати, работает процентов на 10 быстрее :) (хотя,
> возможно, это погрешность измерения).

Ох. Давно я подзабыл асм... Но в принцыпе
RgA>=const - одна операция

RgA and RgB=0 две операции....

При частом использовании одной и тойже константы (условно говоря не требуется время на занрузку ее, или она прописана прям в коде) - может быть действительно меньше....


 
mozg   (2003-09-26 18:40) [18]

2 Sapersky:спасибо огромное...но тут опять непонятно: вставляю эти функции и процедуру в код а компилятор выдает ошибки:
[Error] Unit1.pas(25): Illegal character in input file: " " ($A0)
И таких ошибок несколько...
Не знаю в чем проблема :(((
Может для испольщования WinApi надо что-то еще сделать?

Не мог бы ты сколотить готовый работающий пример и выслать на мыло...Был бы очень благодарен, т.к. на готовом примере куда легче разобраться...И, если можно, пример реализации этого через DelphiX...


 
cyborg ©   (2003-09-26 19:41) [19]

Если не ошибаюсь, то в дельфиксе есть примеры, которые и следует посмотреть.


 
mozg   (2003-09-28 12:13) [20]

2 cyborg: Весь яндекс перерыл...и ни одной живой ссылки на эти Sampless и Help нету :(((

2 Sapersky: Спасибо огромное...все заработало! Наконец-то!
Еще раз благодарю!


 
cyborg ©   (2003-09-28 15:35) [21]

Какой-то кастрированный дельфикс наверное у тебя.


 
Карлсон ©   (2003-09-28 21:03) [22]


> Какой-то кастрированный дельфикс наверное у тебя.

а небось для 6 дельфи, а те пакеты, что обычно лежат на сайтах - без примеров.


 
cyborg ©   (2003-09-28 22:18) [23]

На качай примеры к дельфиксу 310 кило

http://cyborg1979.newmail.ru/programs/DelphiXSamples.zip

пока не удалил.


 
cyborg ©   (2003-09-28 22:32) [24]

Как-то плохо ты инет рыл, вот чего-то нашёл:
http://rglider.newmail.ru/downloads/misc.html


 
mozg   (2003-09-29 07:12) [25]

2 Cyborg: Огромное спасибо! Уже качаю.
А инет мож и плохо рыл....новичок я здесь :)))



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.049 c
7-1080470187
VitGun
2004-03-28 14:36
2004.04.11
Перехват обращения к FDD, LPT,USB


9-1064820322
MYSTERYO
2003-09-29 11:25
2004.04.11
Где б достать персонажей для квеста?


6-1079600219
Ozone
2004-03-18 11:56
2004.04.11
CreateIpForwardEntry


6-1076064199
dr Tr0jan
2004-02-06 13:43
2004.04.11
Сервер на Winsock


8-1071061474
Yrtimd
2003-12-10 16:04
2004.04.11
Получение звука с микрофона





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский