Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectInput инициализация джойстика, усстановка параметров джойстика 
V
    Опции темы
Nick007
Дата 17.4.2010, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.4.2010
Где: СССР

Репутация: нет
Всего: нет



Доброго всем времени суток

я пытаюсь с помощю директикса получить контроль над джойстиком.
все шло вродебы нормально , но в момент установки свойств 
начались проблемы

Код

BOOL CALLBACK EnumJoysticks(LPCDIDEVICEINSTANCE pdInst,
                            LPVOID pvRef)
{
    int Result;

    // Отображаем окно сообщений с именем найденного устройства
    Result = MessageBox(g_hWnd, pdInst->tszInstanceName,
                        L"Джойстик найден применить?", MB_OKCANCEL);
    // Продолжаем перечисление, если нажата кнопка CANCEL
    if(Result == IDCANCEL)
        return DIENUM_CONTINUE;
//-----------------------
    HRESULT hr;
    g_pDIDJoystick = NULL;

    // Создаем объект устройства, используя глобальный объект DirectInput
if(FAILED(g_pDI->CreateDevice(pdInst->guidInstance,
   &g_pDIDJoystick, NULL))){
       MB(L"g_pDIDJoystick DIENUM_CONTINUE CreateDevice");//MB(s) это макрос для MessageBox
       return DIENUM_CONTINUE;
}

// Устанавливаем формат данных
if(FAILED(g_pDIDJoystick->SetDataFormat(&c_dfDIJoystick))) {
    g_pDIDJoystick->Release();
    g_pDIDJoystick = NULL;
       MB(L"g_pDIDJoystick DIENUM_CONTINUE SetDataFormat");
    return DIENUM_CONTINUE;
}

// Устанавливаем уровень кооперации
if(FAILED(g_pDIDJoystick->SetCooperativeLevel(g_hWnd,
                 DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))) {
    g_pDIDJoystick->Release();
    g_pDIDJoystick = NULL;
       MB(L"g_pDIDJoystick DIENUM_CONTINUE SetCooperativeLevel");
    return DIENUM_CONTINUE;
}
// Сначала очищаем структуру
ZeroMemory(&dipr, sizeof(DIPROPRANGE));

dipr.diph.dwSize       = sizeof(dipr);
dipr.diph.dwHeaderSize = sizeof(dipr);

dipr.diph.dwObj = DIJOFS_X;//начнем с оси X
dipr.diph.dwHow = DIPH_BYOFFSET; // Смещение в формате данных

dipr.lMin = -1024;//(крайняя левая позиция)
dipr.lMax =  1024;
if(g_pDIDJoystick==NULL)MB(L"g_pDIDJoystick null DIJOFS_X");
//---------- для установки диапазона значений оси X
if(FAILED(g_pDIDJoystick->SetProperty(DIPROP_RANGE,
                                      &dipr.diph))) {
    g_pDIDJoystick->Release();
    g_pDIDJoystick = NULL;
       MB(L"g_pDIDJoystick DIENUM_CONTINUE DIJOFS_X");
    return DIENUM_CONTINUE;
}

...

}


во время первой установки диапазона значений 
функция SetProperty завершается ошибкой

если ктото сталкивался с подобной проблемой напишите как вы ее преодалели
PM MAIL WWW   Вверх
Nick007
  Дата 14.5.2010, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.4.2010
Где: СССР

Репутация: нет
Всего: нет



решение поставленной задачи найдено:

я думаю что проблема заключалась в более новой версии директ икса
поэтому пред идущий пример не работал.
во всяком случае привожу пример удачной реализации
инициализации джойстика средствами DirectX9.0 в С++:
Код


LPDIRECTINPUTDEVICE8 InitJoy(HWND hWnd, IDirectInput8* pDI)
{
    LPDIRECTINPUTDEVICE8 pDIDevice=NULL;
    HRESULT hr;
    
    g_pDI->EnumDevices(DI8DEVTYPE_JOYSTICK, EnumJoysticks,
        NULL, DIEDFL_ATTACHEDONLY);
    if(g_pDIDJoystick == NULL) {/*MB(L"g_pDIDJoystick null InitInput ");*/b_usejoy=false;}else{b_usejoy=true;}
    if(!b_usejoy)return null;

// Устанавливаем формат данных
if(FAILED(g_pDIDJoystick->SetDataFormat(&c_dfDIJoystick2))) {
    g_pDIDJoystick->Release();
    g_pDIDJoystick = NULL;
       MB(L"g_pDIDJoystick DIENUM_CONTINUE SetDataFormat");
    return NULL;
}

// Устанавливаем уровень кооперации
if(FAILED(g_pDIDJoystick->SetCooperativeLevel(g_hWnd,
                  DISCL_EXCLUSIVE|DISCL_FOREGROUND))) {//NON
    g_pDIDJoystick->Release();
    g_pDIDJoystick = NULL;
       MB(L"g_pDIDJoystick DIENUM_CONTINUE SetCooperativeLevel");
    return NULL;
}
if(g_pDIDJoystick==NULL)MB(L"g_pDIDJoystick null DIJOFS_X");
   // return DIENUM_STOP;
    if( FAILED( hr = g_pDIDJoystick->EnumObjects( EnumObjectsCallback1, 
                                                (VOID*)g_hWnd, DIDFT_ALL ) ) ){
    g_pDIDJoystick->Release();
    g_pDIDJoystick = NULL;
       MB(L"g_pDIDJoystick EnumObjects");
    return NULL;
}


/**/
    return g_pDIDJoystick;
}


функция перечисления устройств:
Код


//------------------for joy
BOOL CALLBACK EnumJoysticks(LPCDIDEVICEINSTANCE pdInst,
                            LPVOID pvRef)
{
    int Result;
/**/
    // Отображаем окно сообщений с именем найденного устройства
    Result = MessageBox(g_hWnd, pdInst->tszInstanceName,
                        L"Джойстик найден применить?", MB_OKCANCEL);
    // Продолжаем перечисление, если нажата кнопка OK
    if(Result == IDCANCEL)
        return DIENUM_CONTINUE;
//-----------------------*/
    g_pDIDJoystick = NULL;

     //Создаем объект устройства, используя глобальный объект DirectInput
if(FAILED(g_pDI->CreateDevice(pdInst->guidInstance,
   &g_pDIDJoystick, NULL))){
       MB(L"g_pDIDJoystick DIENUM_CONTINUE CreateDevice");
       return DIENUM_CONTINUE;
}

    return DIENUM_STOP;
}


функция перечисления свойств устройства:
Код

BOOL CALLBACK EnumObjectsCallback1( const DIDEVICEOBJECTINSTANCE* pdidoi,
                                   VOID* pContext )
{
    HWND hDlg = (HWND)pContext;

    static int nSliderCount = 0;  // Number of returned slider controls
    static int nPOVCount = 0;     // Number of returned POV controls

    // For axes that are returned, set the DIPROP_RANGE property for the
    // enumerated axis in order to scale min/max values.
    if( pdidoi->dwType & DIDFT_AXIS )
    {
        DIPROPRANGE diprg; 
        diprg.diph.dwSize       = sizeof(DIPROPRANGE); 
        diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
        diprg.diph.dwHow        = DIPH_BYID; 
        diprg.diph.dwObj        = pdidoi->dwType; // Specify the enumerated axis
        diprg.lMin              = -1000; 
        diprg.lMax              = +1000; 
   
        // Set the range for the axis
        if( FAILED( g_pDIDJoystick->SetProperty( DIPROP_RANGE, &diprg.diph ) ) ) 
        {MB(L"g_pDIDJoystick SetProperty DIENUM_STOP ");
            return DIENUM_STOP;
        }
    
        DIPROPDWORD dipdw1; 
        dipdw1.diph.dwSize       = sizeof(DIPROPDWORD); 
        dipdw1.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
        dipdw1.diph.dwHow        = DIPH_BYID; 
        dipdw1.diph.dwObj        = pdidoi->dwType; // Specify the enumerated axis
        dipdw1.dwData     = 1500;     // Приблизительно 15% диапазона

        if(FAILED(g_pDIDJoystick->SetProperty(DIPROP_DEADZONE,
                                              &dipdw1.diph))) {
            g_pDIDJoystick->Release();
            g_pDIDJoystick = NULL;
               MB(L"g_pDIDJoystick DIENUM_CONTINUE DIPROP_DEADZONE dwType");
            return NULL;
        }  
    }

    return DIENUM_CONTINUE;
}



в данном примере свойства джойстика 
устанавливаются в функции перечисления свойств устройства
вызываемой из функции перечисления устройств

пример рабочий

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

ps: MB-MessageBox

Это сообщение отредактировал(а) Nick007 - 14.5.2010, 13:36
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.