![]() |
![]() ![]() |
![]() |
Михаил |
![]()
Сообщение
#1
|
Гость ![]() |
Пишу игру в граф. режиме. Нужно чтобы происходили определенные действия при нажатии на опред. кнопку, но чтобы не было этого ожидания. Комбинация
repeat {постоянно выполняемый код} untill (keypressed) and (readkey=#27) глючит. Походу идет переполнение буфера. Без keypressed он сначала ждет нажатия клавиши а потом делает действия. Вставки на ассемблере тоже не спосают P.S нужно чтобы программа была без О.О.П. Кто сталкивался помогите! |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Скэн-коды перехватывать не пробовал?
|
xds |
![]()
Сообщение
#3
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Попробуй обрабатывать буфер одним проходом:
Код program Code; uses Crt; var Done: Boolean; begin Done := False; repeat { сделать что-нибудь полезное... } while KeyPressed do case ReadKey of ' ': { обработать нажатие клавиши "пробел" }; #27: Done := True; #0: { обработка расширенных кодов BIOS } case ReadKey of #72: { обработать нажатие клавиши "вверх" }; #75: { обработать нажатие клавиши "влево" }; #77: { обработать нажатие клавиши "вправо" }; #80: { обработать нажатие клавиши "вниз" }; end; end until Done; end. P.S. Если необходимо отслеживать удержание нескольких клавиш одновременно (e. g., все время нажата "вверх" и эпизодически нажимается и отпускается "control"), то придется написать свой обработчик int 9. -------------------- The idiots are winning.
|
Altair |
![]()
Сообщение
#4
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Нет, здесь ИМХО надо как сказал volvo - скэн коды... толькобуферне забыть очищать после фиксациии клавиши ...
Поискать поиском, P@SH@ кажется где-то в теор. вопросах выкладывал очень быструю процедуру для этого... -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
P@sh@ |
![]()
Сообщение
#5
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: ![]() ![]() ![]() |
процедурка ReadKeyExt...
если скан-код равен 0, значит ничего не нажато работает через буфер, т.е. с автоповтором и задержкой, но для большинства задач хватает... если надо что-то посерьезнее (т.е. полный контроль над клавой, без участия биоса), смотрите мою игрушку Tanks... |
GoodWind |
![]()
Сообщение
#6
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Код {From: Valery Votintsev 2:5021/22} {Alt, Shift, Ctrl test for 0040:0017 keyboard status} Uses CRT; Const RightShift = $0001; LeftShift = $0002; AnyCtrl = $0004; AnyAlt = $0008; ScrollActive = $0010; NumLockActive = $0020; CapsLockActive= $0040; InsActive = $0080; LeftCtrl = $0100; LeftAlt = $0200; SysReq = $0400; PauseKey = $0800; ScrollLock = $1000; NumLock = $2000; CapsLock = $4000; Insert = $8000; const hex_num:array [0..15] of char='0123456789ABCDEF'; var key:char; {код нажатой клавиши} flags:word; {флаги состояния клавиатуры} newflags:word; function word2hex(w:word):string; {перевод в 16-ричное число} var b:array[1..2] of byte absolute w; begin word2hex:=hex_num[b[2] shr 4]+hex_num[b[2] and $0F] + hex_num[b[1] shr 4]+hex_num[b[1] and $0F] end; function GetFlags:Word; {Считывает состояние флагов спец.клавиш} begin GetFlags:=memW[0:$417]; end; function AnyKeyEvent:boolean; begin AnyKeyEvent:= (KeyPressed or (newflags<>flags)); end; function Pressed(lock:word):Boolean; {Проверяет, нажата ли спец.клавиша с кодом LOCK} begin if (flags and word(lock))<>0 then Pressed:=true else Pressed:=false; end; Procedure WriteKeyCode; begin TextAttr:=White; If KeyPressed then begin key:= ReadKey; {читаем код } if Key = #0 then begin {код оказался расширенным} Write(Ord(Key):3,','); {печатаем нулевой код } key:= ReadKey; {читаем расширенный код } end; Write(Ord(Key):3); {печатаем основной код } end else write(' '); end; Procedure WriteFlags; begin TextAttr:=LightGray; Write(' Flags:',word2hex(memW[Seg0040:$17])); {Теперь печатаем флаги спец.клавиш} TextAttr:=Cyan; If Pressed(RightShift) then Write(' RightShift'); If Pressed(LeftShift ) then Write(' LeftShift'); If Pressed(AnyAlt ) then Write(' AnyAlt'); If Pressed(AnyCtrl ) then Write(' AnyCtrl'); If Pressed(LeftCtrl ) then Write(' LeftCtrl'); If Pressed(LeftAlt ) then Write(' LeftAlt'); If Pressed(SysReq ) then Write(' SysReq'); If Pressed(PauseKey ) then Write(' Pause'); If Pressed(ScrollLock) then Write(' ScrollLock'); If Pressed(NumLock ) then Write(' NumLock'); If Pressed(CapsLock ) then Write(' CapsLock'); If Pressed(Insert ) then Write(' Insert'); {Теперь печатаем состояние переключателей} TextAttr:=Yellow; If Pressed(ScrollActive ) then Write(' ScrollLockActive'); If Pressed(NumLockActive ) then Write(' NumLockActive'); If Pressed(CapsLockActive) then Write(' CapsLockActive'); If Pressed(InsActive ) then Write(' InsActive'); Writeln; TextAttr:=LightGray; end; begin while keypressed do readkey; {Очистить буфер клавиатуры} flags:=GetFlags; {начальное состояние флагов} repeat newflags:=GetFlags; {новое состояние флагов} If AnyKeyEvent then begin {если чего-нибудь нажато} WriteKeyCode; flags:=newflags; {запомнить состояние флагов} WriteFlags; end; until Key = #27; {Цикл, пока не нажмем Esc} while keypressed do readkey; {Очистить буфер клавиатуры} end. в SWAG`е нашел... ----- позже: извиняюсь, ступил.... не в ту тему постанул :p2: ну мож кому антиресно будет, так что не удаляю... Сообщение отредактировано: GoodWind - 15.11.2004 20:15 -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
![]() ![]() |
![]() |
Текстовая версия | 14.07.2025 21:22 |