forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=48)
-   -   нажатие кнопок подряд (http://forum.boolean.name/showthread.php?t=7870)

temned 20.02.2009 13:45

нажатие кнопок подряд
 
Как проверить нажатие несколько кнопок подряд напримеР?
К примеру у меня есть определенная последовательнос ть -987, как сделать так, чтобы если вводишь ее - то происходило действие.
Пытался что-то типа ифов:
if key = KE_KEY8 then
PHP код:

begin
**задержка
 
if key KE_KEY7 then
**задержка
begin 


Phantom 20.02.2009 13:58

Ответ: нажатие кнопок подряд
 
Гы. Делал такое. Выглядело как аццкий быдлокод :-D До сих пор чувствую, что можно проще как-то. Я только в java делал и использовал switch, в паскале его нет, придётся делать при помощи "else if".

temned 20.02.2009 19:12

Ответ: нажатие кнопок подряд
 
Если не трудно дай код операции, просто у меня што-то не полушается

Phantom 21.02.2009 03:40

Ответ: нажатие кнопок подряд
 
Блин. Кода не осталось. Делай так. Создавай числовую переменную, например, i:=1; Открывай цикл while 1==1 , в конце которого Delay(50); Внутри цикла куча if i==1 ... else if i==2 ... else if i==3 ... И так столько раз, сколько цифр в проверяемом коде, каждый раз пиши i на один больше, чем раньше. Потом в первом условии проверяй нажата ли первая клавиша кода, если нажата, то i:=i+1; , если не нажата, то i:=1; , во втором условии проверяй нажата ли вторая клавиша кода, если нажата, то снова i:=i+1; , если не нажата, то i:=1; . Потом после последнего if пишешь ещё один и там уже код, который нужно выполнить, например, просто break; (или как там в паскале?). В итоге у тебя при запуске программы будет выполняться цикл и ждать, когда ты введёшь код, как только ты его введёшь, из цикла выкинет и будет выполняться любой код, который находится за циклом. Вроде правильно всё написал.

Piligrim 21.02.2009 11:52

Ответ: нажатие кнопок подряд
 
Если нажатия должны произойти в основном цикле, как секретный код, то можно просто писать нажатые клавиши в строку и сравнивать с нужной последовательностью. Например так
PHP код:

:= IntegerToString(key);
:= Length(s);
:= Copy(sl-3l); //отрезаем последние три клавиши.
if s='987' then //нажимали, то что нужно 


Phantom 21.02.2009 12:19

Ответ: нажатие кнопок подряд
 
Во я дурак :-D

impersonalis 21.02.2009 21:49

Ответ: нажатие кнопок подряд
 
Ну вы блин даёте

Phantom 21.02.2009 22:30

Ответ: нажатие кнопок подряд
 
impersonalis, ты знаешь ещё более короткий и рациональный способ? О_о Поделись =)

impersonalis 22.02.2009 00:22

Ответ: нажатие кнопок подряд
 
Нет, я делаю буфер длиной в кодовое слово.
Перед заполнении очредного байта содержимое буфера претрепевате сдвиг в сторну уменьшения индекса:
например, кодое слово WOW
создаём буфер на 3 элемента,
доупстим поток сообщений от ус-ва ввода такой: WO1GHWOWW
буфер будет выглядеть так (изначально буфер забит нулями или иными неанализируемымыи байтами-маркёрами, доупстим "*"):
***
**W
*WO
WO1
O1G
1GH
GHW
HWO
WOW тут произойдёт срабатывание
OWW

Phantom 22.02.2009 00:50

Ответ: нажатие кнопок подряд
 
Хм... Очень интересно... А что это за буфер такой? В принципе можно это и со строкой сделать.

impersonalis 22.02.2009 01:29

Ответ: нажатие кнопок подряд
 
буфер это алгоритмическая абстракция, харакетризующая лишь функциональность объекта, а не его реализацию. В принципе я описал алгоритм pilgrim-а, но для случая непрерывного потока с минимальным расходом памяти.

Piligrim 22.02.2009 12:29

Ответ: нажатие кнопок подряд
 
Цитата:

В принципе я описал алгоритм pilgrim-а, но для случая непрерывного потока с минимальным расходом памяти.
Спорный вопрос, если иметь в виду МР. Он не поддерживает байтовые переменные. Значит элемент массива будет integer = 4 байта. А по другому буфер реализовать сложно.

