|
|
本人刚学习ddraw,在在做半透明时遇到了问题,希望大家能帮帮忙
目前我在试做白云在一个有房子的位图上飘过,这里要让云有飘时有半透明效果
本人写了一个,但是运行起来出奇的慢
我的写法是这样的:(估计由于每次调用都要for循环导致,希望能帮我改进,感激不尽)
LPDIRECTDRAW7 lpdd ; // dd object
LPDIRECTDRAWSURFACE7 lpddsprimary ; // dd primary surface
LPDIRECTDRAWSURFACE7 lpddsback
LPDIRECTDRAWSURFACE7 lpddsScreenBack;
/*//////////////////半透明效果///////////////////////////////////////////////////////////////////
lpddsScreenBack->BltFast(tableRect.left, tableRect.top,
lpddsback, &tableRect,
DDBLTFAST_WAIT);
if (FAILED(lpddsScreenBack->Lock(NULL, &ddsd,
DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,
NULL)))
return;
int lpitchBack = (USHORT)(ddsd.lPitch>>1);
USHORT *backBuffer = (USHORT*)ddsd.lpSurface + (SCREEN_HEIGHT - 180)*lpitchBack;
if (FAILED(lpddsTable->Lock(NULL, &ddsd,
DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,
NULL)))
return;
int lpitchWordTable = (USHORT)(ddsd.lPitch>>1);
USHORT *tableBuffer = (USHORT*)ddsd.lpSurface;
for (int j=SCREEN_HEIGHT-180; j<SCREEN_HEIGHT-30; j++)
{
for (int i=50; i<SCREEN_WIDTH-50; i++)
{
backBuffer = ((backBuffer>>1) & 0x7BEF) + ((tableBuffer>>1) & 0x7BEF);
}
backBuffer += lpitchBack;
tableBuffer += lpitchWordTable;
kk=0;
}
if (FAILED(lpddsTable->Unlock(NULL)))
return;
if (FAILED(lpddsScreenBack->Unlock(NULL)))
return;
lpddsback->BltFast(tableRect.left, tableRect.top,
lpddsScreenBack, &tableRect,DDBLTFAST_WAIT);
lpddsprimary->Flip(NULL, DDFLIP_WAIT); |
|