Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: DirectInput в DirectX 9  (Прочитано 83060 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #30 : 15-09-2009 03:00 » 

>>как тогда проверить что буферизированный ввод работает

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

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #31 : 15-09-2009 10:07 » 

А как должен различаться по времени буферизированный ввод и не буферизированный ввод?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #32 : 15-09-2009 10:51 » 

эээ, дело не в различии, а в том, что ты увидишь, как синхронизированы события
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #33 : 15-09-2009 10:55 » 

Алексей1153++
Я не понимаю как это будет видно? Ты бы мог по подробней рассказать?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #34 : 15-09-2009 11:04 » 

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

увидишь, как быстро происходит реакция на кнопку, тебе это нужно посмотреть ?
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #35 : 15-09-2009 22:32 » 

Алексей1153++

У меня произошла ошибка, как и у тебя котрую ты описал в ответе #7

Цитата: Алексей1153++
Компиляция у меня прошла, только линкер ругается
dxguid.lib(dxguid.obj) : fatal error LNK1103: debugging information corrupt; recompile module

Я выяснил что я использую DirectX SDK за ноябрь 2008, а он не поддерживаеться Microsoft Visual C 6.0 придётся устанавливать Microsoft Visual Studio 2008 Express Edidion или Microsoft Visual Studio 2008 Profession Edidion.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #36 : 16-09-2009 03:03 » 

ну так и поставь 2008 Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #37 : 16-09-2009 17:30 » 

Алексей1153++

Прошу прощения что вопрос не в тему, но он возник из-за того что я установил Microsoft Visual Studio 2008 Profession Edidion.


Код

Код:
HRESULT InitMesh(void)
{
    if (FAILED(D3DXLoadMeshFromX(L"Tiger.x", D3DXMESH_SYSTEMMEM, pDirect3DDevice, NULL, &pMeshBuffer, NULL, &dwNumber, &pMesh)))
   return E_FAIL;

   // Извлекаем свойства материала и названия{имена} структуры
    D3DXMATERIAL *D3DXMeshMaterial = (D3DXMATERIAL *)pMeshBuffer->GetBufferPointer();
    pMeshMaterial = new D3DMATERIAL9[dwNumber];
    pMeshTexture   = new LPDIRECT3DTEXTURE9[dwNumber];
    for (DWORD i = 0; i < dwNumber; i++)
    {
        // Копируем материал
        pMeshMaterial[i] = D3DXMeshMaterial[i].MatD3D;
        // Установить окружающего свет
        pMeshMaterial[i].Ambient = pMeshMaterial[i].Diffuse;
        // Загружаем текстуру
        if (FAILED(D3DXCreateTextureFromFile(pDirect3DDevice, D3DXMeshMaterial[i].pTextureFilename, &pMeshTexture[i])))
          pMeshTexture[i] = NULL;
    }
    // Уничтожаем буфер материала
    pMeshBuffer->Release();

    return S_OK;
}

Возникла ошибка в

Error 1   error C2664: 'D3DXCreateTextureFromFileW' : cannot convert parameter 2 from 'LPSTR' to 'LPCWSTR'   c:\di\di.cpp   237   di


Я пробовал решить эту ошибку изменив эту строчку

Код:
if (FAILED(D3DXCreateTextureFromFile(pDirect3DDevice, D3DXMeshMaterial[i].pTextureFilename, &pMeshTexture[i])))

На эту

Код:
if (FAILED(D3DXCreateTextureFromFile(pDirect3DDevice, (LPCWSTR)D3DXMeshMaterial[i].pTextureFilename, &pMeshTexture[i])))

или на эту

Код:
if (FAILED(D3DXCreateTextureFromFile(pDirect3DDevice, reinterpret_cast <LPCWSTR>(D3DXMeshMaterial[i].pTextureFilename), &pMeshTexture[i])))

Это не помогло что же делать, текстура не загружается?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #38 : 16-09-2009 17:43 » 

код не меняй, оставь как было.

А зайди в настройки
(у меня, правда, "русефецырованая", поэтому придётся тебе всё же напрячься, искаючи Улыбаюсь )
меню- проект->свойства->(+)свойства конфигурации , параметр "набор знаков (charset) ", - использовать многобайтовую кодировку (по умолчанию там юникод)
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #39 : 16-09-2009 17:50 » 

Пробовал, выскочило ещё целая куча ошибок. Если необходимо могу их здесь привести.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 16-09-2009 17:51 » 

давай
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #41 : 16-09-2009 18:04 » 

Алексей1153++

Какая-то странность этих ошибок уже нет. Это я что то не так сделал. Но теперь из-за этого компилятора происходит следующие.
Запускаешь программу всё прекрасно работает, но если ты хочешь её закрыть или свернуть такого с тем компилятором небыло не менял код.

---------------------------
Загрузка Х-файла с вращением и камерой: di.exe - Ошибка приложения
---------------------------
Инструкция по адресу "0x00401fcb" обратилась к памяти по адресу "0x00000000". Память не может быть "read".


"ОК" -- завершение приложения
"Отмена" -- отладка приложения
---------------------------
ОК   Отмена   
---------------------------

Почему так получается?

Вот полный код

* di_2008.rar (44.11 Кб - загружено 1075 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 16-09-2009 18:10 » 

запусти на отладку, только точки останова не ставь. Когда оно загнётся, выбери кнопку "повтор" (или что там будет) , потом смотри место, где покажет студия - так у тебя где то нулевой указатель
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #43 : 16-09-2009 18:26 » 

Алексей1153++

Я сделал Debug->Step Into (F11)

И вдруг выскочила ошибка в какойто момент

Unhandled exception at 0x00401fcb in di.exe: 0xC0000005: Access violation reading location 0x00000000.

Странно, но ошибка выскочила совершенно другая. Указывала на код pInputDevice->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph);

Код:
// Функция определения нажатой клавиши на клавиатуре
bool isKeyDown(char KeyCode)
{
// Буферный ввод
unsigned long BUFFER_SIZE = 64; //размер буфера
DIPROPDWORD dipdw;
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = BUFFER_SIZE;
pInputDevice->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph);

ofstream fout("1.txt", ios_base::out | ios_base::app);
fout << GetTickCount(); // Запись в файл
fout << "-";
fout.close();

// Полученние данных с клавиатуры
            if (FAILED(pInputDevice->GetDeviceState(sizeof(keyboard),(LPVOID)&keyboard)))
            {
               DeleteDirectInput();
               return false;
            }

if (keyboard[KeyCode] & 0x80)
   return true;
else
   return false;
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #44 : 16-09-2009 18:29 » 

так надо было во время отладки то посмотреть значения переменных!

скорее всего, pInputDevice==0 было
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #45 : 16-09-2009 18:31 » 

а тут
https://forum.shelek.ru/index.php/topic,21644.0/wap2.html
описано, как включить привычные для VC6 горячки Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #46 : 16-09-2009 18:35 » 

Алексей1153++

Ты всё это сооброзил в уме, ты просто гений!!!

Вот что мне компилятор написал

Код:
		pInputDevice	0x00000000	IDirectInputDevice8A *
- IUnknown {...} IUnknown
__vfptr CXX0030: Error: expression cannot be evaluated
   

Значит что бы избавится от ошибки мне нужно в качестве параметра функции сделать pInputDevice?
« Последнее редактирование: 16-09-2009 18:38 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #47 : 16-09-2009 18:39 » new

так что там соображать то - в окошке ошибки это написано ) Только имени переменной нету.

