Шаг 37 - Убираем фон накладки

Итак, у нас есть фон. Вот как выглядит наложенный корабль:

37_1.gif (3780 b)

А по уму нам нужно вот так:

37_2.gif (4009 b)

При копировании поверхности можно указывать цвет, который не будет скопирован.

Visual Basic
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

Два последних флага это использование структуры DDBLTFX и что в структуре нужно взять ddckSrcColorKey (DDBLT_KEYSRCOVERRIDE). Но опять тонкость, придется применять BltFx, так как по какой-то непонятной логике в VB Blt не поддерживает DDBLTFX. Вот полный код ChipToSecond:

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++

Решается это с помощью заполнения структур DDCOLORKEY и DDBLTFX

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);

Последний флаг указывает, что в структуре нужно взять ddckSrcColorKey (DDBLT_KEYSRCOVERRIDE). Вот полный код ChipToSecond():

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);
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 08.05.2002