Форум: "Игры";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
ВнизСобытие отпускания кнопки мыши в DirectX Найти похожие ветки
← →
Fosgen (2005-10-17 00:47) [0]Кто знает как отследить событие отпускания нажатой кнопки мыши при обработчике событий мыши через DirectInput? Как отследить нажатие кнопки - известно, а как отследить отпускание? Какого-то особого кода мышь как устройство не возвращает - проверено, опрос идет в режиме immediate - непрерывный. Не может быть чтобы в DirectX такое событие не использовали!
← →
TButton © (2005-10-17 05:01) [1]WM_MOUSE_UP? или как там его...
← →
cyborg © (2005-10-17 07:46) [2]Ставишь, при нажатии, флаг "нажат", затем при опросе смотри, если кнопка была нажата, а сейчас отжата, то создавай событие и флаг сбрасывай, и ,соответственно, наоборот для события нажатия.
← →
Fosgen (2005-10-17 09:24) [3]2 TButton : В модуле DirectInput такого значения "WM_MOUSE_UP" не обнаружено... А вот как его именно - это я и пытаюсь выяснить.
2 cyborg : Это на крайний случай, а уже реализованных в DirectX"е вариантов, типа возврат каких-либо кодов через некий массив (как кодов нажатия через массив rgbbuttons) что мелкомягкие не додумались сделать?
← →
Sphinx © (2005-10-17 09:39) [4]Странно что вообще такой вопрос возник....в DirectInput нет ни одного события...даже на нажатие мыши, а не то, что на отпускание...
Поэтому такое событие, если оно тебе нужно делай сам.
← →
TButton © (2005-10-17 11:05) [5]
> Странно что вообще такой вопрос возник....
угу
событий нет
только флаги состояний
события в виндах
вот WM_MOUSE_UP
и есть событие
← →
Fosgen (2005-10-17 13:51) [6]Господа TButton и Sphinx, читайте пожалуйста текст вопроса повнимательнее - там нет вопроса о событии в DirectInput, а есть вопрос об остлеживании события при использовании обработчика через DI. Каким образом уже отследить - в этом и суть вопроса.
Если есть флаги состояний, по которым это можно сделать - хорошо, нет - будем делать по-другому, а вот флеймить попусту - наверное не очень хорошо, особенно когда сказать нечего. Вот г-н cyborg все понял правильно.
Господа модераторы - вы где? Последите за глумлением над чужими вопросами!
Господину cyborg"у - благадарствую за корректный ответ по теме.
← →
A22 © (2005-10-17 14:25) [7]Fosgen, у вас нездоровое самолюбие, все трое ответивших говорили по теме. А следить своит за вами: "что мелкомягкие не додумались сделать?" - не слишком тактично, а? Мелкомягкие для вас немало сделали, можно ведь повежливее?
← →
Fosgen (2005-10-17 22:27) [8]Специфичное у вас восприятие темы - когда вам удобно - границы темы не определить и то в тему и это (видимо даже ваше. господин А22, высказывание имеет отношение к теме ветки), когда вам удобно наоборот - оказывается уже и не в тему что-то сказал.
Вот интересно, если ты использовал в своих высказываниях слово DirectInput из вопроса - значит твое высказывание уже по теме? Замечательно удобная логика! А кому она удобна - сказать? Или сами догадаетесь?
Интересно, почему только мне высказали замечание за использование термина "мелкомягкие"? А ведь я его не раз на этом форуме встречал.
Уж коли нельзя найти повод для наезда в защиту себя (ну никак не оскорбили), так хоть за мелкомягких вступимся! Там может тогда ко всем с такой просьбой - быть с M$ повежливее? Или такой пункт есть в правилах форума, конткретно о Microsoft? Или просто некоторым не нравится что указали на их такое привычное, но не приятное для других поведение?
А может тем кому реально нечего сказать в ответ на вопрос темы стоит помолчать, а в теме будем только стоящие мысли высказывать? По сути вопроса, так сказать... Или у кого-то есть желание продолжить столь "плодотворную" дисскуссию, видимо также относящуюся к DirectInput?
← →
TButton © (2005-10-18 00:31) [9]лады объясняю на примере ФПС (Фёрст Пёрсон Сшутер)
if LMB_down then
begin
if WEAPON_reloaded then
begin
// shot
end;
end;
повторять как можно чаще =)
т.о. на каждом тике физ. движка проверяется нажата ли ЛКМ, в случае успешной проверки проверяется готов ли веапон стрельнуть
ну и соответственно получается, что пока ты жмешь мышу
веапон лупит изо всех сил, необходимости в проверке нет
такая же фигня если ты в РТС (риал тайм стратеджи) растягиваешь рамку, выделяя юнитовif LMB_down and not LMB_prev_down then
begin
// on mouse down
// запоминаем координаты первого угла рамки
end;
...
if not LMB_down and LMB_prev_down then
begin
// onMouseUp
// запоминаем координаты второго угла рамки
end;
...
LMB_prev_down:=LMB_down;
И напоследок, ну тебе же не просто так не в тему отвечали, тебе объясняли, что в DI событий нет
не пытаяся искать грибы в пустыне
не пытайся поймать рыбу в унитазе
вэйкап нео! епрцт!
← →
Fosgen (2005-10-18 09:25) [10]Спасибо за пример.
Как работать с нажатиями кнопок мыши через DI - я в курсе. Меня интересовал именно момент как отследить когда кнопка (когда-то нажатая) будет отпущена. Называйте это событием, моментом, ситуацией, состоянием кнопки - суть от этого не меняется. То что событие (я называю это так) генрится явно не DI - это и ежу понятно. Впрочем, как понятно сейчас и то что в DI нет никаких флагов, и чего-либо еще, по которым можно было бы отследить отпускание ранее нажатой кнопки. Только по смене состояния массива кнопок из "нажатого" в "отжатое".
Вопрос возник не на пустом месте. Т.к. флаг возвращает значение = 128 для кнопки, была надежда что при отпускании в этом же флаге или каком ином появляется другое значение, фиксирующее момент отжатия кнопки.
Так что события в DI я и не искал - я искал флаги событий... А для этого, думаю, повод был.
← →
TButton © (2005-10-18 12:08) [11]нифига ты не понял
процедураbegin
LMB_down:={здесь ловим из DI нажата ли ЛКМ};
if (LMB_down=true)and(LMB_down_prev=false) then OnMouseDown; // в прошлый раз была отпущена, сейчас - нажата
if (LMB_down=false)and(LMB_down_prev=true) then OnMouseUp; // в прошлый раз была нажата, сейчас - отпущена
// здесь делаем то что тебе надо
LMB_down_prev:=LMB_down;
end;
а иначе - никак
ловите системные сообщения
раз уж так нужен именно MouseUp и MouseDown
← →
Sphinx © (2005-10-18 18:17) [12]2 Fosgen
Ну раз я тут не по теме фразу сказал....то это мой последний пост в твоих темах и темах с твоим участием...
Держи код, полностью соответсвующий моему посту, и в частности двум его фразам:
1) > в DirectInput нет ни одного события...
2) > Поэтому такое событие, если оно тебе нужно делай сам.
только разбирайся что и как сам....
TClickButtonEvent = procedure (mouseX, mouseY: Integer) of object;
...
procedure FRightMouseButtonDown (iX, iY: Integer);
procedure FLeftMouseButtonDown (iX, iY: Integer);
procedure FRightMouseButtonUp (iX, iY: Integer);
procedure FLeftMouseButtonUp (iX, iY: Integer);
...
property OnRightMouseButtonDown : TClickButtonEvent read FOnRightMouseButtonDown write FOnRightMouseButtonDown;
property OnLeftMouseButtonDown : TClickButtonEvent read FOnLeftMouseButtonDown write FOnLeftMouseButtonDown;
property OnRightMouseButtonUp : TClickButtonEvent read FOnRightMouseButtonUp write FOnRightMouseButtonUp;
property OnLeftMouseButtonUp : TClickButtonEvent read FOnLeftMouseButtonUp write FOnLeftMouseButtonUp;
...
if (DirectInputMouseKey.rgbButtons[0] = Key_Is_Down) and (not(FMouseLeftButtonDown)) then
begin
FLeftMouseButtonDown(FMouseX, FMouseY);
FMouseLeftButtonDown := True;
end;
if (DirectInputMouseKey.rgbButtons[0] = Key_Is_Up) and FMouseLeftButtonDown then
begin
FLeftMouseButtonUp(FMouseX, FMouseY);
FMouseLeftButtonDown := False;
end;
if (DirectInputMouseKey.rgbButtons[1] = Key_Is_Down) and (not(FMouseRightButtonDown)) then
begin
FRightMouseButtonDown(FMouseX, FMouseY);
FMouseRightButtonDown := True;
end;
if (DirectInputMouseKey.rgbButtons[1] = Key_Is_Up) and FMouseRightButtonDown then
begin
FRightMouseButtonUp(FMouseX, FMouseY);
FMouseRightButtonDown := False;
end;
...
procedure TGameController.FRightMouseButtonDown (iX, iY: Integer);
begin
if Assigned (FOnRightMouseButtonDown) then
FOnRightMouseButtonDown (iX, iY);
end;
procedure TGameController.FLeftMouseButtonDown (iX, iY: Integer);
begin
if Assigned (FOnLeftMouseButtonDown) then
FOnLeftMouseButtonDown (iX, iY);
end;
procedure TGameController.FRightMouseButtonUp (iX, iY: Integer);
begin
if Assigned (FOnRightMouseButtonUp) then
FOnRightMouseButtonUp (iX, iY);
end;
procedure TGameController.FLeftMouseButtonUp (iX, iY: Integer);
begin
if Assigned (FOnLeftMouseButtonUp) then
FOnLeftMouseButtonUp (iX, iY);
end;
← →
Fosgen (2005-10-18 21:32) [13]На самом деле все предложенное - разные варианты реализации того же решения что предложил cyborg. Т.е. - сохранение состояния кнопки мыши в локальных флагах, с последующей проверкой.
Ну почему если задаешь уточняющий вопрос по некоей теме, тебя сразу же записывают в полные профаны по этой же теме?
Большое спасибо за приведеные схемы решения. Мне уже даже несколько неудобно что Вы все так напряглись по этому вопросу, придумывая примеры, так как задачу я уже решил своим вариантом. Правда похожим на предложение от TButton.
2 Sphinx : Такие решения даже коментировать нет смысла, пишу только исключительно дабы дать понять, что вижу, понял, запомнил, учту.
← →
TButton © (2005-10-19 00:39) [14]Чувак, ты стебаться кончай и гонору по меньше
ибо тут никто тебя пока не записывал
тебе просто доходчиво объяснили, что событий (event)...
хотя, уже сколько раз сказано было
а если
> Называйте это событием, моментом, ситуацией, состоянием
> кнопки - суть от этого не меняется.
bullshit!! ещё как меняет
> в DI нет никаких флагов, и чего-либо еще
ну и на кой ляд он тогда нужен?
← →
Fosgen (2005-10-19 11:31) [15]Тогда к Вам, господа, конструктивное предложение - не задаваться вопросом - откуда возник у спрашивающего вопрос, а уточнять эту самую суть, которая по Вашему мнению меняется от используемого термина!
Я впредь постараюсь все же унифицировать используемую терминологию, дабы привести ее к более понятному виду.
И, если поможет прорешать эмоциональную сторону дела...
Я так скажу - когда тебе вместо ответа на вопрос, или уточнения, что же имелось ввиду, задают встречный вопрос об процессе твоего мышления (это на тему "откуда вообще возник такой вопрос"), то это как-то ощущается не по теме (как мыслит спрашивающий - немного другой вопрос, не правда ли?), что и вызывает эмоциональную реакцию.
Впрочем как и фамильярное обращение "чувак". Я вроде ни к кому подобных эпитетов не применял, так что и к себе ожидаю такого же обращения. Уж не говорю про местоимения вроде "ты". Никто не даст гарантии что собеседник не старше или опытнее? И переход безо всяких предпосылок на "ты, чувак" может опять таки привести к эмоциональной, но совершенно безрезультативной перепалке.
← →
TButton © (2005-10-19 12:46) [16]
> не задаваться вопросом
эт называется зрить в корень =)
> задают встречный вопрос
не помню за собой такого
> Впрочем как и фамильярное обращение "чувак"
тебя задело? тебя задело местоимение?
ну извини, такой уж я есть
среди людей, с которыми я общаюсь это
оскорблением не считается
а на ты я со всеми
ибо не важно старше человек меня или младше
если он... не лучших качеств человек
для меня возраст это вторичное
а в интернете для меня возраста вообще нет
главное, чтоб человек хороший был
и завязывай уже оффтоп
← →
DAlex © (2005-10-26 23:51) [17]Читайте SDK и юзайте DirectInputDevice8_GetDeviceData - отлавливает
все что мыслимо и не мыслемо....
Вот пример использования...
http://libray.narod.ru/Program/DirectX/Chapter5.html#4
Удачи...
← →
Fosgen (2005-10-31 23:32) [18][17] Спасибо за пожелание, только этот пример по использованию DI уже заезжен до оскомины. Кроме всего прочего, DirectInputDevice8_GetDeviceData - возвращает хорошо известный и уже обсужденный массив состояний кнопок, где отмечается только НАЖАТИЕ. А разговор шел об отпускании. Не пробовали с такой точки использовать вышеуказанный DirectInputDevice8_GetDeviceData? Если у Вас получилось отследить отпускание кнопки в данном массиве - я только рад буду узнать как...
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.011 c