|
|

楼主 |
发表于 2004-10-7 01:05:00
|
显示全部楼层
Re:这里有个可怜的孩子求助 :(
呵呵,谢谢sea_bug哥哥。
我处理的方式大概是下面思路:
1,把两张要用到的图片载入到离屏页 surface_1,surface_2.都是保存在内存里的形式。
2,定义一个空的离屏页surface_final,也是保存在内存里的形式,然后吧offsurface_1贴到surface_final上,然后把他和surface_2混合。
3。把surface_final贴到BackSurface(背缓冲)后,然后在用flip或者bitblt贴到mainsurface上。
我试了几遍都有问题,甚至我就直接在内存里创建surface,什么都不做,只是贴到背缓冲后在贴出来都会时不时的扯一下。但在显存里创建就没问题 :(
我在玩暗黑和仙剑2的时候也有时会一扯一扯的,但是您做的HOHO引擎的例子和一些大型的网络游戏(比如梦幻西游)就不会。
我重新装过显卡驱动和DIRECTX也没用。是不是程序实现的机制有问题呢?
我的半透明处理是这样实现的:
DDSURFACEDESC2 descsrc,descdest;
HRESULT result=0;
BYTE *srcstart,*deststart;
ZeroMemory(&descsrc,sizeof(descsrc));
descsrc.dwSize=sizeof(descsrc);
ZeroMemory(&descdest,sizeof(descdest));
descdest.dwSize=sizeof(descdest);
result=OffSurface->Lock(NULL,&descdest,DDLOCK_WAIT,NULL);
if(result!=DD_OK)
debug.AddError("锁定失败");
result=msurface->OffSurface->Lock(NULL,&descsrc,DDLOCK_WAIT,NULL);
if(result!=DD_OK)
debug.AddError("锁定失败");
srcstart=(BYTE*)descsrc.lpSurface;
deststart=(BYTE*)descdest.lpSurface;
int imgsrcheight=descsrc.dwHeight;
int imgsrcwidth=descsrc.dwWidth;
int imgdestheight=descdest.dwHeight;
int imgdestwidth=descdest.dwWidth;
float alpha1=1-alpha;
BYTE *pixelsrc=srcstart,*pixeldest=&deststart[(x+imgdestwidth*y)*4];
for(int imgy=0;imgy<imgsrcheight;imgy++)
{
pixeldest=&deststart[(x+imgdestwidth*(y+imgy))*4];
for(int imgx=0;imgx<imgsrcwidth;imgx++)
{
*pixeldest=(BYTE)(*pixelsrc*alpha+*pixeldest*alpha1);
pixelsrc++,pixeldest++;
*pixeldest=(BYTE)(*pixelsrc*alpha+*pixeldest*alpha1);
pixelsrc++,pixeldest++;
*pixeldest=(BYTE)(*pixelsrc*alpha+*pixeldest*alpha1);
pixelsrc+=2,pixeldest+=2;
}
}
OffSurface->Unlock(NULL);
msurface->OffSurface->Unlock(NULL);
然后主程序里的循环是这样的:
void MainEnter::MainLoop()
{
MSG msg;
while (TRUE)
{
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
{
if( !GetMessage( &msg, NULL, 0, 0 ) )
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Surfacefinal.AddSurface(&Surface,0,0,0);
gamedisplay.BackSurface.AddSurface(&Surfacefinal,0,0,0);
gamedisplay.ShowSurface();
Sleep(1); //这里想不明白,为什么要加Sleep才能运行流畅
}
}
}
|
|