Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка нажатий клавиш мыши [Delphi, Windows]


Страницы:   1 2

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: А можно примерчик? Очень уж интересно посмотреть :)
Можно, только забыл сказать, что у меня стояла орто-проекция на размер экрана и все кнопки являлись спрайтами...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо