Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Процедура обработки двух клавиш


snake-as ©   (10.01.08 17:26

Здравствуйте, эксперты.. Помогите мне, пожалуйста, с таким вопросом. Вот сейчас пишу игру и столкнулся с проблемой, что не могу обработать нажатие двух клавиш. Скажите, пожалуйста, что можно сделать..


@!!ex ©   (10.01.08 17:39[1]

GetAsyncKeyState


@!!ex ©   (10.01.08 17:42[2]

OldKeys:array[0..255] of Smallint;
keys : array[-1..255] of boolean;

procedure TKeys.Update;
var
 Index:integer;
 Key:Smallint;
begin
 for Index:=0 to 255 do begin
   Key:=GetAsyncKeyState(Index);
   if Key And $8000<> OldKeys[Index] And $8000 then  begin
     Keys[Index]:=(Key And $8000)<>0;
     OldKeys[Index]:=Key;
   end;
 end;
end;
end;


Код успешно применяется в нескольких реальных проектах.


snake-as ©   (11.01.08 13:42[3]

Я не понял немного.. Может я ламер последний.. Не могли бы вы с комментариями этот код написать? Буду очень признателен..


@!!ex ©   (11.01.08 14:16[4]

> [3] snake-as ©   (11.01.08 13:42)

Че не понятно? Спрашивай. Комментариев просто так писать не буду. Код попадает под документацию.


snake-as ©   (11.01.08 16:57[5]

Что значит $8000, точнее логическое умножение с ним?


Dib@zol ©   (11.01.08 17:35[6]

> Что значит $8000, точнее логическое умножение с ним?

Получение состояния шестнадцатого, сиречь старшего, бита в двухбайтной переменной. Он, как можно понять из справки по GetAsyncKeyState, определяет состояние нажатия клавиши: 0=отпущена, 1=нажата. Кстати, вместо катавасии с битами, для получения состояния можно использовать тот факт, что этот старший разряд определяет знак числа, а тип SmallInt - знаковый. => Если клавиша нажата, переменная Key принимает отрицательное значение.


@!!ex ©   (11.01.08 17:37[7]

> [6] Dib@zol ©   (11.01.08 17:35)

-0? :)


Dib@zol ©   (11.01.08 17:51[8]

> -0? :)

если ты про число 1000000000000000b, то отвечаю, что отрицательные числа в знаковых переменных интерпретируются компом в так называемых обратных дополнительных кодах. То есть, 0FFFFh = 1111111111111111b означает минус один, 0FFFЕh - минус два, итд. Отсюда, числу 8000h = 1000000000000000b будет соответствовать не "минус ноль", а минимально возможное для данного типа число: -32768.


@!!ex ©   (11.01.08 18:01[9]

> [8] Dib@zol ©   (11.01.08 17:51)

Да шучу я. Расслабься.


snake-as ©   (13.01.08 06:00[10]

Да, теперь все понятно:)


имя   (20.10.15 19:58[11]

Удалено модератором


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо