DirectInput - проблема

Тема в разделе "WASM.DirectX", создана пользователем Холод, 16 июл 2006.

  1. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Не получается инициализировать DirectInput. Помогите, пожалуйста, очень надо.

    Код (Text):
    1. .DATA
    2. ;interfaces -----------------------------------------------------
    3. POINTER_INTERFACE_DIRECTINPUT8      DWORD       ?
    4. INTERFACE_DIRECTINPUT8 STRUCT
    5.     QueryInterface          DWORD       00000000h
    6.     AddRef              DWORD       00000004h
    7.     Release             DWORD       00000008h
    8.     CreateDevice            DWORD       0000000Ch
    9.     EnumDevices         DWORD       00000010h
    10.     GetDeviceStatus         DWORD       00000014h
    11.     RunControlPanel         DWORD       00000018h
    12.     Initialize          DWORD       0000001Ch
    13.     FindDevice          DWORD       00000020h
    14.     EnumDevicesBySemantics      DWORD       00000024h
    15.     ConfigureDevices        DWORD       00000028h
    16. INTERFACE_DIRECTINPUT8 ENDS
    17.  
    18. POINTER_INTERFACE_DIRECTINPUTDEVICE8    DWORD       ?
    19. INTERFACE_DIRECTINPUTDEVICE8 STRUCT
    20.     QueryInterface          DWORD       00000000h
    21.     AddRef              DWORD       00000004h
    22.     Release             DWORD       00000008h
    23.     GetCapabilities         DWORD       0000000Ch
    24.     EnumObjects         DWORD       00000010h
    25.     GetProperty         DWORD       00000014h
    26.     SetProperty         DWORD       00000018h
    27.     Acquire             DWORD       0000001Ch
    28.     Unacquire           DWORD       00000020h
    29.     GetDeviceState          DWORD       00000024h
    30.     GetDeviceData           DWORD       00000028h
    31.     SetDataFormat           DWORD       0000002Ch
    32. INTERFACE_DIRECTINPUTDEVICE8 ENDS
    33.  
    34. ;structures -----------------------------------------------------
    35. DIRECTINPUT_DATAFORMAT STRUCT
    36.     dwSize              DWORD       ?
    37.     dwObjSize           DWORD       ?
    38.     dwFlags             DWORD       ?
    39.     dwDataSize          DWORD       ?
    40.     dwNumObjs           DWORD       ?
    41.     rgodf               DWORD       ?
    42. DIRECTINPUT_DATAFORMAT ENDS
    43.  
    44. GUID_Key                GUID            <055728220h, 0D33Ch, 11CFh, <0BFh, 0C7h, 44h, 45h, 053h, 54h, 00h, 00h>>
    45. IID_IDIRECTINPUT8           GUID            <0BF798030h, 0483Ah, 4DA2h, <0AAh, 099h, 5Dh, 64h, 0EDh, 36h, 97h, 00h>>
    46. GUID_SYSKEYBOARD            GUID            <06F1D2B61h, 0D5A0h, 11CFh, <0BFh, 0C7h, 44h, 45h, 053h, 54h, 00h, 00h>>
    47.  
    48. _DIOBJECTDATAFORMAT STRUCT
    49.     pguid               DWORD           ?
    50.     dwOfs               DWORD           ?
    51.     dwType              DWORD           ?
    52.     dwFlags             DWORD           ?
    53. _DIOBJECTDATAFORMAT ENDS
    54.  
    55. _DIKEYBOARD             _DIOBJECTDATAFORMAT 256 DUP (<?>)
    56.  
    57. _DIDATAFORMAT STRUCT
    58.     dwSize              DWORD           24 ;size of _DIDATAFORMAT
    59.     dwObjSize           DWORD           16 ;size of _DIOBJECTDATAFORMAT
    60.     dwFlags             DWORD           00000002h ;DIDF_RELAXIS
    61.     dwDataSize          DWORD           256
    62.     dwNumObjs           DWORD           256
    63.     rgodf               DWORD           OFFSET _DIKEYBOARD
    64. _DIDATAFORMAT ENDS
    65.  
    66. .CODE
    67. ;get DIRECTINPUT8 interface
    68.             PUSH    0
    69.             PUSH    OFFSET POINTER_INTERFACE_DIRECTINPUT8
    70.             PUSH    OFFSET IID_IDIRECTINPUT8
    71.             PUSH    0800h ;DIRECTINPUT_VERSION
    72.             PUSH    WINDOW_CLASS.hInstance
    73.             CALL    ADDR_DirectInput8Create
    74.  
    75. ;get DIRECTINPUTDEVICE8 interface
    76.             PUSH    0
    77.             PUSH    OFFSET POINTER_INTERFACE_DIRECTINPUTDEVICE8
    78.             PUSH    OFFSET GUID_SYSKEYBOARD
    79.  
    80.             MOV EAX, POINTER_INTERFACE_DIRECTINPUT8
    81.             PUSH    EAX
    82.             MOV EAX, [EAX]
    83.             CALL    DWORD PTR [EAX + INTERFACE_DIRECTINPUT8.CreateDevice]
    84.  
    85. ;fill _DIKEYBOARD
    86.             MOV ESI, OFFSET _DIKEYBOARD + 4096 ;256 * 16
    87.             MOV ECX, 255
    88.  
    89. FILL_NEXT_ELEMENT:
    90.             SUB ESI, 4h
    91.             MOV EAX, 0h
    92.             MOV [ESI], EAX
    93.             SUB ESI, 4h
    94.             MOV EBX, ECX
    95.             SHL EBX, 8
    96.             OR  EBX, 8000000Ch
    97.             MOV [ESI], EBX
    98.             SUB ESI, 4h
    99.             MOV [ESI], ECX
    100.             SUB ESI, 4h
    101.             MOV [ESI], OFFSET GUID_Key
    102.             LOOP    FILL_NEXT_ELEMENT
    103.  
    104. ;set data format
    105.             PUSH    OFFSET _DIDATAFORMAT
    106.             MOV EAX, POINTER_INTERFACE_DIRECTINPUTDEVICE8
    107.             PUSH    EAX
    108.             MOV EAX, [EAX]
    109.     error >>>   CALL    DWORD PTR [EAX + INTERFACE_DIRECTINPUTDEVICE8.SetDataFormat]
    Почему возникает ошибка? Подскажите, добрые люди!
     
  2. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Структуру _DIKEYBOARD правильно заполняешь?
    Посмотри как заполняли здесь http://www.wasm.ru/forum/viewtopic.php?id=8941
    Остальные структуры, GUID'ы и вызовы методов вроде бы верные...
     
  3. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Одно и тоже. Разница в том что у меня заполнение идёт сзаду-наперёд.
     
  4. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    И всё же в чем проблема?
     
  5. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Чтобы не быть голословным, прикрепляю рабочий пример выдранный из моего пакета инклудов к DX8.
    Просто создавать примерчик и втыкать в него кусок твоего кода, нет времени, думаю исходник поможет.
     
  6. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    ничего не получается.... ((((((
     
  7. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Холод
    Приаттаченный пример работает? В нем пробовал заменить что либо на свой код?
     
  8. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Я сейчас вставил твой код в приаттаченный пример (в пятом посте), и могу совершенно однозначно сказать, структуру ты заполняешь неверно. Весь код кроме заполнения структуры работает на ура. Возьми нормальное заполнение и не мучайся.
     
  9. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    У меня нет инк и либ файлов, чтобы протестировать твой код.
     
  10. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    :) а все либы и инклуды лежат в аттаче
    кроме dinput8.lib и dinput8.inc там ничего кроме стандартных либ и инклудов masm'a не используется...
    Просто видимо не смотрел и не пытался, ну в таком случае уже ничем помочь не могу
     
  11. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    У меня нет стандартных либов и инклудов. Просто линкер и компилятор. Нет ни kernel32.inc ни windows.inc и с либами такая же дрянь может подскажешь, где полную версию компилятора можно взять(или ещё лучше приаттач в мессадж), а то у меня компилятор из книги.

    Увожаемый KeYMax я глубоко увожаю ваши советы. Огромное спасибо вам и я очень рад, что в России есть такие умные люди.
    Врать вам и перекладывать работу на ваши плечи, мыслей не было.
     
  12. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Весь пакет masm самой последней версии (MASM32 v9) есть на этом же сайте
    в разделе "Инструменты->компиляторы" здесь

    Без него просто никак :)
    Установка проблем вызвать не должна, там install
     
  13. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Добрый вечер увожаемый KeYMax!
    Огромное спасибо за ссылочки. Теперь структура заполнилась нормально, ошибок в инициализации нет.
    Но при чтении клавиатуры(DIRECTINPUT_READKEYBOARD.INC - там считывание DIK_UPARROW) программа завершается аварийно.
    Почему?

    Зарание благодарен.
     
  14. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Первое что сразу бросается в глаза это то, что программа собирается линкером как консольная, хотя в тексте программы явно встречаются создание окна и оконная процедура... зачем?

    На этой строчке при любой нажатой клавише явно завершается работа приложения:

    .IF LOCALMSG == 00000100h ;WM_KEYDOWN <------- !!!!

    и от directinput это никак не зависит, так как это событие о нажатии любой клавиши приходит в оконную процедуру.

    Можно например эту строку оставить и дополнительно проверять какую клавишу нажали (Esc например) и только после этого завершать работу...
     
  15. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Ха-ха-ха! Огромное спосибо KeYMax что подсказал! Как я мог пропустить такую мелочь... видимо увлёкся тестами DirectInput, а про окно забыл.
    В консоль мне удобнее ошибки выводить.
    Вот, глянь что получилось. Тут конечно ещё далеко до совершенства, но всё-же.
     
  16. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
  17. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Добрый вечер! Подскажите, пожалуйста, как заPUSHить дробное число в качестве параметра функции.
    Есть функция:

    Код (Text):
    1. function ADD_REAL(A, B: EXTENDED): EXTENDED;
    2.           begin
    3.             RESULT := A + B;
    4.           end;
    Как правильно её вызвать:

    Код (Text):
    1. PUSH  2.5 ?\как правильно заPUSHить
    2.           PUSH  2.5 ?/
    3.           CALL  ADD_REAL
     
  18. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Самый простой вариант для masm'a это объявить переменную в секции .data а затем заталкивать ее в стек.

    Или можно воспользоваться макросом fpc
    Код (Text):
    1. ;*****************************************************************************
    2.  ; Данный макрос позволяет указывать непосредственно в коде числа с плавающей
    3.  ; запятой.
    4.  ; fpc macro allows constants to be used with floating point operations.
    5.  ; Authored by bitRAKE from Win32ASM board <http://board.win32asmcommunity.net>
    6.  ; Great resource for assembler hackers
    7.  ;*****************************************************************************
    8.  
    9.   fpc MACRO val:REQ
    10.     LOCAL w,x,y,z,zz,ww
    11.  
    12.     ;; split type and value, defaulting to REAL4
    13.     z INSTR 1,<&val>,<! >
    14.     IF z EQ 0
    15.         y TEXTEQU <REAL4>
    16.         x TEXTEQU <&val>
    17.     ELSE
    18.         y TEXTEQU @SubStr(<&val>,1,z-1) ;; Type
    19.         x TEXTEQU @SubStr(<&val>,z+1,)  ;; Value
    20.     ENDIF
    21.  
    22.     ;; replace . with _
    23.     z INSTR 1,x,<!.>
    24.     IF z EQ 0
    25.         w TEXTEQU x
    26.         x CATSTR x,<.0> ;; prevent error message
    27.     ELSE
    28.         w CATSTR @SubStr(%x,1,z-1),<_>,@SubStr(%x,z+1,)
    29.     ENDIF
    30.  
    31.     ;; replace - with _
    32.     zz INSTR 1,w,<!->
    33.     IF zz EQ 0
    34.         ww TEXTEQU w
    35.     ELSE
    36.         ww CATSTR @SubStr(%w,1,zz-1),<_>,@SubStr(%w,zz+1,)
    37.     ENDIF
    38.  
    39.     ;; figure out global name for constant
    40.     z SIZESTR y ;; use last char for size distiction
    41.     ww CATSTR <__>,ww,<r>,@SubStr(%y,z,1)
    42.  
    43.     IF (OPATTR(ww)) EQ 0 ;; not defined
    44.         CONST SEGMENT
    45.             ww y x
    46.         CONST ENDS
    47.     ENDIF
    48.     EXITM ww
    49.  ENDM
    50.  
    51.  FP4         MACRO  value
    52.      EXITM  fpc( @CatStr( <REAL4 >,value ) )    
    53.  ENDM
    54.  
    55.  FP8         MACRO  value
    56.      EXITM  fpc( @CatStr( <REAL8 >,value ) )    
    57.  ENDM
    58.  
    59.  FP10        MACRO  value
    60.      EXITM  fpc( @CatStr( <REAL10 >,value ) )    
    61.  ENDM
    используется так: invoke somefunc, fpc(0.05f), fpc(1.5f)

    А вот для fasm'a такой проблемы не существует, там можно прямо в invoke указывать числа с плавающей запятой.
     
  19. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Спасибо, Миш.
     
  20. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Здравствуйте, Михаил-KeYMax! У меня возникла проблема:
    почему-то не движется камера...
    операции с матрицами вроде-бы верные (DIRECT3D_RENDERSCREEN.INC) при нажатии uparrow, прирост не приростает :dntknw:
    может я не правильно использую функции FPU (DIRECTINPUT_READDEVICE.INC)?