Вот и разбирайся, где обнулил )
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #48 : 16-09-2009 19:41 » 

Алексей1153++

Большое спасибо. Ошибку обнаружил и исправил.

Надо было отовсюду удалить вызовы DeleteDirectInput(); и сделать один вызов после цикла

Код:
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
...
                                    ...
                                    ...
}
else
                        {
            ...
                                    ...
                                    ...
}
    }

Что на счёт буферизированного ввода я сделал запись в функции проверки нажатия символа там каждый раз происходит получение данных с клавиатуры


Код:
ofstream fout("1.txt", ios_base::out | ios_base::app);
fout << GetTickCount(); // Запись в файл
fout << "-\n";
fout.close();

Где я проверяю нажатия

Код:
ofstream fout("1.txt", ios_base::out | ios_base::app);
fout << GetTickCount(); // Запись в файл
fout << "+\n";
fout.close();

Результат нажатия одного раз на кнопку "1".

Цитата
10759140-
10759150-
10759160-
10759180-
10759200-
10759220-
10759230-
10759250-
10759271-
10759281-
10759301-
10759311-
10759331-
10759351-
10759371-
10759381-
10759401-
10759411-
10759431-
10759451-
10759461-
10759481-
10759501-
10759521-
10759531-
10759551-
10759571-
10759581-
10759601-
10759621-
10759631-
10759651-
10759661-
10759681-
10759701-
10759711-
10759731-
10759751-
10759771-
10759781-
10759801-
10759811-
10759831-
10759851-
10759861-
10759881-
10759901-
10759911-
10759931-
10759951-
10759962-
10759982-
10760002-
10760012-
10760032-
10760052-
10760062-
10760082-
10760102-
10760112-
10760132-
10760152-
10760162-
10760182-
10760202-
10760222-
10760232-
10760252-
10760262-
10760282-
10760302-
10760312-
10760332-
10760352-
10760372-
10760382-
10760402-
10760412-
10760432-
10760452-
10760462-
10760482-
10760502-
10760512-
10760532-
10760552-
10760552+
10760562-
10760562+
10760582-
10760582+
10760592-
10760602+
10760612-
10760632-
10760653-
10760663-
10760683-
10760703-
10760713-
10760733-
10760753-
10760763-
10760783-
10760803-
10760813-
10760833-
10760853-
10760863-
10760883-
10760903-
10760913-
10760933-
10760953-
10760963-
10760983-
10760993-
10761013-
10761033-
10761053-
10761063-
10761083-
10761103-
10761113-
10761133-
10761143-
10761163-
10761183-
10761203-
10761213-
10761233-
10761253-
10761263-
10761283-
10761303-
10761313-
10761333-
10761354-
10761364-
10761384-
10761394-


