나는 기존 게임에 기능을 추가하는 프로젝트를 진행하고 있습니다. 아이디어는 창을 실행하는 옵션을 추가하는 것입니다 (원래 800x600 전체 화면 만 지원함).DirectDraw 출력 변환
지금까지 DirectDraw의 초기화를 수정하여 전체 화면 단독 모드를 제거하고 GDI와 함께 작동하도록 설정하고 클리퍼를 만들고 모든 것이 올바르게 설정된 경우 게임이 전체 화면 모드를 8 비트 색 깊이로 설정하고 창을 실행합니다 이 같은 이미지 출력 쓰레기로 발생합니다
지금까지 내가이 문제를 해결하려면 GetDIBits 및 SetDIBits를 사용하여 몇 가지 트릭을하려고 노력하지만 난 어떤 성공도 없었다.
게임은 아주 오래된 directDraw 버전에서 작동합니다 (이 버전에 대한 설명서가 전혀 없으며, 대부분 내 작업은 추측과 테스트를 기반으로합니다).
게임은 BltFast를 사용하여 정보를 화면에 표시합니다. 여기
내가 8 비트 컬러 포맷을 변환 할 수있는 방법 쌍 비트PrimarySurface = 게임 차 표면 자체
patch_1:
; Blt interface
CALL DWORD [EDX+1Ch] ;<--- Surface->BltFast() Outputs game screen, params pushed to stack elsewhere
pushad
; Get diBits and transform it properly to display
push surfaceDC
mov eax, [PrimarySurface]
mov edx, [eax]
push eax
call dword [edx+44h] ; Surface->GetDC(&surfaceDC)
test eax, eax
je patch_1_abort
invoke FindWindowA, 0, 'Rising Lands'
mov [windowHandle], eax
invoke GetDC, eax
mov [windowDC], eax
invoke CreateCompatibleDC, [surfaceDC]
mov [compatibleDC], eax
invoke CreateCompatibleDC, [windowDC]
mov [compatibleWindowDC], eax
invoke CreateCompatibleBitmap, [windowDC], 800, 600
mov [zbitmap], eax
; Get screen header
invoke GetDIBits, [compatibleWindowDC], [zbitmap], 0, 0, 0, bitmapHeader, 0
; Get game screen data
invoke GetDIBits, [compatibleDC], [zbitmap], 0, 600, bbuffer, bitmapHeader, 0
; Copy content back to screen
invoke SetDIBits, [compatibleWindowDC], [zbitmap], 0, 600, bbuffer, bitmapHeader, 0
; Release
push [surfaceDC]
mov eax, [PrimarySurface]
mov edx, [eax]
push eax
call dword [edx+68h]
patch_1_abort:
popad
; Original code finalization
MOV EDX,EAX
TEST EAX, EAX
jmp [p1r]
surfaceDC dd 0
windowHandle dd 0
windowDC dd 0
compatibleDC dd 0
compatibleWindowDC dd 0
zbitmap dd 0
bitmapInfo dd bitmapHeader
dd 0
bitmapHeader:
hSize dd endHeader - bitmapHeader
hWidth dd 0;800
hHeight dd 0;600
hPlanes dw 0;1
hBitCount dw 0;32
hCompression dd 0
hSizeImage dd 0
hxPPm dd 0
hyPPm dd 0
hClrUsed dd 0
hClrImp dd 0
endHeader:
bbuffer rb 800*600*10
를 사용하여 문제를 해결하려고 쓰여진 코드 조각이된다 BltFast에 대한 호출을 화면에 올바르게 출력하도록 변경하여 버퍼에서 직접?
다른 DC로 출력을 다시 라우팅하여 GetDI 비트/SetDIBits를 사용하여 이미지를 수정하는 것이 더 나은 솔루션입니까?
버전 중 하나를 소스 형식은 당신이 될 것으로 기대 또는 목적지가 아닌 것이 아니다. 게임에서 800x600x4 (16 색)를 사용하고 있지 않습니까? 어쨌든, 나는이 잘못된 길로 가고 있다고 생각합니다. 나는 GDI를 전혀 사용하지 않을 것입니다. DirectDraw 윈도우 모드를 사용하여 독점 모드를 에뮬레이트 한 DirectDraw 래퍼를 작성합니다. 실행 파일을 패치하거나 어셈블리를 사용할 필요가 없습니다. 그냥 같은 디렉토리에 자신의 DDRAW.DLL을 덤프.이미 적어도 하나의 프로그램이 있습니다. 누가 이름을 지었고, 이미이 일을 처리합니다. –
나는 DirectDraw에 좀 새로운 것이므로 전체 화면을 기반으로 창 모드를 에뮬레이트하는 방법을 알지 못한다. 또한, 게임은 ddraw의 극단적으로 오래된 버전을 사용합니다. Windows가 일부 호환 버전으로 전환한다고 생각합니다 (게임과 함께 배포 된 ddraw를 사용하는 경우 아무 것도 작동하지 않습니다). –
DirectDraw 7은 여전히 온라인으로 문서화되어 있습니다. https : // msdn.microsoft.com/en-us/library/windows/desktop/gg426124.aspx –