Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

нет.


Информационный Канал Subscribe.Ru


Познавательное программирование



Выпуск 7


Здравствуйте, Уважаемые подписчики!

До 1642 года, когда девятнадцатилетний французский ученый Блез Паскаль изобрел
механическое счетное устройство - суммирующую машину, в Азии уже почти 5000 лет пользовались счетами.
- Билл Гейтс.


Наши друзья:

rest.interesting.znakomstvonew - Рассылка "Как познакомиться?" - обсуждаются различные проблемы взаимоотношений, имеется клуб знакомств и дискуссии с психологом.



Всех, кто имеет отношение к 3D-графике поздравляю с прошедшим днём 3D (3Dекабря) и предлагаю принять участие в разработке моей игры! Особенно требуются люди, умеющие хорошо записывать звук, а также люди его программирующие.
Я наконец-то публекую некоторые детали продвижения моей игры OXOTA 3(D).
Также сегодня нас опять порадовал CJ своей статьёй.

Итак, в этом выпуске:
1. "Горячие клавиши".
2. Новости проекта OXOTA 3D.

Если вы хотите, чтобы о вас узнали остальные подписчики - напишите сюда статью по Delphi.



1.

"Горячие клавиши"

Привет всем!

На этот раз я расскажу о нескольких способах использования горячих клавиш, но далеко не всех. Это будут: GetAsyncKeyState, обработчик OnKeyDown и RegisterHotKey.

1) И так первый способ, первая процедура GetAsyncKeyState(vKey: integer);
Для корректной работы надо на форме разместить компонент Timer с интервалом 1 и написать следующий код:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if GetAsyncKeyState(65)<>0 then ShowMessage('Нажата A');
end;

Вместо 65 можно ставить любой код клавиши. Также эта процедура годится и для мыши.

2) Теперь о OnKeyDown. Использование такого метода очень простое.
Самым разумным использованием этого обработчика у главной формы. Вы спросите как в нажатия передавать непосредственно форме? Это очень легко:
В обработчик события FormCreate вставьте следующую строчку кода:

KeyPreview:=TRUE; {или просто установить параметр KeyPreview у формы в true - прим.ред.}

Это позволит всем событиям, связанным с нажатием клавиш, в первую очередь передаваться форме, чьи обработчики могут выполнить какое-то заранее заданное действие или "подавить" клавиши. Только после этого они передаются выбранному элементу управления. Чтобы полностью "подавить" клавишу, используйте событие OnKeyPress, где код нажатой клавиши имеет тип Char, и для того, чтобы "подавить" его, просто напишите key:=#0.


Теперь пример:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key=65 then ShowMessage('Нажата кнопка А');
end;

Опять напоминаю что вместо 65 можно использовать любой код кнопки. В конце статьи накатаю мой код для ДОС на Паскале, который исправно мне показывает коды кнопок. Его можно исправно переделать для Делфи.

3) Теперь о RegisterHotKey, хорошем способе но не всегда уместном.

Функция RegisterHotKey определяет комбинацию "горячая" клавиша для всего пространства системы.


RegisterHotKey( HWND hWnd, int id, UINT fsModifiers, UINT vk );

hWnd [in] Дескриптор окна, которое примет сообщения WM_HOTKEY, сгенерированные комбинацией "горячая" клавиша.
Если этот параметр - ПУСТО (NULL), сообщения WM_HOTKEY ставятся в очередь сообщений вызывающего потока и должны быть обработаны в цикле сообщений.
id [in] Определяет идентификатор комбинации "горячая" клавиша.
Никакая другая "горячая" клавиша в вызывающем потоке не может иметь тот же самый идентификатор.
Прикладная программа должна определить значение в диапазоне от 0x0000 до 0xBFFF.
Динамически подключаемая библиотека DLL совместного использования должна определить значение в диапазоне от 0xC000 до 0xFFFF (диапазон, возвращаемый функцией GlobalAddAtom).
Чтобы избежать конфликтов с идентификаторами "горячей" клавиши, определенными другими разделяемыми DLL, динамически подключаемая библиотека, чтобы получить идентификатор "горячей" клавиши, должна использовать функцию GlobalAddAtom.

