KeyUp KeyDown in DI8

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

Модератор: Mikle

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

KeyUp KeyDown in DI8

Сообщение Vovik » 02.04.2004 (Пт) 21:51

Как можно узнать нажатие и потом отпускание кнопки? Или вообще такая задача: как через Dinput осуществить набор текста, учитывая Shift (регистр букв)...можно только англ....причём, чтоб текст набирался нормально, а не со скорость фпс (чуть нажал и 10 букв выскакивает)? Заранее благодарен. :roll:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 03.04.2004 (Сб) 1:36

Главное преимущество в ДХ от ВБ-шной обработки клавы - распознавание нескольких одновременно нажатых клавиш. Загляни сюда: http://bbs.vbstreets.ru/viewtopic.php?t=2116
Что касается синхры или автоповтора - придется подумать тебе самому
попробуй QueryPerformanceCounter и QueryPerformanceFrequency. Ранее мне их рекомендовал Mikle. Честно, классная штука!

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 03.04.2004 (Сб) 10:12

Да был я там уже... :( А что конкретно делают эти функции? :?:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 04.04.2004 (Вс) 21:27

"А что конкретно делают эти функции?"

Они дают возможность точно вычислять интервалы времени, прошедшие за 1 шаг цикла.

Их применял для стабилизации движения по карте. Для твоего случая примерно так:

QFreq As Long
QTimeOld As Long
QTime As Long
dQTime As Single
FPSTimer As Long
KBDTime as Single

...
QueryPerformanceFrequency QFreq ' частота таймера
...

Do While Running

' какое щас время?

QueryPerformanceCounter QTime

' иногда переходит через нуль, поэтому
QTime = Abs(QTime)

' определяем интервал времени в мкс, мс, и т.п.

dQTime = Abs(QTime - QTimeOld) / QFreq * 100

' dQTime дает некий коэффициент, чем быстрее рендер,
' тем он меньше,
' при каждом шаге сбрасывается на новое значение

' суммируем (интервал от начала нажатия)
KBDTime=KBDTime + dQTime
...

Render
...

KeyBoard ' здесь смотрим клаву
....

' запомнить время на текущем шаге
QTimeOld = QTime
Loop


Sub KeyBoard

KbdiDEV.Acquire
' получить состояние клавиатуры
KbdiDEV.GetDeviceStateKeyboard KbdiState

If KBDTime> 0.5
' пишем нажатый символ с интервалом не менее 0.5с
...
...

' сбрасываем счетчик
KBDTime=0
End if

End Sub

Это не заработает сразу, надо будет с помощью стандартных кейдаун и кейап разрешать приращение KBDTime и сбрасывать его в нуль!
P.S. Для синхронизации вывода символов может (с большой погрешностью) сгодиться и стандартный таймер ?!

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 04.04.2004 (Вс) 22:41

Сиб...бум разбераться.. :) Слушай, а ты с матрицами хорошо работаешь? Как в них разобраться.... :roll:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 04.04.2004 (Вс) 23:17

Ой - ёй - тяжко, хоть в маматике не последний. Когда нырнул в Дх-8 дажеть конспекты с собственными примерами делал. Друган давал мне книгу, по 3Д на паске, отдуда всё черпал. Но щас бросил.

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

Сообщение Mikle » 05.04.2004 (Пн) 10:22

А по-моему DX8 тем и хорош, что разбираться с матрицами не нужно - просто пользуешься. Я сам не вполне представляю внутреннюю сторону работы матриц, и это, вроде, не мешает.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 05.04.2004 (Пн) 14:45

Mikle писал(а):А по-моему DX8 тем и хорош, что разбираться с матрицами не нужно - просто пользуешься. Я сам не вполне представляю внутреннюю сторону работы матриц, и это, вроде, не мешает.
Ну оно то бы и да.... Но хотелось бы конечно хоть чуть-чуть разобраться... :roll:

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 07.04.2004 (Ср) 14:39

Юрич, спасибо за подсказку насчёт этих апишек... я свой замер заменил и вот результаты:
при использовании GetTickCount:
15
16
15
17
32
15
16
15
33 - то есть, выскакивала вот эта кака в цикле, не знаю даже почему (не заметно конечно, но камера двигалась чуть-чуть судорожно). А вот с этими ф-циями:
14
14
14
14
13
14
14
14. :)
Кстати, частота всегда одинаковая или меняется? :roll:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 08.04.2004 (Чт) 22:42

Vovik писал(а):Кстати, частота всегда одинаковая или меняется?


Тики таймера всегда стабильны, а вот частота кварцевого генератора/коэффициенты деления в разных мамах скорее всего разные.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 09.04.2004 (Пт) 11:50

Yurich писал(а): Тики таймера всегда стабильны, а вот частота кварцевого генератора/коэффициенты деления в разных мамах скорее всего разные.

:shock: Значит на разных машинах будет разная скорость?

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

Сообщение Mikle » 09.04.2004 (Пт) 16:18

Значит на разных машинах будет разная скорость?

Мало того, на одной машине в разных ОС скорость может отличаться. У меня, лично, в XP и 98 отличается, причем сильно. Но! Затем и дается QueryPerformanceFrequency. Ее достаточно опросить один раз в начале программы, а потом полученную разницу тиков делить на эту частоту.

Yurich
QTime = Abs(QTime) не дает точного результата. У меня так:
Код: Выделить всё
Static d1 As Long, d2 As Long, dTick As Single
  QueryPerformanceCounter d2
  d2 = d2 And &HFFFFFF
  dTick = ((d2 - d1) And &HFFFFFF) / QFreq
  d1 = d2

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 10.04.2004 (Сб) 7:23

Mikle, это конечно хорошо, но погрешность почему-то возросла.. Можешь сам протестить. У меня туту ещё вопросик. Эта функция вообщето возврощает 64битное значение, а мы его считываем в лонг. У меня в справочнике там тип с двумя лонгами... От этого чё-нть зависит? :roll:

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

Сообщение Mikle » 12.04.2004 (Пн) 10:13

Это нужно, чтобы измерять большие промежутки времени. При измерении "каждый кадр" не требуется. Только нужно не забывать резервировать 4 оставшиеся байта в "пустую" переменную, а то могут быть "глюки".
погрешность почему-то возросла.. Можешь сам протестить.

Тестил, естественно. Сам прикинь:
Пусть у нас фиксированная частота кадров, длительность кадра &H400 тиков, то есть 1024.
Текущее значение счетчика &HFFFFFF00. То есть -256, или 256 после Abs(QTime)
Следующий кадр - &H00000300. То есть 768.
То есть рассчет показал, что прошло 768-256=512 тиков, хотя прошло 1024.


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

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

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

    TopList