В статье про создание движка игры на MASM32 (http://www.wasm.ru/comment.php?artcode=pg02) мне кое что не понятно. В каком файле описан макрос DD4INVOKE? Я предпологаю, что он должен найтись в DDraw.inc, но его там нет в десятой версии. Вот содержимое моего inc: Код (Text): ; =========================================== ; ddraw.inc copyright MASM32 1998 - 2005 ; =========================================== IFNDEF DDRAW_INC DDRAW_INC equ <1> DDGetAttachedSurfaceLcl PROTO :DWORD,:DWORD,:DWORD DDInternalLock PROTO :DWORD,:DWORD DDInternalUnlock PROTO :DWORD DSoundHelp PROTO :DWORD,:DWORD,:DWORD DirectDrawCreate PROTO :DWORD,:DWORD,:DWORD DirectDrawCreateClipper PROTO :DWORD,:DWORD,:DWORD DirectDrawCreateEx PROTO :DWORD,:DWORD,:DWORD,:DWORD DirectDrawEnumerateA PROTO :DWORD,:DWORD DirectDrawEnumerate equ <DirectDrawEnumerateA> DirectDrawEnumerateExA PROTO :DWORD,:DWORD,:DWORD DirectDrawEnumerateEx equ <DirectDrawEnumerateExA> DirectDrawEnumerateExW PROTO :DWORD,:DWORD,:DWORD DirectDrawEnumerateW PROTO :DWORD,:DWORD GetDDSurfaceLocal PROTO :DWORD,:DWORD,:DWORD GetSurfaceFromDC PROTO :DWORD,:DWORD,:DWORD ELSE echo ----------------------------------------- echo WARNING Duplicate include file ddraw.inc echo ----------------------------------------- ENDIF Этого макроса нет и в d3d8.inc Видимо макрос использовался в старых версиях масма, возможно теперь он бесполезен, но что тогда делать? Подскажите что лучше начинающему игроделу. Заранее спасибо.
Извиняюсь, нашел похожую тему, только через поисковик. (http://www.wasm.ru/forum/viewtopic.php?id=11200) Скачал оттуда инклуды 7-й версии masm32 и примерчик. Разберусь и напишу об этом подробнее.
Беглый анализ файлов из темы выше результатов не дал. По крайней мере ответа на мой вопрос нет, но я нашел на просторах Интернета игру. Прикрепляю её с исходниками. Ненавижу, когда проблемы идут цепочкой те одна за другой! Не удаётся прикрепить zip файл размером 3.8КБ
До 500К должно нормально прикреплятся. Правда после редактирования поста аттач по-моему отваливается... Думаю дело не в версиях масм, а версиях DirectX. DD4invoke работает начиная с 4-й версии и IMHO перестала работать после 7-й, когда поменялась реализация DirectDraw.
Попытка 2 прекрепить файл. Это тетрис... Там есть нужный inc'и с макросами. Код (Text): DDINVOKE MACRO func, this, arglist :VARARG mov eax , [this] mov eax , [eax] IFB <arglist> INVOKE [IDirectDrawVtbl. func][eax], this ELSE INVOKE [IDirectDrawVtbl. func][eax], this, arglist ENDIF ENDM DD4INVOKE MACRO func, this, arglist :VARARG mov eax , [this] mov eax , [eax] IFB <arglist> INVOKE [IDirectDraw4Vtbl. func][eax], this ELSE INVOKE [IDirectDraw4Vtbl. func][eax], this, arglist ENDIF ENDM И структуры. Код (Text): ;======================================= ; The main DirectDraw1 interface ;======================================= IDirectDrawVtbl STRUC ; IUnknown methods STDMETHOD QueryInterface, :PTR IDirectDraw, :PTR, :PTR PTR STDMETHOD AddRef, :PTR IDirectDraw STDMETHOD Release, :PTR IDirectDraw ; IDirectDraw methods STDMETHOD Compact, :PTR IDirectDraw STDMETHOD CreateClipper, :PTR IDirectDraw, :DWORD, :PTR LPDIRECTDRAWCLIPPER, :PTR IUnknown STDMETHOD CreatePalette, :PTR IDirectDraw, :DWORD, :LPPALETTEENTRY, :PTR LPDIRECTDRAWPALETTE, :PTR IUnknown STDMETHOD CreateSurface, :PTR IDirectDraw, :LPDDSURFACEDESC, :PTR LPDIRECTDRAWSURFACE, :PTR IUnknown STDMETHOD DuplicateSurface, :PTR IDirectDraw, :LPDIRECTDRAWSURFACE, :PTR LPDIRECTDRAWSURFACE STDMETHOD EnumDisplayModes, :PTR IDirectDraw, :DWORD, :LPDDSURFACEDESC, :PTR , :PTR STDMETHOD EnumSurfaces, :PTR IDirectDraw, :DWORD, :LPDDSURFACEDESC, :PTR , :PTR STDMETHOD FlipToGDISurface, :PTR IDirectDraw STDMETHOD GetCaps, :PTR IDirectDraw, :LPDDCAPS, :LPDDCAPS STDMETHOD GetDisplayMode, :PTR IDirectDraw, :LPDDSURFACEDESC STDMETHOD GetFourCCCodes, :PTR IDirectDraw, :PTR DWORD, :PTR DWORD STDMETHOD GetGDISurface, :PTR IDirectDraw, :PTR LPDIRECTDRAWSURFACE STDMETHOD GetMonitorFrequency, :PTR IDirectDraw, :DWORD STDMETHOD GetScanLine, :PTR IDirectDraw, :DWORD STDMETHOD GetVerticalBlankStatus, :PTR IDirectDraw, :PTR SWORD STDMETHOD Initialize, :PTR IDirectDraw, :PTR GUID STDMETHOD RestoreDisplayMode, :PTR IDirectDraw STDMETHOD SetCooperativeLevel, :PTR IDirectDraw, :DWORD, :DWORD STDMETHOD SetDisplayMode, :PTR IDirectDraw, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD STDMETHOD WaitForVerticalBlank, :PTR IDirectDraw, :DWORD, :PTR IDirectDrawVtbl ENDS ;======================================= ; The main DirectDraw4 interface ;======================================= IDirectDraw4Vtbl STRUC ; IUnknown methods STDMETHOD QueryInterface, :PTR IDirectDraw4, :PTR, :PTR PTR STDMETHOD AddRef, :PTR IDirectDraw4 STDMETHOD Release, :PTR IDirectDraw4 ; IDirectDraw4 methods STDMETHOD Compact, :PTR IDirectDraw4 STDMETHOD CreateClipper, :PTR IDirectDraw4, :DWORD, :PTR LPDIRECTDRAWCLIPPER, :PTR IUnknown STDMETHOD CreatePalette, :PTR IDirectDraw4, :DWORD, :LPPALETTEENTRY, :PTR LPDIRECTDRAWPALETTE, :PTR IUnknown STDMETHOD CreateSurface, :PTR IDirectDraw4, :LPDDSURFACEDESC2, :PTR LPDIRECTDRAWSURFACE4, :PTR IUnknown STDMETHOD DuplicateSurface, :PTR IDirectDraw4, :LPDIRECTDRAWSURFACE4, :PTR LPDIRECTDRAWSURFACE4 STDMETHOD EnumDisplayModes, :PTR IDirectDraw4, :DWORD, :LPDDSURFACEDESC2, :PTR , :PTR STDMETHOD EnumSurfaces, :PTR IDirectDraw4, :DWORD, :LPDDSURFACEDESC2, :PTR , :PTR STDMETHOD FlipToGDISurface, :PTR IDirectDraw4 STDMETHOD GetCaps, :PTR IDirectDraw4, :LPDDCAPS, :LPDDCAPS STDMETHOD GetDisplayMode, :PTR IDirectDraw4, :LPDDSURFACEDESC2 STDMETHOD GetFourCCCodes, :PTR IDirectDraw4, :PTR DWORD, :PTR DWORD STDMETHOD GetGDISurface, :PTR IDirectDraw4, :PTR LPDIRECTDRAWSURFACE4 STDMETHOD GetMonitorFrequency, :PTR IDirectDraw4, :DWORD STDMETHOD GetScanLine, :PTR IDirectDraw4, :DWORD STDMETHOD GetVerticalBlankStatus, :PTR IDirectDraw4, :PTR SWORD STDMETHOD Initialize, :PTR IDirectDraw4, :PTR GUID STDMETHOD RestoreDisplayMode, :PTR IDirectDraw4 STDMETHOD SetCooperativeLevel, :PTR IDirectDraw44, :DWORD, :DWORD STDMETHOD SetDisplayMode, :PTR IDirectDraw4, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD STDMETHOD WaitForVerticalBlank, :PTR IDirectDraw4, :DWORD, :PTR IDirectDraw4Vtbl ENDS Просто надо найти аналог в версиях выше 7-й.
В wikipedia черным по белому написано, что... Ха ха ха Можете меня нуба поздравить. Когда я залез в d3d8.inc, то обнаружил это: Код (Text): ;-------------------------------------------------------------------------------- ; Вызов функции Direct3D8 ;-------------------------------------------------------------------------------- d3d8 MACRO func, this, arglist :VARARG mov eax , [this] mov eax , [eax] IFB <arglist> INVOKE [IDirect3D8Vtbl. func][eax], this ELSE INVOKE [IDirect3D8Vtbl. func][eax], this, arglist ENDIF ENDM Видите сходство? Код (Text): DD4INVOKE MACRO func, this, arglist :VARARG mov eax , [this] mov eax , [eax] IFB <arglist> INVOKE [IDirectDraw4Vtbl. func][eax], this ELSE INVOKE [IDirectDraw4Vtbl. func][eax], this, arglist ENDIF ENDM Мда... Я конечно рад, что нашел выход из ситуации... но долго же до меня доходило, что все функции DDraw.inc (который уже в отставке) берёт на себя d3d8.inc Осталось только заменить нужные имена макросов и (в теории) всё заработает.