Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

Обработка нажатий клавиш мыши   Найти похожие ветки 

 
Orc   (2003-09-03 07:58) [0]

Здавствуйте, Мастера!

Такой вопрос: как можно обработать нажатия на клавиши мыши в Direct3D-приложении? Т.е., если кнопка у меня в координатах 0,0,100,100, то я пишу

if (pos.x>=0) and (pos.y>=0) and (pos.x<=100) and (pos.y<=100) and (нажатие_на_левую_мышинную_кнопку=true) then делаем_что_то

Как сделать, чтобы это всё работало? Заранее благодарен за ответы.


 
cyborg ©   (2003-09-03 10:22) [1]

Так и делай.

При нажатии на кнопку смотри в цикле все свои объекты (например кнопки):
if (pos.x>=0) and (pos.y>=0) and (pos.x<=100) and (pos.y<=100) then begin end;


 
Orc   (2003-09-03 12:39) [2]

2cyborg: А подробнее, с примером можно? Всё осложняется тем, что у моего приложения нет формы как таковой - сразу создаётся окно и переводится в полноэкранный режим.


 
cyborg ©   (2003-09-03 13:05) [3]

Причём тут форма вообще, мышь что, от формы зависит?
Смотри DirectInput, пример приводить неохото, раз уж Direct3D приложение делаешь, то с DirectInput сам разберёшься.


 
Orc   (2003-09-03 14:26) [4]

2cyborg: про форму я просто так сказал :) Но, тем не менее, спасибо. Буду читать the f***ing manual по DirectInput :))


 
MeF88 ©   (2003-09-03 15:02) [5]

А я вообще извратился, я не только просматривал прямоугольник, но если мышь находится в прямоугольнике, то смотрел еще и прозрачность писеля в текстуре... Естественно переведя координаты мыши в координаты на текстуре с учетом вращений, масшаба и пр. Зато выглядит клево.


 
Sapersky ©   (2003-09-03 17:58) [6]

Причём тут форма вообще, мышь что, от формы зависит?
Смотри DirectInput, пример приводить неохото


А причём тут DirectInput вообще, GetCursorPos не сработает, что ли? Хотя на полном экране не пробовал... Но сообщения (WM_MOUSEMOVE) точно сработают - окно-то есть.
Я к тому, что эти методы попроще будут. Сообщения немного медленнее, но для кнопок это неважно.


 
cyborg ©   (2003-09-03 21:45) [7]

DirectInput притом, что там гораздо проще получить всё, что касается устройств ввода, к тому же работает гораздо быстрее, особенно клавиатура.


 
Orc   (2003-09-04 09:12) [8]

2MeF88: А можно примерчик? Очень уж интересно посмотреть :)


 
Sapersky ©   (2003-09-04 09:42) [9]

DirectInput притом, что там гораздо проще получить всё, что касается устройств ввода

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

к тому же работает гораздо быстрее, особенно клавиатура.

См. WinAPI GetKeyboardState. Точно такая же скорость, что и с DInput.


 
pasha_676 ©   (2003-09-04 10:05) [10]

насчет скорости ты пожалуй зря. Насчет простоты - этточно. Но бонус инпута еще и в поддержке разнообразных девайсов. Джойстик например. Тут вопрос что делается и к чему стремиться. В простой тренировочно-отлаживательной (или в игрушке для домашнего пользования) проге вряд ли стоит городить огород на инпуте. Вообщем все зависит от целей и задач.


 
MeF88 ©   (2003-09-04 11:03) [11]

2Orc: А можно примерчик? Очень уж интересно посмотреть :)
Можно, только забыл сказать, что у меня стояла орто-проекция на размер экрана и все кнопки являлись спрайтами...


 
Orc   (2003-09-04 13:19) [12]

2MeF88: И тем не менне, можно на сие чудо глянуть? :)


 
MeF88 ©   (2003-09-05 21:22) [13]

Ок, немного подредактирую и отправлю. (ес-но фрагмент, так как движок полносью я направлять не буду...)


 
TButton ©   (2003-09-05 21:36) [14]

а можно вместо
if (pos.x>=0) and (pos.y>=0) and (pos.x<=100) and (pos.y<=100)...
написать
if PointInRect(pos,rect(0,0,100,100))...
а рект можно и заранее определить...


 
cyborg ©   (2003-09-05 23:27) [15]

TButton ©   (05.09.03 21:36)
Можно, но не нужно, проверка будет не одна.


 
TButton ©   (2003-09-06 02:18) [16]

2 cyborg ©  
не понял. что значит не одна? если надо проверить клик в одном из 10ти ректов - нужно создать ректы (array of TRect), а проверять их можно бует циклом... такшта это зависит от поставленой задачи.


 
cyborg ©   (2003-09-06 08:12) [17]

Это значит, что скорость сильно упадёт, пора уже привыкать, что в играх скорость - критический момент.


 
TButton ©   (2003-09-06 15:09) [18]

бэээ! скажи это разработчикам игрушек! когда минимум 800 256 + 3Д это нормально да? а когда рексты - ненормально?


 
cyborg ©   (2003-09-06 15:28) [19]

Чего?


 
TButton ©   (2003-09-06 16:03) [20]

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


 
MeF88 ©   (2003-09-06 17:36) [21]

2TButton: Дык там куча полигонов, motion capture всякие, пиксельные шейдеры, крутые текстуры и возможности... Игры щас делают красивые, но корявые. Да здравствует UFO 1 !!!!!


 
TButton ©   (2003-09-06 18:00) [22]

да здарствует Beasts & Bumpkins, Pax Imperia, Command and Conqueror!


 
Sapersky ©   (2003-09-08 12:46) [23]

Можно, но не нужно, проверка будет не одна.
<...>
Это значит, что скорость сильно упадёт


Ага, в 4 раза :)))
Я ассемблер знаю весьма слабо, но всё-таки, ИМХО, сделать сразу 4 сравнения одновременно процессор не сможет. Так что хоть 4 If"а, хоть один - всё равно он будет 4 раза делать CMP, или как оно называется (ну или меньше, чем 4 - если первые не пройдут, последующие он анализировать не будет).
Не говоря уже о том, что неизвестно, как реализована PtInRect :)
И вообще, как говаривал С.Трухильо ("Программирование графики для Windows средствами DirectDraw"), волноваться о производительности на таком уровне - всё равно что переставлять кресла на "Титанике" :)


 
cyborg ©   (2003-09-08 12:58) [24]

Sapersky ©   (08.09.03 12:46)
Могу тебя обрадовать, не в 4, а в 6 раз быстрее.


 
cyborg ©   (2003-09-08 13:20) [25]

Я ошибся в нолике :), в 30-40 раз быстрее.


 
Sapersky ©   (2003-09-08 13:48) [26]

Я, вообще-то, имел в виду разницу между конструкциями

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 раз для большей точности)?


 
Sapersky ©   (2003-09-08 13:57) [27]

Ну точно, всё правильно.


 
pasha_676 ©   (2003-09-08 14:10) [28]


> С.Трухильо ("Программирование графики для Windows средствами
> DirectDraw")

А такой буук существует в электронке. Почитать охото.


 
Sapersky ©   (2003-09-08 18:01) [29]

Не знаю, у меня бумажный.
Ничего там особенного нет, объясняются основы DirectDraw и DirectInput (DirectX5). Единственный интересный пример - вывод курсора в отдельном потоке (чтобы не тормозил при торможениях игры). Но и то - попробуй в нём разберись (Visual C).


 
NailMan ©   (2003-09-08 19:00) [30]

Я у себя юзаю 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 любит дрова нестандартных мышей, хотя в винде они работают на ура.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.162 c
14-1077888387
neodiX
2004-02-27 16:26
2004.03.28
Internet lines overbooking


3-1077174058
mvg_first
2004-02-19 10:00
2004.03.28
Кодировка dBase при использовании ADO +Jet 4.0


14-1077742895
KroT
2004-02-26 00:01
2004.03.28
Значок.


14-1078230163
_none_
2004-03-02 15:22
2004.03.28
какие-то уроды спамят по почте


3-1077778760
San
2004-02-26 09:59
2004.03.28
Как поставить задержку всплытия hint в DBGrid е





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский