Автор: Михаил 10.11.2004 2:10
Пишу игру в граф. режиме. Нужно чтобы происходили определенные действия при нажатии на опред. кнопку, но чтобы не было этого ожидания. Комбинация
repeat
{постоянно выполняемый код}
untill (keypressed) and (readkey=#27)
глючит. Походу идет переполнение буфера.
Без keypressed он сначала ждет нажатия клавиши а потом делает действия.
Вставки на ассемблере тоже не спосают
P.S нужно чтобы программа была без О.О.П.
Кто сталкивался помогите!
Автор: volvo 10.11.2004 2:20
Скэн-коды перехватывать не пробовал?
Автор: xds 10.11.2004 5:05
Попробуй обрабатывать буфер одним проходом:
Код
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.
Автор: Altair 10.11.2004 11:18
Нет, здесь ИМХО надо как сказал volvo - скэн коды... толькобуферне забыть очищать после фиксациии клавиши ...
Поискать поиском, P@SH@ кажется где-то в теор. вопросах выкладывал очень быструю процедуру для этого...
Автор: P@sh@ 15.11.2004 23:20
процедурка ReadKeyExt...
если скан-код равен 0, значит ничего не нажато
работает через буфер, т.е. с автоповтором и задержкой, но для большинства задач хватает... если надо что-то посерьезнее (т.е. полный контроль над клавой, без участия биоса), смотрите мою игрушку Tanks...
Автор: GoodWind 16.11.2004 0:12
Код
{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:
ну мож кому антиресно будет, так что не удаляю...