Форум: "Игры";
Текущий архив: 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.034 c