1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

DirectDraw и игры

Тема в разделе "WASM.DirectX", создана пользователем Jmix, 21 ноя 2011.

  1. Jmix

    Jmix New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    9
    В статье про создание движка игры на MASM32 (http://www.wasm.ru/comment.php?artcode=pg02) мне кое что не понятно. В каком файле описан макрос DD4INVOKE? Я предпологаю, что он должен найтись в DDraw.inc, но его там нет в десятой версии.
    Вот содержимое моего inc:
    Код (Text):
    1.   ; ===========================================
    2.   ; ddraw.inc copyright MASM32 1998 - 2005
    3.   ; ===========================================
    4.  
    5. IFNDEF DDRAW_INC
    6. DDRAW_INC equ <1>
    7.  
    8. DDGetAttachedSurfaceLcl PROTO :DWORD,:DWORD,:DWORD
    9. DDInternalLock PROTO :DWORD,:DWORD
    10. DDInternalUnlock PROTO :DWORD
    11. DSoundHelp PROTO :DWORD,:DWORD,:DWORD
    12. DirectDrawCreate PROTO :DWORD,:DWORD,:DWORD
    13. DirectDrawCreateClipper PROTO :DWORD,:DWORD,:DWORD
    14. DirectDrawCreateEx PROTO :DWORD,:DWORD,:DWORD,:DWORD
    15. DirectDrawEnumerateA PROTO :DWORD,:DWORD
    16. DirectDrawEnumerate equ <DirectDrawEnumerateA>
    17.  
    18. DirectDrawEnumerateExA PROTO :DWORD,:DWORD,:DWORD
    19. DirectDrawEnumerateEx equ <DirectDrawEnumerateExA>
    20.  
    21. DirectDrawEnumerateExW PROTO :DWORD,:DWORD,:DWORD
    22. DirectDrawEnumerateW PROTO :DWORD,:DWORD
    23. GetDDSurfaceLocal PROTO :DWORD,:DWORD,:DWORD
    24. GetSurfaceFromDC PROTO :DWORD,:DWORD,:DWORD
    25.  
    26. ELSE
    27. echo -----------------------------------------
    28. echo WARNING Duplicate include file ddraw.inc
    29. echo -----------------------------------------
    30. ENDIF
    Этого макроса нет и в d3d8.inc
    Видимо макрос использовался в старых версиях масма, возможно теперь он бесполезен, но что тогда делать?
    Подскажите что лучше начинающему игроделу. Заранее спасибо.
     
  2. Jmix

    Jmix New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    9
    Извиняюсь, нашел похожую тему, только через поисковик. (http://www.wasm.ru/forum/viewtopic.php?id=11200)
    Скачал оттуда инклуды 7-й версии masm32 и примерчик. Разберусь и напишу об этом подробнее.
     
  3. Jmix

    Jmix New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    9
    Беглый анализ файлов из темы выше результатов не дал. По крайней мере ответа на мой вопрос нет, но я нашел на просторах Интернета игру. Прикрепляю её с исходниками.

    Ненавижу, когда проблемы идут цепочкой те одна за другой! Не удаётся прикрепить zip файл размером 3.8КБ
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    До 500К должно нормально прикреплятся. Правда после редактирования поста аттач по-моему отваливается...

    Думаю дело не в версиях масм, а версиях DirectX. DD4invoke работает начиная с 4-й версии и IMHO перестала работать после 7-й, когда поменялась реализация DirectDraw.
     
  5. Jmix

    Jmix New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    9
    Попытка 2 прекрепить файл. Это тетрис...

    Там есть нужный inc'и с макросами.
    Код (Text):
    1. DDINVOKE    MACRO   func, this, arglist :VARARG
    2.     mov eax , [this]
    3.     mov eax , [eax]
    4.  
    5.     IFB <arglist>
    6.         INVOKE [IDirectDrawVtbl. func][eax], this
    7.     ELSE
    8.         INVOKE [IDirectDrawVtbl. func][eax], this, arglist
    9.     ENDIF
    10. ENDM
    11.  
    12. DD4INVOKE   MACRO   func, this, arglist :VARARG
    13.     mov eax , [this]
    14.     mov eax , [eax]
    15.  
    16.     IFB <arglist>
    17.         INVOKE [IDirectDraw4Vtbl. func][eax], this
    18.     ELSE
    19.         INVOKE [IDirectDraw4Vtbl. func][eax], this, arglist
    20.     ENDIF
    21. ENDM
    И структуры.
    Код (Text):
    1.     ;=======================================
    2.     ; The main DirectDraw1 interface
    3.     ;=======================================
    4. IDirectDrawVtbl STRUC
    5.     ; IUnknown methods
    6.     STDMETHOD   QueryInterface, :PTR IDirectDraw, :PTR, :PTR PTR
    7.     STDMETHOD   AddRef, :PTR IDirectDraw
    8.     STDMETHOD   Release, :PTR IDirectDraw
    9.     ; IDirectDraw methods
    10.     STDMETHOD   Compact, :PTR IDirectDraw
    11.     STDMETHOD   CreateClipper, :PTR IDirectDraw, :DWORD, :PTR LPDIRECTDRAWCLIPPER, :PTR IUnknown
    12.     STDMETHOD   CreatePalette, :PTR IDirectDraw, :DWORD, :LPPALETTEENTRY, :PTR LPDIRECTDRAWPALETTE, :PTR IUnknown
    13.     STDMETHOD   CreateSurface, :PTR IDirectDraw, :LPDDSURFACEDESC, :PTR LPDIRECTDRAWSURFACE, :PTR IUnknown
    14.     STDMETHOD   DuplicateSurface, :PTR IDirectDraw, :LPDIRECTDRAWSURFACE, :PTR LPDIRECTDRAWSURFACE
    15.     STDMETHOD   EnumDisplayModes, :PTR IDirectDraw, :DWORD, :LPDDSURFACEDESC, :PTR , :PTR
    16.     STDMETHOD   EnumSurfaces, :PTR IDirectDraw, :DWORD, :LPDDSURFACEDESC, :PTR , :PTR
    17.     STDMETHOD   FlipToGDISurface, :PTR IDirectDraw
    18.     STDMETHOD   GetCaps, :PTR IDirectDraw, :LPDDCAPS, :LPDDCAPS
    19.     STDMETHOD   GetDisplayMode, :PTR IDirectDraw, :LPDDSURFACEDESC
    20.     STDMETHOD   GetFourCCCodes, :PTR IDirectDraw, :PTR DWORD, :PTR DWORD
    21.     STDMETHOD   GetGDISurface, :PTR IDirectDraw, :PTR LPDIRECTDRAWSURFACE
    22.     STDMETHOD   GetMonitorFrequency, :PTR IDirectDraw, :DWORD
    23.     STDMETHOD   GetScanLine, :PTR IDirectDraw, :DWORD
    24.     STDMETHOD   GetVerticalBlankStatus, :PTR IDirectDraw, :PTR SWORD
    25.     STDMETHOD   Initialize, :PTR IDirectDraw, :PTR GUID
    26.     STDMETHOD   RestoreDisplayMode, :PTR IDirectDraw
    27.     STDMETHOD   SetCooperativeLevel, :PTR IDirectDraw, :DWORD, :DWORD
    28.     STDMETHOD   SetDisplayMode, :PTR IDirectDraw, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
    29.     STDMETHOD   WaitForVerticalBlank, :PTR IDirectDraw, :DWORD, :PTR
    30. IDirectDrawVtbl ENDS
    31.  
    32.     ;=======================================
    33.     ; The main DirectDraw4 interface
    34.     ;=======================================
    35. IDirectDraw4Vtbl    STRUC
    36.     ; IUnknown methods
    37.     STDMETHOD   QueryInterface, :PTR IDirectDraw4, :PTR, :PTR PTR
    38.     STDMETHOD   AddRef, :PTR IDirectDraw4
    39.     STDMETHOD   Release, :PTR IDirectDraw4
    40.     ; IDirectDraw4 methods
    41.     STDMETHOD   Compact, :PTR IDirectDraw4
    42.     STDMETHOD   CreateClipper, :PTR IDirectDraw4, :DWORD, :PTR LPDIRECTDRAWCLIPPER, :PTR IUnknown
    43.     STDMETHOD   CreatePalette, :PTR IDirectDraw4, :DWORD, :LPPALETTEENTRY, :PTR LPDIRECTDRAWPALETTE, :PTR IUnknown
    44.     STDMETHOD   CreateSurface, :PTR IDirectDraw4, :LPDDSURFACEDESC2, :PTR LPDIRECTDRAWSURFACE4, :PTR IUnknown
    45.     STDMETHOD   DuplicateSurface, :PTR IDirectDraw4, :LPDIRECTDRAWSURFACE4, :PTR LPDIRECTDRAWSURFACE4
    46.     STDMETHOD   EnumDisplayModes, :PTR IDirectDraw4, :DWORD, :LPDDSURFACEDESC2, :PTR , :PTR
    47.     STDMETHOD   EnumSurfaces, :PTR IDirectDraw4, :DWORD, :LPDDSURFACEDESC2, :PTR , :PTR
    48.     STDMETHOD   FlipToGDISurface, :PTR IDirectDraw4
    49.     STDMETHOD   GetCaps, :PTR IDirectDraw4, :LPDDCAPS, :LPDDCAPS
    50.     STDMETHOD   GetDisplayMode, :PTR IDirectDraw4, :LPDDSURFACEDESC2
    51.     STDMETHOD   GetFourCCCodes, :PTR IDirectDraw4, :PTR DWORD, :PTR DWORD
    52.     STDMETHOD   GetGDISurface, :PTR IDirectDraw4, :PTR LPDIRECTDRAWSURFACE4
    53.     STDMETHOD   GetMonitorFrequency, :PTR IDirectDraw4, :DWORD
    54.     STDMETHOD   GetScanLine, :PTR IDirectDraw4, :DWORD
    55.     STDMETHOD   GetVerticalBlankStatus, :PTR IDirectDraw4, :PTR SWORD
    56.     STDMETHOD   Initialize, :PTR IDirectDraw4, :PTR GUID
    57.     STDMETHOD   RestoreDisplayMode, :PTR IDirectDraw4
    58.     STDMETHOD   SetCooperativeLevel, :PTR IDirectDraw44, :DWORD, :DWORD
    59.     STDMETHOD   SetDisplayMode, :PTR IDirectDraw4, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
    60.     STDMETHOD   WaitForVerticalBlank, :PTR IDirectDraw4, :DWORD, :PTR
    61. IDirectDraw4Vtbl    ENDS
    Просто надо найти аналог в версиях выше 7-й.
     
  6. Jmix

    Jmix New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    9
    В wikipedia черным по белому написано, что...
    Ха ха ха :D

    Можете меня нуба поздравить. Когда я залез в d3d8.inc, то обнаружил это:
    Код (Text):
    1. ;--------------------------------------------------------------------------------
    2. ; Вызов функции Direct3D8
    3. ;--------------------------------------------------------------------------------
    4.  d3d8  MACRO  func, this, arglist :VARARG
    5.  
    6.   mov   eax , [this]
    7.   mov   eax , [eax]
    8.  
    9.   IFB <arglist>
    10.        INVOKE [IDirect3D8Vtbl. func][eax], this
    11.   ELSE
    12.        INVOKE [IDirect3D8Vtbl. func][eax], this, arglist
    13.   ENDIF
    14.  
    15.  ENDM
    Видите сходство?
    Код (Text):
    1. DD4INVOKE    MACRO    func, this, arglist :VARARG
    2.     mov    eax , [this]
    3.     mov    eax , [eax]
    4.  
    5.     IFB <arglist>
    6.         INVOKE [IDirectDraw4Vtbl. func][eax], this
    7.     ELSE
    8.         INVOKE [IDirectDraw4Vtbl. func][eax], this, arglist
    9.     ENDIF
    10. ENDM
    Мда... Я конечно рад, что нашел выход из ситуации... но долго же до меня доходило, что все функции DDraw.inc (который уже в отставке) берёт на себя d3d8.inc

    Осталось только заменить нужные имена макросов и (в теории) всё заработает.
     
  7. Jmix

    Jmix New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    9
    Спасибо за подсказку)