Форум: "Игры";
Текущий архив: 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