IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Помогите советом, реагирование в ире на клаву
сообщение
Сообщение #1


Гость






Пишу игру в граф. режиме. Нужно чтобы происходили определенные действия при нажатии на опред. кнопку, но чтобы не было этого ожидания. Комбинация
repeat
{постоянно выполняемый код}
untill (keypressed) and (readkey=#27)
глючит. Походу идет переполнение буфера.
Без keypressed он сначала ждет нажатия клавиши а потом делает действия.
Вставки на ассемблере тоже не спосают

P.S нужно чтобы программа была без О.О.П.


Кто сталкивался помогите!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Скэн-коды перехватывать не пробовал?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Попробуй обрабатывать буфер одним проходом:
Код
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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Нет, здесь ИМХО надо как сказал volvo - скэн коды... толькобуферне забыть очищать после фиксациии клавиши ...
Поискать поиском, P@SH@ кажется где-то в теор. вопросах выкладывал очень быструю процедуру для этого...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


процедурка ReadKeyExt...
если скан-код равен 0, значит ничего не нажато
работает через буфер, т.е. с автоповтором и задержкой, но для большинства задач хватает... если надо что-то посерьезнее (т.е. полный контроль над клавой, без участия биоса), смотрите мою игрушку Tanks...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Автооответчик
*****

Группа: Пользователи
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

Репутация: -  16  +


Код
{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 -


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 8:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name