fsModifiers [in] Определяет клавиши, которые должны быть нажаты в комбинации с клавишей, заданной параметром nVirtKey, чтобы генерировать сообщение WM_HOTKEY.
Параметр fsModifiers может быть комбинацией следующих значений:
MOD_ALT - Любая из двух клавиш ALT должна удерживаться нажатой.
MOD_CONTROL - Любая из двух клавиш CTRL должна удерживаться нажатой.
MOD_SHIFT - Любая из двух клавиш SHIFT должна удерживаться нажатой.
MOD_WIN - Любая из двух клавиш WINDOWS должна удерживаться нажатой. Эти клавиши помечены логотипом MicrosoftR WindowsR

vk [in] Определяет код виртуальной клавиши комбинации "горячая" клавиша.
Эта функция возращает два значения, 0 если все завершилось удачно, 1 если неудачно.
Чтобы получить дополнительные сведения об ошибке, вызовите функцию GetLastError.

Когда клавиша нажимается, система ищет соответствие во всех комбинациях "горячая" клавиша.
После обнаружения соответствия, система ставит сообщение WM_HOTKEY в очередь сообщений потока, который зарегистрировал комбинацию "горячая" клавиша. Это сообщение ставится в начало очереди, так что оно удаляется следующим повтором цикла сообщений.
Эта функция не может связывать комбинацию "горячая" клавиша с окном, созданным другим потоком.
Функция RegisterHotKey терпит неудачу, если нажатия клавиш, определенные для "горячей" клавиши были уже зарегистрированы другой "горячей" клавишей.
Если окно, идентифицированное параметром hWnd, уже зарегистрировало комбинацию "горячая" клавиша с тем же самым идентификатором, как и тот, что определен параметром id, новые значения для параметров fsModifiers и vk заменяют предварительно заданные величины для этих параметров.
Windows NT4 and Windows 2000/XP: Клавиша F12 зарезервирована для использования отладчиком всегда, так что она не должна регистрироваться как "горячая" клавиша. Даже если Вы не отлаживаете приложение, F12 резервируется на случай, если отладчик режима ядра или синхронно работающий отладчик - является резидентным.

Сейчас небольшой код программы корая отлавливает в системе F1, выдает пользователю мессагу.
Сначала надо добавить в код:

const
HOT_KEY_INDEX = 4000; // идентификатор клавиши
WM_HOTKEY = $0312; // событие WM_HOTKEY

Теперь код для формы.

procedure TForm1.Create(Sender: TObject);
begin
RegisterHotKey(Handle, 4000, 0, VK_F1); //при создании формы регистрируем F1
end;



procedure TForm1.Destroy(Sender: TObject);
begin
UnregisterHotKey(Handle, 4000); //Отключаем F1
end;


Затем нужно добавить процедуру обработки события WM_HOTKEY.

type
TForm1 = class(TForm)
procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;


Потом выделяем слово "WMHotKey" и в контекстном меню выбираешь "Complete class at cursor". Тебе сразу же создастся процедура.

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if Msg.HotKey = 4000 then
MessageBox(0,'Нажата F1', '', 0);
end;

Если же необходимо зарегистрировать несколько клавиш, то надо написать еще несколь строк кода:

procedure TForm1.Create(Sender: TObject);
begin
RegisterHotKey(Handle, HOT_KEY_INDEX + VK_F1, 0, VK_F1);
RegisterHotKey(Handle, HOT_KEY_INDEX + VK_F2, 0, VK_F2);
RegisterHotKey(Handle, HOT_KEY_INDEX + VK_F3, 0, VK_F3);
end;


Потом:

procedure TForm1.Destroy(Sender: TObject);
begin
UnregisterHotKey(Handle, HOT_KEY_INDEX + VK_F1);
UnregisterHotKey(Handle, HOT_KEY_INDEX + VK_F2);
UnregisterHotKey(Handle, HOT_KEY_INDEX + VK_F3);
end;


Необязательно знать все способы перехвата клавиш, а достаточно знать несколько, а также знать для чего их использовать.
Ведь совсем необязательно использовать RegisterHotKey, например для закрытия программы.
Если будут вопросы, пишите на мыло.

Каратецкий Кирилл aka CJ
karatetski@tut.by
http://www.karatetski.narod.ru
ICQ: 221468417


< Статью редактировал автор рассылки >

2.

Новости проекта OXOTA 3D.

Для начала хочу немного огорчить вас:
- Игра делается на компьютере Pentium 4(r) 2400MHz с видеокартой GF4Ti4200, так что нехочу обнадёживать владельцев старых S3Trio. Но что же вы хотели, 3D-графика всё-таки! Тем не менее, я приложу максимум усилий, чтобы скорость игры соответствовала качеству выводимой картинки.
- Проект находится в самом начале разработки, игра выйдет нескоро. Я предполагаю это 3-5 месяцев в зависимости от вашего интереса, помощи и советов. (Ведь если я буду думать, что игра никому не нужна - она вообще не выйдет, так что пишите и высказывайте любые свои мысли и предожения.)
- Также, я наверно, огорчу всех любителей экстрима - волков не будет! Вообще в игре, скорее всего, нельзя будет погибнуть! Будут только птицы. Но я обещаю, что постараюсь всё это реализовать потом, может быть в четвёртой Охоте...

Ну а теперь собственно информация более конкретная.
Я делаю пока не игру, а движок для неё, ориентированный на открытые пространства. Делаю его на Delphi. Всех любителей C++ попрошу пока не возмущаться - я с ним ещё почти незнаком и мой выбор - идеальный вариант для начала. В конце-концов, потом можно будет перенести нынешние алгоритмы и на C++. Как сказал однажды мой приятель =FeanaR= - "Математика везде одна" и я с ним согласен.

Так вот движок предположительно будет состоять из примерно 20 модулей, каждый из которых характеризуется своим уровнем доступа* и назначением*.
*Уровень доступа модуля - это условный параметр модуля, который характеризуется количеством других модулей, использующих его. Таким образом, чем больше модулей используют его, тем нижу уровень модуля.
*Назначение модуля - это сектор всей графики, который он на себя берёт.

К примеру, вот более-менее готовые на данный момент модули:
- TEXTURES (низкий уровень; загрузка и использование текстур) - 100%
- CAMERA (высокий уровень; позиционирование игрока в пространстве относительно ландшафта) - 90%
- FONTS (средний уровень; вывод текста с использованием битмапных шрифтов) - 70%
- LAND (средний уровень; рендеринг ландшафта и функции над ним) - 50%
- SPRITES (средний уровень; вывод спрайтов) - 10%
- SKYBOX (высокий уровень; вывод динамичного неба) - 95%

Проценты показывают готовность каждого конкретного модуля.
Судя по ним намечаются проблемы с ландшафтом(сложности оптимизации вывода) и совершенно странные проблемы с выводом спрайтов, всегда повёрнутых к игроку лицом(запутался с матрицами преобразования).
Если кто-либо сможет помочь с ландшафтом - буду благодарен.

Любые предложения относительно игры выслушаю с удовольствием - пишите, мой e-mail внизу.

Все вопросы и пожелания ко мне, т.е. ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Перепубликация допускается только с моего разрешения.
В случае, если вы будете использовать приведённые в этой рассылке коды, не забудьте сделать ссылку на мой сайт.

Удачи всем нам в наших начинаниях!


Ведущий рассылки:
Набатников Иван (urisff@inbox.ru)
http://newff.narod.ru/


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное