Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.01 c
2-1147538115
ДЯМАК
2006-05-13 20:35
2006.05.28
воть такая проблемка проблемка


2-1146835049
AlexanderMS
2006-05-05 17:17
2006.05.28
Всплывающая подсказка в ListBox


10-1120050380
scorpio
2005-06-29 17:06
2006.05.28
Ошибка при выплолнении приложений-сервер (EXCEL)


1-1145273582
gear
2006-04-17 15:33
2006.05.28
Как стартовать программу минимизированной при автозагрузке?


4-1141287337
som
2006-03-02 11:15
2006.05.28
версия Windows





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский