Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Событие отпускания кнопки мыши в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.041 c
2-1147426024
wirg
2006-05-12 13:27
2006.05.28
Ограничение на длину запроса


4-1141487716
Volf_555
2006-03-04 18:55
2006.05.28
Как сделать копию экрана когда играет видео?


4-1141297063
MaxLMN
2006-03-02 13:57
2006.05.28
RichEdit


2-1147152625
Неуч
2006-05-09 09:30
2006.05.28
ширина текстового поля в Tmemo


2-1147280995
BAngel
2006-05-10 21:09
2006.05.28
как создать свой цвет