Итак, у нас есть фон. Вот как выглядит наложенный корабль:
А по уму нам нужно вот так:
При копировании поверхности можно указывать цвет, который не будет скопирован.
Visual Basic Решается это с помощью заполнения структуры:
Это ключ цвета, который не копируется и не показывается. Чтобы воспользоваться этой структурой нужно установить флаги:
Два последних флага это использование структуры DDBLTFX и что в структуре нужно взять ddckSrcColorKey (DDBLT_KEYSRCOVERRIDE). Но опять тонкость, придется применять BltFx, так как по какой-то непонятной логике в VB Blt не поддерживает DDBLTFX. Вот полный код ChipToSecond:
Решается это с помощью заполнения структур DDCOLORKEY и DDBLTFX
Это ключ цвета, который не копируется и не показывается. Необходимо установить флаги:
Последний флаг указывает, что в структуре нужно взять ddckSrcColorKey (DDBLT_KEYSRCOVERRIDE). Вот полный код ChipToSecond():
Visual C++
Visual Basic
Dim ddfx As DDBLTFX
With ddfx
.ddckSrcColorKey_low = RGB(255, 255, 255)
End With
srSecondarySurf.BltFx r, srChip, r1, DDBLT_WAIT Or DDBLT_KEYSRCOVERRIDE Or DDBLT_DDFX, ddfx
Public Sub ChipToSecond(x, y As Integer)
Dim ddfx As DDBLTFX
With ddfx
.ddckSrcColorKey_low = RGB(255, 255, 255)
End With
Dim r As RECT
Dim r1 As RECT
r.Top = y
r.Left = x
r.Right = x + 233
r.Bottom = y + 66
r1.Top = 0
r1.Left = 0
r1.Right = 233
r1.Bottom = 66
srSecondarySurf.BltFx r, srChip, r1, DDBLT_WAIT Or DDBLT_KEYSRCOVERRIDE Or DDBLT_DDFX, ddfx
Debug.Print "Second"
End Sub
Visual C++
DDBLTFX ddb;
DDCOLORKEY dk;
dk.dwColorSpaceLowValue = RGB(255,255,255);
memset(&ddb,0, sizeof(DDBLTFX));
ddb.dwSize = sizeof(DDBLTFX);
ddb.dwDDFX = DDBLTFX_MIRRORLEFTRIGHT;
ddb.ddckSrcColorkey = dk;
srSecondarySurf->Blt(r,srChip,r1,DDBLT_WAIT | DDBLT_KEYSRCOVERRIDE ,&ddb);
void CDirectDraw::ChipToSecond(int x, int y)
{
DDBLTFX ddb;
DDCOLORKEY dk;
dk.dwColorSpaceLowValue = RGB(255,255,255);
memset(&ddb,0, sizeof(DDBLTFX));
ddb.dwSize = sizeof(DDBLTFX);
ddb.dwDDFX = DDBLTFX_MIRRORLEFTRIGHT;
ddb.ddckSrcColorkey = dk;
CRect r;
CRect r1;
r.top = y;
r.left = x;
r.right = x + 233;
r.bottom = y + 66;
r1.top = 0;
r1.left = 0;
r1.right = 233;
r1.bottom = 66;
srSecondarySurf->Blt(r, srChip, r1, DDBLT_WAIT |
DDBLT_KEYSRCOVERRIDE, &ddb);
}