И что это значит у меня правельно сделан буферизированный ввод или нет?

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #49 : 16-09-2009 19:51 » 

ну, всё зависит от

1) что ты понимаешь под этим словом и что ожидаешь от этого понятия
2) невзирая на пункт 1: что ты хотел добиться


анализируем количество срабатываний:  идёт около сотни считываний с клавы (что делал в этот момент ? Жал кнопку или не жал? ), и одна обработка

 потом идёт хорошо сбалансированный участок - нажатие+обработка

потом снова куча считываний.

Итог: считывание с клавы происходит гораздо чаще проверок, что положительно скажется на скорости реакции программы, однако жуткая разбалансировка даёт повод думать, что происходят лишние считывания. Подумать, почему и помешает ли это вообще. Может так оно и надо )
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #50 : 16-09-2009 20:08 » 

Алексей1153++

Мне странно что всего много ведь что я сделал:
1. Запустил программу;
2. Нажал один раз (не удерживая) кнопку "1" и отпустил её сразу;
3. Закрыл программу.

А в файле почему то так много информации. Разве такое возможно при правельной работе?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #51 : 16-09-2009 20:16 » 

да возможно то оно возвожно, между записями в среднем по 20мс. Это может означать, что опрос клавиатуры осуществляется слишком часто, гораздо чаще, чем производится реакция программы на нажатие. Попробуй сделать замедлитель для опроса, регулируй замедлитель (скажем, 30...100 мс) и смотри, как будет лог писаться. Я думаю, надо добиваться равномерности событий считывание-обработка. Ну а окончательную полировку всё равно будешь производить при реальном использовании программы - пользователь сразу заметит, что кнопки плохо слушаются (при большом замедлителе) или тормозит программа (без замедлителя, возможно)
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #52 : 16-09-2009 20:19 » 

А почему 4 раза есть реакция на нажатия, вроде бы должо быть один раз, ведь я только один раз нажимал или я не прав?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #53 : 16-09-2009 20:25 » 

ну вот как раз "хороший" участок - считалось, обработалось 4 раза равномерно.

Считывание же у тебя в цикле идёт - поэтому ему пофиг, отпустил ты кнопку или нет Улыбаюсь Так же и обработка. Но это всё нормально. Другое дело, если ты предусмотришь ещё набор флагов, где будешь запоминать, отпустили ли кнопку после нажатия. Тогда можно сделать так, чтобы реакция было один раз за одно сколь угодно длительное нажатие
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #54 : 16-09-2009 20:33 » 

То есть из анализа следует что буферизация ввода у меня есть, но не идеальна, так как должо быть 50%/50%?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #55 : 16-09-2009 20:42 » 

ну не обязательно 50/50, лучше даже будет (2 считывания/ 1 обработку)

ты по таймеру опрашиваешь клаву ?
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #56 : 16-09-2009 20:45 » 

Я определяю с помощью функции GetTickCount().

Может я опрашиваю не правильно?
Посмотри пожалуйста мой код для опроса в Ответе #48 и дай пожалуйста ответ правельно ли сделал?
Если тебе кажется, что код не очень подробный ты скажи об этом я тебе сразу более подробно напишу.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #57 : 16-09-2009 20:51 » 

напиши подробнее.
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #58 : 16-09-2009 20:58 » 

Хорошо, вот подробно.

Код:
// Функция обработки нажатия клавиш
bool EnterKey(float timeDelta)
{
if(pDirect3DDevice)
{
if (GetAsyncKeyState('W') & 0x8000f)
TheCamera.FirstBack(4.0f * timeDelta);

if (GetAsyncKeyState('S') & 0x8000f)
TheCamera.FirstBack(-4.0f * timeDelta);

if (GetAsyncKeyState('A') & 0x8000f)
TheCamera.LeftRight(-4.0f * timeDelta);

if (GetAsyncKeyState('D') & 0x8000f)
TheCamera.LeftRight(4.0f * timeDelta);

if (GetAsyncKeyState('R') & 0x8000f)
TheCamera.UpDown(4.0f * timeDelta);

if (GetAsyncKeyState('F') & 0x8000f)
TheCamera.UpDown(-4.0f * timeDelta);

if (GetAsyncKeyState(VK_UP) & 0x8000f)
TheCamera.RollRightVector(1.0f * timeDelta);

if (GetAsyncKeyState(VK_DOWN) & 0x8000f)
TheCamera.RollRightVector(-1.0f * timeDelta);

if (GetAsyncKeyState(VK_LEFT) & 0x8000f)
TheCamera.RollUpVector(1.0f * timeDelta);

if (GetAsyncKeyState(VK_RIGHT) & 0x8000f)
TheCamera.RollUpVector(-1.0f * timeDelta);

if (GetAsyncKeyState('N') & 0x8000f)
TheCamera.RollFirstVector(1.0f * timeDelta);

if (GetAsyncKeyState('M') & 0x8000f)
TheCamera.RollFirstVector(-1.0f * timeDelta);

// Обработка клавиши < 1 >
// Изменяем окружающие освещенние на зеленный цвет
           if (isKeyDown(DIK_1))
           {
    //MessageBox(NULL, "Нажата клавиша 1", "Сообщение", MB_OK);
    TheCamera.FirstBack(-4.0f * timeDelta);
    ofstream fout("1.txt", ios_base::out | ios_base::app);
    fout << GetTickCount(); // Запись в файл
    fout << "+\n";
    fout.close();
           }
}
return true;
}

// Функция синхронизации перемещения камеры по прошедшему с прошлого кадра времени (timeDelta)
void EnterMsgLoop (bool (*ptr_display)(float timeDelta))
{
MSG msg;
ZeroMemory(&msg, sizeof(msg));

static float lastTime = (float)timeGetTime();

while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
                       {
float currTime  = (float)timeGetTime();
float timeDelta = (currTime - lastTime)*0.001f;

ptr_display(timeDelta);
lastTime = currTime;

RenderingDirect3D();
}
            }
DeleteDirectInput();
}

А вот, где это всё вызывается (почти в самом конце функции)

Код:
// Функция которая является входной точкой приложения
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();

    if (SUCCEEDED(InitDirect3D(hwnd)))
    {
        if (SUCCEEDED(InitMesh()))
        {
           ShowWindow(hwnd, SW_SHOWDEFAULT);
           UpdateWindow(hwnd);

           EnterMsgLoop(EnterKey);
        }
    }

    return 0;
}

