Про клаву ....

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

petroff
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 09.09.2003 (Вт) 23:28
Откуда: Зимбабуа

Про клаву ....

Сообщение petroff » 02.11.2003 (Вс) 1:11

Простите за "тему не в тему" ! :)
Я б хотел узнать как пользоватся клавой через directinput....
А то я пробывал опрашивать через " Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer"
Создал процедуру , вставил ее в цикл , но получилось слишком быстро.... то есть нажал один раз ... а вышло что раз 5 изменилось значение по этой клавише . То есть должен был быть "один выстрел .... а получилась очередь ..."
:?
Попробывал через таймер :? еше хуже слишком медлено ?

Через "keydown" не подходит нельзя за раз отследить сразу две нажатые клавиши.... я знаю что можно как-то через directmusic но как ?

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 02.11.2003 (Вс) 22:06

Не знаю причём тут DirectMusic, но через DirectImput делается так:

Код: Выделить всё
Dim DX As New DirectX8

Dim di As DirectInput8 'Объект DirectImput
Dim diDev As DirectInputDevice8 'Устройство DirectImput
Dim diState As DIKEYBOARDSTATE


'Инициализирует DirectInput >
Private Sub InitDI()

Set di = DX.DirectInputCreate()
If di Is Nothing Then Exit Sub

Set diDev = di.CreateDevice("GUID_SysKeyboard")
If diDev Is Nothing Then Exit Sub

diDev.SetCommonDataFormat DIFORMAT_KEYBOARD
diDev.SetCooperativeLevel Me.hWnd, DISCL_NONEXCLUSIVE Or DISCL_BACKGROUND
diDev.Acquire

End Sub


Private Sub Controling()
diDev.GetDeviceStateKeyboard diState

If diState.Key(DIK_W) <> 0 Then 'DIK_W - это нужная клавиша, в данном примере "W"
'Сдесь прописываешь то, что должно происходить
End If

End Sub


Не забудь при загрузки формы прописать InitDI и зациклить Controling.

petroff
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 09.09.2003 (Вт) 23:28
Откуда: Зимбабуа

Сообщение petroff » 03.11.2003 (Пн) 1:58

Ну я имел ввиду опрос клавы производить черз музыкальный таймер ?!
Вроде у него более широкий диапозон .....чем у обычного таймера .....
:?: Но все равно спасибо.....

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 03.11.2003 (Пн) 9:52

Чтобы через GetAsyncKeyState не получались "очереди", делают булевскую переменную, при нажатии на клавишу проверяют ее, и если False - заносят в нее True и производят выстрел. А при отжатии снова заносят False.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 03.11.2003 (Пн) 19:08

Зачем же мучаться и делать через DirectMusic, когда для этого есть DirectImput. Если ты используешь стандартную функцию Timer, то её можно домножать или делить (в зависимости от того, что хочешь сделать, ускорить или замедлить процесс)
Пример:
Timer/2 или Timer*3

petroff
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 09.09.2003 (Вт) 23:28
Откуда: Зимбабуа

Сообщение petroff » 04.11.2003 (Вт) 0:05

Извини я не понял .... у таймера есть диапозон от 1 до 64767..так вот при значение 1 уже сильно тормозит... а меньше значение нельзя сделать - - ошибка

petroff
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 09.09.2003 (Вт) 23:28
Откуда: Зимбабуа

Сообщение petroff » 04.11.2003 (Вт) 0:30

Mikle спасибо за совет все работает отлично .. но всетаки насчет таймера интересно !

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 04.11.2003 (Вт) 8:11

Просто какии я игры не разбирал, к примеру Халфу на VC++, там тоже используется задержка между выстрелами, при момощи таймера.

petroff
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 09.09.2003 (Вт) 23:28
Откуда: Зимбабуа

Сообщение petroff » 04.11.2003 (Вт) 22:32

ПОнимаешь если вставить опрос клавы в "таймер" , то будет сильно медленно .........
--------- ---------------
Цикл Таймер
Рендеринга. =0,1 сек Опрос клавы =1 сек
--------- ----------------
Все данные приблезительные.......

надо как то повысить частоту опроса клавиатуры

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 05.11.2003 (Ср) 9:27

Понял, но над этим я не задумывался, просто не встречался с этой проблеммой.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 05.11.2003 (Ср) 16:05

Вот пример:
http://www.tuapse-mikle.narod.ru/keyb.zip

1 - Одиночный выстрел
2 - Очередь
Esc - Выход
ScrollBar - регулятор скорострельности.

petroff
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 09.09.2003 (Вт) 23:28
Откуда: Зимбабуа

Сообщение petroff » 10.11.2003 (Пн) 23:38

Спасибо ..за пример Mikle

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Про клаву ....

Сообщение longwair » 12.12.2010 (Вс) 15:38

Mikle
Не остался ли у тебя случайно пример что ты выкладывал выше, Оч хочу посмотреть.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Про клаву ....

Сообщение Mikle » 14.12.2010 (Вт) 8:58

longwair писал(а):Не остался ли у тебя случайно пример что ты выкладывал выше, Оч хочу посмотреть.

Больше семи лет прошло, не осталось.
Пример чего конкретно нужен?

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Про клаву ....

Сообщение longwair » 14.12.2010 (Вт) 9:52

Mikle
Ну там где
1-Одиночный выстрел
2-Очередь
Я просто очередь через таймер делаю
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Про клаву ....

Сообщение Mikle » 14.12.2010 (Вт) 14:14

Если у тебя уже есть главный цикл, где рендер, физика и всё остальное, то таймер не нужен.
Во время выстрела запоминаешь текущее время, при каждой следующей итерации цикла сравниваешь текущее время с запомненным, если прошло больше, чем период выстрела - делаешь следующий выстрел и опять запоминаешь его время.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList  
cron