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

> Помогите советом, реагирование в ире на клаву
Михаил
сообщение 9.11.2004 22:10
Сообщение #1


Гость






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

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


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


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

Группа: Модераторы
Сообщений: 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 - 15.11.2004 20:15


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

Сообщений в этой теме


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

 



- Текстовая версия 17.07.2025 14:00
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"