impersonalis 22.02.2009 16:38

Ответ: нажатие кнопок подряд
 
у тебя строка - контейнер байтов. С методами добавления элементов - перевыделния памяти (сложно, долго, нерационально). В то время как размер её не может превышать кодовго слова.
Поправь, если ошибаюсь.

HolyDel 22.02.2009 17:07

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

impersonalis 22.02.2009 19:59

Ответ: нажатие кнопок подряд
 
Хорошо, а как применять этот алгоритм для обработки потока?
В данном услучае алгоритм со строкой заточен на введние 3х символов, после которых цикл ввода завершён с одним из условий.
А что если ввод осуществляется постоянно? например как читы в ГТА3

Piligrim 22.02.2009 20:37

Ответ: нажатие кнопок подряд
 
Стоп! Кто где завершен? Просто вставляем код в основной цикл обработки нажатий клавиш.
Если прошло условие, то делаем что надо, а иначе просто обрабатывает очередную нажатую клавишу.
Под три символа заточен из условия автора темы, никто не мешает проверить и два с помощью
if(s.endsWith("98"){
просто этой функции нет в МР, но ее можно легко написать

impersonalis 22.02.2009 20:48

Ответ: нажатие кнопок подряд
 
просто память хаваетцо и хаваетцо =\
а если пользователь килобайт текста натарабанит до контрольного слова?
В остальном алгоритмы не отлчиаютцо.

Piligrim 23.02.2009 10:31

Ответ: нажатие кнопок подряд
 
На каждом цикле
Цитата:

l := Length(s);
s := Copy(s, l-3, l); //отрезаем последние три клавиши.

Phantom 23.02.2009 10:45

Ответ: нажатие кнопок подряд
 
Такая мелкая тема заинтересовала местных гигантов программирования =) Круть =)

jimon 23.02.2009 11:01

Ответ: нажатие кнопок подряд
 
можно по-извращатся и оптимизировать до максимума
расмотрим integer : abcd, то-есть в нём 4 байта
клавишу телефона можно кодировать 1 байтом
младший байт d не будем использовать (нужна комбинация из 3)
потому d всегда равен 0

после нажатия клавиши мы смещяем этот integer в лево на байт
пишем в c нашу текущую клавишу
и потом проверяем весь integer с заранее подготовленым числом которое означает комбинацию
после прохождения какого нибудь времени (300 мс) после последнего нажатия - можно обнулить наш integer чтобы комбинация не сработала без учёта времени между клавишами

для комбинаций больше чем 4 клавиши надо что-то другое использовать

Phantom 23.02.2009 11:30

Ответ: нажатие кнопок подряд
 
Если использовать только числовые клавиши 0-9, то хватит 4 байт на клавишу =) Значит в int можно впихнуть уже 8 символов =) А если больше, можно несколько переменных заюзать. Может либу написать? Lib_cheats =)

impersonalis 23.02.2009 14:51

Ответ: нажатие кнопок подряд
 
протупил =(
тогда алгоритмы одинаковы

Dj_Alex 10.03.2009 22:50

Ответ: нажатие кнопок подряд
 
да просто можно сделать

s=0;
repeat
key:=getKeyPressed;
if (s=0) and (key=KE_KEY1) then s:=1;
if (s=1) and (key=KE_KEY2) then s:=2;
if (s=2) and (key=KE_KEY3) then s:=3;
until s=3;
......
Еще нада б добавить условие, что при нажатии др. кнопки s=0

odd 11.03.2009 01:50

Ответ: нажатие кнопок подряд
 
Я раньше тоже так делал, но потом тоже догадался всё в одну строку склеивать и потом уже сравнивать строки. Это более оптимальный вариант. Так что можно теперь смело вставлять в свои мидлеты т.н. "пасхальные яйца".

im_zorg 06.02.2010 11:33

Ответ: нажатие кнопок подряд
 
Цитата:

Сообщение от odd (Сообщение 100238)
Я раньше тоже так делал, но потом тоже догадался всё в одну строку склеивать и потом уже сравнивать строки. Это более оптимальный вариант. Так что можно теперь смело вставлять в свои мидлеты т.н. "пасхальные яйца".

Напиши плиз либу! А то у меня не получается(((


Часовой пояс GMT +4, время: 17:49.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot