上位机MFC水波特效算法源代码
界面 运行效果如上图。
显示的是下雨的效果。
还有其他效果,可以在工具栏选择查看。
关键代码
- //*******************************************************
- //根据波能数据缓冲区对离屏页面进行渲染
- //*******************************************************
- void RenderRipple()
- {
- //锁定两个离屏页面
- DDSURFACEDESC ddsd1, ddsd2;
- ddsd1.dwSize = sizeof (DDSURFACEDESC);
- ddsd2.dwSize = sizeof(DDSURFACEDESC);
- lpDDSPic1->Lock(NULL, &ddsd1, DDLOCK_WAIT, NULL);
- lpDDSPic2->Lock(NULL, &ddsd2, DDLOCK_WAIT, NULL);
- //取得页面象素位深度,和页面内存指针
- int depth=ddsd1.ddpfPixelFormat.dwRGBBitCount/8;
- BYTE *Bitmap1 = (BYTE*)ddsd1.lpSurface;
- BYTE *Bitmap2 = (BYTE*)ddsd2.lpSurface;
-
- //下面进行页面渲染
- int xoff, yoff;
- int k = BACKWIDTH;
- for (int i=1; i<BACKHEIGHT-1; i++)
- {
- for (int j=0; j<BACKWIDTH; j++)
- {
- //计算偏移量
- xoff = buf1[k-1]-buf1[k+1];
- yoff = buf1[k-BACKWIDTH]-buf1[k+BACKWIDTH];
- //判断坐标是否在窗口范围内
- if ((i+yoff )< 0 ) {k++; continue;}
- if ((i+yoff )> BACKHEIGHT) {k++; continue;}
- if ((j+xoff )< 0 ) {k++; continue;}
- if ((j+xoff )> BACKWIDTH ) {k++; continue;}
- //计算出偏移象素和原始象素的内存地址偏移量
- int pos1, pos2;
- pos1=ddsd1.lPitch*(i+yoff)+ depth*(j+xoff);
- pos2=ddsd2.lPitch*i+ depth*j;
- //复制象素
- for (int d=0; d<depth; d++)
- Bitmap2[pos2++]=Bitmap1[pos1++];
- k++;
- }
- }
- //解锁页面
- lpDDSPic1->Unlock(&ddsd1);
- lpDDSPic2->Unlock(&ddsd2);
- }
- //********************************************************
- //更新屏幕
- //********************************************************
- void UpdateFrame( void )
- {
- //随机增加波源
- if (rain==TRUE)
- DropStone(
- (int)(BACKWIDTH*((short)rand()/32767.0)),
- (int)(BACKHEIGHT*((short)rand()/32767.0)),
- 3,
- 128
- );
- if (downripper==TRUE)
- DropStone(
- (int)(BACKWIDTH*((short)rand()/32767.0)),
- BACKHEIGHT-3,
- 3,
- 128
- );
- if (upripper==TRUE)
- DropStone(
- (int)(BACKWIDTH*((short)rand()/32767.0)),
- 3,
- 3,
- 128
- );
- RippleSpread();//计算波能数据缓冲区
- RenderRipple();//页面渲染
- //将离屏页面图象Blit到主页面
- RECT Window;
- POINT pt;
- GetClientRect(ChooseWnd(), &Window);
- pt.x=pt.y=0;
- ClientToScreen(ChooseWnd(), &pt);
- OffsetRect(&Window, pt.x, pt.y);
- lpDDSPrimary->Blt(&Window, lpDDSPic2, NULL, DDBLT_WAIT, NULL);
- }
- void MakeRect(RECT *rect, short left, short top, short width, short height)
- {
- rect->left=left;
- rect->top=top;
- rect->right=left+width;
- rect->bottom=top+height;
- }
- //*****************************************************
- //增加波源
- //*****************************************************
- void DropStone(int x,//x坐标
- int y,//y坐标
- int stonesize,//波源半径
- int stoneweight)//波源能量
- {
- //判断坐标是否在屏幕范围内
- if ((x+stonesize)>BACKWIDTH ||
- (y+stonesize)>BACKHEIGHT||
- (x-stonesize)<0||
- (y-stonesize)<0)
- return;
- for (int posx=x-stonesize; posx<x+stonesize; posx++)
- for (int posy=y-stonesize; posy<y+stonesize; posy++)
- if ((posx-x)*(posx-x) + (posy-y)*(posy-y) < stonesize*stonesize)
- buf1[BACKWIDTH*posy+posx] = -stoneweight;
- }
复制代码 源代码下载地址:
上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例 经历1年的编程与录制点击进入查看
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|