Код:
// Функция определения нажатой клавиши на клавиатуре
bool isKeyDown(char KeyCode)
{
// Полученние данных с клавиатуры
            if (FAILED(pInputDevice->GetDeviceState(sizeof(keyboard),(LPVOID)&keyboard)))
            return false;

ofstream fout("1.txt", ios_base::out | ios_base::app);
fout << GetTickCount(); // Запись в файл
fout << "-\n";
fout.close();

if (keyboard[KeyCode] & 0x80)
   return true;
else
   return false;
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #59 : 17-09-2009 03:47 » 

у меня этот код выглядел бы так (по понятным причинам не компилировал Улыбаюсь )
Код:
//#include <windows.h>
//#include <fstream>
//------------------------------------------------------------

//логгирование
std::ofstream g_fout;

void OpenLogFile()
{
if(g_fout.is_open())return;
g_fout.open("1.txt", std::ios_base::out | std::ios_base::app);
}

void CloseLogFile()
{
if(g_fout.is_open())
{
g_fout.close();
}
}

void LogToFile(const char* pMarker)
{
if(g_fout.is_open())
{
g_fout << GetTickCount(); // Запись в файл
g_fout << pMarker <<"\r\n";
}
}

//------------------------------------------------------------
enum
{
e_keys_cnt=256,
};

BYTE g_keyboard[e_keys_cnt];

// Функция установки флага для нажатой в данный момент клавиши клавиатуры
bool ReadKeys()
{
// Полученние данных с клавиатуры
if (FAILED(pInputDevice->GetDeviceState(sizeof(keyboard),(LPVOID)&keyboard)))
{
return false;
}

LogToFile("ReadKeys");
return true;
}

bool IsKeyDown(char KeyCode)
{
LogToFile("-");
return (g_keyboard[min(e_keys_cnt,(BYTE)KeyCode)] & 0x80) != 0;
}

//------------------------------------------------------------

// Функция обработки нажатия клавиш
bool EnterKey(float timeDelta)
{
if(pDirect3DDevice)
{
if (GetAsyncKeyState('W') & 0x8000f)TheCamera.FirstBack(+4.0f*timeDelta);
if (GetAsyncKeyState('S') & 0x8000f)TheCamera.FirstBack(-4.0f*timeDelta);
if (GetAsyncKeyState('A') & 0x8000f)TheCamera.LeftRight(-4.0f*timeDelta);
if (GetAsyncKeyState('D') & 0x8000f)TheCamera.LeftRight(+4.0f*timeDelta);
if (GetAsyncKeyState('R') & 0x8000f)TheCamera.UpDown(+4.0f*timeDelta);
if (GetAsyncKeyState('F') & 0x8000f)TheCamera.UpDown(-4.0f*timeDelta);
if (GetAsyncKeyState(VK_UP) & 0x8000f)TheCamera.RollRightVector(+1.0f*timeDelta);
if (GetAsyncKeyState(VK_DOWN) & 0x8000f)TheCamera.RollRightVector(-1.0f*timeDelta);
if (GetAsyncKeyState(VK_LEFT) & 0x8000f)TheCamera.RollUpVector(+1.0f*timeDelta);
if (GetAsyncKeyState(VK_RIGHT) & 0x8000f)TheCamera.RollUpVector(-1.0f*timeDelta);
if (GetAsyncKeyState('N') & 0x8000f)TheCamera.RollFirstVector(+1.0f*timeDelta);
if (GetAsyncKeyState('M') & 0x8000f)TheCamera.RollFirstVector(-1.0f*timeDelta);

// Полученние данных с клавиатуры
if(!ReadKeys())return false;

if(IsKeyDown(DIK_1))
{
TheCamera.FirstBack(-4.0f * timeDelta);
LogToFile("+");
}

if(IsKeyDown(DIK_2))
{
LogToFile("+");
}

if(IsKeyDown(DIK_3))
{
LogToFile("+");
}
}
return true;
}

// Оконная процедура
void EnterMsgLoop()
{
MSG msg;
ZeroMemory(&msg, sizeof(msg));

static float lastTime = (float)timeGetTime();

while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
float currTime  = (float)timeGetTime();
float timeDelta = (currTime - lastTime)*0.001f;

EnterKey(timeDelta);
lastTime = currTime;

RenderingDirect3D();
}
}
DeleteDirectInput();
}

// Главная процедура
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(
0,
"WINDOWSCLASS",
"Загрузка Х-файла с вращением и камерой",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
0, 0, 770, 500, 0, 0, hInst, 0);

if (!hwnd)return 0;

// Инициализация DirectInput
InitDirectInput();

if (SUCCEEDED(InitDirect3D(hwnd)))
{
if (SUCCEEDED(InitMesh()))
{
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);

::memset(g_keyboard,0,sizeof(g_keyboard));

OpenLogFile();
EnterMsgLoop();
CloseLogFile();
}
}

return 0;
}

« Последнее редактирование: 17-09-2009 03:50 от Алексей1153++ » Записан

Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines