![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка нажатий клавиш мыши [Delphi, Windows]
Orc © (2003-09-03 07:58:00)Здавствуйте, Мастера!
Такой вопрос: как можно обработать нажатия на клавиши мыши в Direct3D-приложении? Т.е., если кнопка у меня в координатах 0,0,100,100, то я пишу
if (pos.x>=0) and (pos.y>=0) and (pos.x<=100) and (pos.y<=100) and (нажатие_на_левую_мышинную_кнопку=true) then делаем_что_то
Как сделать, чтобы это всё работало? Заранее благодарен за ответы.
NailMan (2003-09-08 19:00:00) [1]Я у себя юзаю DirectInput и пока доволен как скоростью так и возможностями.
Когда крутится цикл менюшки опрашиваю мышь как immediate и далее обрабатываю полученные координаты, посредством попадания в рект каждого элемента меню 2Д точки курсора. Сразу скажу что элементов на менюшке может быть от 1 до десятков, но скорость у меня ниже 100 фпс не падает(падает с ~600 и главным образом из-за юзания ID3DXSprite для рендера элементов меню). Вобщем-то я перетянул к себе функции типа PointInRect из Types.PAS, дабы размер екзеки не страдал ожирением, да и немножко пооптимайзил это дело.
Вобщем в функции опроса клавы и мыши в менюхах пришлось извращаться для детектинга состояния мыши когда она нажата и когда была отпущена. Но в принципе алгоритм работатет железно.
Посмотреть дему и потестить можно на моем сайте(см в инфо).
Если хочется могу на мыло залить модуль с менюхами, авось разберешься в моем коде(естесственно корявом и не оптимизированном пока еще).
Кстате о птичках...
Есть недочеты у DirectInput:
У меня крыса A4Tech WOP-35 УСБ->PS/2 2 скролла 5 баттонов (юзаю через PS/2) и работает через родные функции дров.
В GUI сделал скроллинг в листбоксе(все элементы свои собственные) как dims.lz, тоесть если изменяется z координата у девайса мыши то по ее знаку либо прибавляю либо убавляю координату сроки в листбоксе. Но когда крыса работает через свои перехватчики (в винде работают оба скролла и баттоны), DirectInput изменение координаты Z не детектит. Стоит мне переключить драйвер мыши в режим совместимости с intellimouse, то все работает как надо, но все расширенные возможности естесственно в дауне. Чё-то как-то не очень DI любит дрова нестандартных мышей, хотя в винде они работают на ура.
Sapersky (2003-09-08 18:01:00) [2]Не знаю, у меня бумажный.
Ничего там особенного нет, объясняются основы DirectDraw и DirectInput (DirectX5). Единственный интересный пример - вывод курсора в отдельном потоке (чтобы не тормозил при торможениях игры). Но и то - попробуй в нём разберись (Visual C).
pasha_676 (2003-09-08 14:10:00) [3]
> С.Трухильо ("Программирование графики для Windows средствами
> DirectDraw")
А такой буук существует в электронке. Почитать охото.
Sapersky (2003-09-08 13:57:00) [4]Ну точно, всё правильно.
Sapersky (2003-09-08 13:48:00) [5]Я, вообще-то, имел в виду разницу между конструкциями
If (pos.x>=0) and (pos.y>=0) and (pos.x<=100) and (pos.y<=100) then ...
и
If (pos.x>=0) then
If (pos.y>=0) then
If (pos.x<=100) then
If (pos.y<=100) then ...
Протестировал. Разницы никакой, действительно.
Но вот чего я не ожидал - так это тормозов, которые даёт вызов функции из DLL (PtInRect). У меня получилось в 30 медленнее, причём очень нестабильно. Что она, грузится при каждом вызове, что ли (прогоняю 1000 раз для большей точности)?
cyborg (2003-09-08 13:20:00) [6]Я ошибся в нолике :), в 30-40 раз быстрее.
cyborg (2003-09-08 12:58:00) [7]Sapersky © (08.09.03 12:46)
Могу тебя обрадовать, не в 4, а в 6 раз быстрее.
Sapersky (2003-09-08 12:46:00) [8]Можно, но не нужно, проверка будет не одна.
<...>
Это значит, что скорость сильно упадёт
Ага, в 4 раза :)))
Я ассемблер знаю весьма слабо, но всё-таки, ИМХО, сделать сразу 4 сравнения одновременно процессор не сможет. Так что хоть 4 If'а, хоть один - всё равно он будет 4 раза делать CMP, или как оно называется (ну или меньше, чем 4 - если первые не пройдут, последующие он анализировать не будет).
Не говоря уже о том, что неизвестно, как реализована PtInRect :)
И вообще, как говаривал С.Трухильо ("Программирование графики для Windows средствами DirectDraw"), волноваться о производительности на таком уровне - всё равно что переставлять кресла на "Титанике" :)
TButton (2003-09-06 18:00:00) [9]да здарствует Beasts & Bumpkins, Pax Imperia, Command and Conqueror!
MeF88 (2003-09-06 17:36:00) [10]2TButton: Дык там куча полигонов, motion capture всякие, пиксельные шейдеры, крутые текстуры и возможности... Игры щас делают красивые, но корявые. Да здравствует UFO 1 !!!!!
TButton (2003-09-06 16:03:00) [11]я про то что скорость упадет. смотрю обзоры игрушек новых и ужасаюсь, мой комп струдом догоняет минимальные системные требования.
cyborg (2003-09-06 15:28:00) [12]Чего?
TButton (2003-09-06 15:09:00) [13]бэээ! скажи это разработчикам игрушек! когда минимум 800 256 + 3Д это нормально да? а когда рексты - ненормально?
cyborg (2003-09-06 08:12:00) [14]Это значит, что скорость сильно упадёт, пора уже привыкать, что в играх скорость - критический момент.
TButton (2003-09-06 02:18:00) [15]2 cyborg ©
не понял. что значит не одна? если надо проверить клик в одном из 10ти ректов - нужно создать ректы (array of TRect), а проверять их можно бует циклом... такшта это зависит от поставленой задачи.
cyborg (2003-09-05 23:27:00) [16]TButton © (05.09.03 21:36)
Можно, но не нужно, проверка будет не одна.
TButton (2003-09-05 21:36:00) [17]а можно вместо
if (pos.x>=0) and (pos.y>=0) and (pos.x<=100) and (pos.y<=100)...
написать
if PointInRect(pos,rect(0,0,100,100))...
а рект можно и заранее определить...
MeF88 (2003-09-05 21:22:00) [18]Ок, немного подредактирую и отправлю. (ес-но фрагмент, так как движок полносью я направлять не буду...)
Orc (2003-09-04 13:19:00) [19]2MeF88: И тем не менне, можно на сие чудо глянуть? :)
MeF88 (2003-09-04 11:03:00) [20]2Orc: А можно примерчик? Очень уж интересно посмотреть :)
Можно, только забыл сказать, что у меня стояла орто-проекция на размер экрана и все кнопки являлись спрайтами...