zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #60 : 21-09-2009 07:40 » |
|
Алексей1153++
А может можно проверить буферизированный ввод так: Засунь в главном цикле, где PeekMessage() функцию Sleep( 10000 ); и нажимай/отпускай разные кнопки много раз. Если все нажатия и отпускания кнопок, которые были сделал за эти 10 секунд, придут, значит работает.
Только не совсем понимаю как это реализовать, зато уже не надо будет анализировать текстовый файл, а достаточно его один раз посмотреть или я не прав и почему не прав?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #61 : 21-09-2009 08:22 » |
|
zuze, меня ещё терзают тузики сомнений... Буферизированный ввод - это , так понимаю, когда раздельно 1) складывается в буфер 2) читается из буфера
то есть в одном потоке значения тупо считываются. То есть тут буфер ReadOny. Во втором потоке , через равные промежутки времени считываются все клавиши, и флаги заносятся в буфер (нажата-не нажата). Если хочется триггер, то вводим ещё буфер, параллельный этому: при переходе флага в первом буфере из 0 в 1 (нажали) сбрасываем флаг во втором (ещё не прочитали в первом потоке). Первый поток , если триггер ещё не защёлкнут, считает, что кнопка только что нажата. Выставляет защёлку и обрабатывает кнопку. Если защёлка уже выставлена - проходит мимо
WM_TIMER, кстати, может плавать, но для управления в игре потянет. А ещё одно кстати - во втором потоке таймер вообще не нужен, можно Sleep() обойтись
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #62 : 24-09-2009 09:38 » |
|
Я не неправилно сделал функцию isKeyDown и массив keyboard[256] сделал в место char написал BYTE. // Глобальная переменная BYTE keyboard[256];
// Функция определения нажатой клавиши на клавиатуре bool isKeyDown(char KeyCode) { // Чистим буфер, иначе может получиться эфект залипшей клавиши ZeroMemory(keyboard, sizeof(keyboard));
// Полученние данных с клавиатуры if (FAILED(pInputDevice->GetDeviceState(sizeof(keyboard),(LPVOID)&keyboard))) return false;
if (keyboard[KeyCode] & 0x80) { ofstream fout("1.txt", ios_base::out | ios_base::app); fout << GetTickCount(); // Запись в файл fout << "-\n"; fout.close(); return true; } else return false; }
Что в результате записалось в текстовый файл после того как я один раз нажал на клавишу '1':11115583- 11115583+ 11115593- 11115593+ 11115613- 11115613+ 11115623- 11115633+ 11115643- 11115643+ 11115663- 11115663+ 11115673- 11115683+ 11115693- 11115693+
Когда в другой раз нажал на клавишу '1' получилось в текстовом файле 12 записей, когда два раза нажал на клавишу '1' получилось в текстовом файле 40 записей. Это значит что буферизованный ввод есть и он работает правильно?
|
|
« Последнее редактирование: 24-09-2009 10:26 от zuze »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #63 : 24-09-2009 14:36 » |
|
Это значит что буферизованный ввод есть и он работает правильно?
ответ будет такой же, как и на вопрос: работает ли всё так, как ты задумал ?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #64 : 24-09-2009 23:23 » |
|
Я всего лишь хочу знать, данные о нажатых клавишах считываются с буфера и правельно ли это происходит? Или всё работает также, как если был не буферизированный ввод, тоесть клавишу нажата - клавиша определена.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #65 : 25-09-2009 03:01 » |
|
я не понимаю вопрос ( Клавиши считываются - это факт. Они правильно считываются (железо исправно, драйвера исправны) - это тоже факт, так как иначе бы они не считывались
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #66 : 25-09-2009 12:18 » |
|
Прошу прощения, за плохое объяснение попробую ещё раз объяснить.
Так как можно делать внешне всё правильно, как в теории, но о чём то забыть и уже не будет буферизированного ввода или будет, только он будет работать неправильно (залипание клавиш [от этого я избавился] или будет работать как не буферизированный ввод) при этом ошибок при компиляции и запуске программы могут не быть. Вот я и хочу это проверить практически.
|
|
« Последнее редактирование: 25-09-2009 12:21 от zuze »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #67 : 25-09-2009 14:24 » |
|
все недостатки, если они есть, обязательно выплывут при активной эксплуатации программы
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #68 : 25-09-2009 14:39 » |
|
Понятно, спасибо за разъяснение. Сейчас буду переходить на программирование мышки. К стати, где то писалось что клавиатура может потеряться и надо ещё в функцию проверки клавиши добавлять код для восстановление клавиатуры, но так как у меня она пока ни разу не терялась я это код писать не буду.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #69 : 25-09-2009 19:10 » |
|
Алексей1153++// Указатель на интерфейс DirectInput для мыши LPDIRECTINPUT8 pInput2 = NULL; // Указатель на устройство ввода мышь LPDIRECTINPUTDEVICE8 pInputDevice2 = NULL;
// Функция которая является входной точкой приложения int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX windowsclass; hInstance = hInst;
windowsclass.cbSize = sizeof(WNDCLASSEX); windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW; windowsclass.lpfnWndProc = MainWinProc; windowsclass.cbClsExtra = 0; windowsclass.cbWndExtra = 0; windowsclass.hInstance = hInst; windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW); windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); windowsclass.lpszMenuName = NULL; windowsclass.lpszClassName = "WINDOWSCLASS"; windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&windowsclass)) return 0;
hwnd = CreateWindowEx(NULL, "WINDOWSCLASS", "Загрузка Х-файла с вращением и камерой", WS_OVERLAPPEDWINDOW|WS_VISIBLE, 0, 0, 770, 500, NULL, NULL, hInst, NULL); if (!hwnd) return 0;
// Инициализация DirectInput InitDirectInput(); InitDirectInputMouse(); ... ... ... }
// Функция обработки нажатия клавиш bool EnterKey(float timeDelta) { if (pDirect3DDevice) { ... ... ... if (isMouseDown(0)) MessageBox(NULL, "Нажата левая клавиша мыши", "Сообщение", MB_OK); if (isMouseDown(1)) MessageBox(NULL, "Нажата правая клавиша мыши", "Сообщение", MB_OK); if (isMouseDown(2)) MessageBox(NULL, "Нажата центральная клавиша мыши", "Сообщение", MB_OK); } return true; }
while(msg.message != WM_QUIT) { if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { ... ... ... } else { ... ... ... } } DeleteDirectInput(); DeleteDirectInputMouse();
// Функция инициализация DirectInput мыши bool InitDirectInputMouse(void) { // Создание интерфейс устройства (Мышь) if (FAILED(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&pInput2, NULL))) return false;
// Создание устройства клавиатуры (Мышь) if (FAILED(pInput2->CreateDevice(GUID_SysMouse, &pInputDevice2, NULL))) return false;
// Установка формата данных мыши if (FAILED(pInputDevice2->SetDataFormat(&c_dfDIMouse))) return false;
// Установка уровня взаимодействия клавиатуры (совместный доступ) [Мышь] if (FAILED(pInputDevice2->SetCooperativeLevel(hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE))) return false;
// Захват доступа к клавиатуре (активизировать управление) [мышь] if (FAILED(pInputDevice2->Acquire())) return false;
return true; }
// Функция определения нажатой клавиши на мыши bool isMouseDown(int Button) { // Чистим структуру, иначе может получиться эфект залипшей клавиши на мыши mouse.lX = 0; mouse.lY = 0; mouse.lZ = 0; ZeroMemory(mouse.rgbButtons, sizeof(mouse.rgbButtons));
// Полученние данных с мыши if (FAILED(pInputDevice->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mouse))) return false;
if (mouse.rgbButtons[Button] & 0x80) return true; else return false; }
// Функция освобождает захваченные ресурсы DeleteInput мыши void DeleteDirectInputMouse(void) { if (pInputDevice2 != NULL) { pInputDevice2->Unacquire(); pInputDevice2->Release(); pInputDevice2 = NULL;
} }
Почему-то клавиши мыши не определяются, в чём дело и как поправить, я понимаю что с этим ты ещё не разбирался, но вдруг идея придёт?
|
|
« Последнее редактирование: 26-09-2009 09:20 от zuze »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #70 : 26-09-2009 03:30 » |
|
а где заполнялось c_dfDIMouse ?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #71 : 26-09-2009 03:37 » |
|
Это же вроде в спецификации DirectInput лежит её заполнять не надо, для клавиатуры я же не заполнял.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #72 : 26-09-2009 03:39 » |
|
тогда мысли закончились Отлаживай, разбирайся... А у меня выходной ))
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #73 : 26-09-2009 03:40 » |
|
Понятно, хорошо отдохнуть!!!
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #74 : 26-09-2009 09:17 » |
|
Прошу прощения за свою невнимательность. Вот в чём дело было. У меня было так // Полученние данных с мыши if (FAILED(pInputDevice->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mouse))) return false;
А надо так // Полученние данных с мыши if (FAILED(pInputDevice2->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mouse))) return false;
Так как pInputDevice относится к клавиатуре, а не к мыши.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #75 : 26-09-2009 10:17 » |
|
к вопросу об глобальных переменных и пустых именах переменных
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #76 : 27-09-2009 04:20 » |
|
Алексей1153++
Так что теперь перехожу к изучению DirectMusic. Если будут вопросы буду задавать. Ты всегда дельные ответы даёшь.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #77 : 27-09-2009 04:56 » |
|
со звуком самую малось делал, требовалось всего то wav файл проиграть Больше не сталкивался. Только там DirectSound, вроде, было
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #78 : 27-09-2009 05:00 » |
|
А DirectMusic работает только с WAV и MIDI, а DirectSound тоже есть я его буду затем изучать.
|
|
« Последнее редактирование: 27-09-2009 05:04 от zuze »
|
Записан
|
|
|
|
|