QQ登录

只需一步,快速开始

上位机MFC水波特效算法源代码

[ 复制链接 ]

上位机MFC水波特效算法源代码

上位机MFC水波特效算法源代码

界面 运行效果如上图。
显示的是下雨的效果。
还有其他效果,可以在工具栏选择查看。
关键代码

  1. //*******************************************************
  2. //根据波能数据缓冲区对离屏页面进行渲染
  3. //*******************************************************
  4. void RenderRipple()
  5. {
  6.         //锁定两个离屏页面
  7.         DDSURFACEDESC ddsd1, ddsd2;
  8.         ddsd1.dwSize = sizeof (DDSURFACEDESC);
  9.         ddsd2.dwSize = sizeof(DDSURFACEDESC);
  10.         lpDDSPic1->Lock(NULL, &ddsd1, DDLOCK_WAIT, NULL);
  11.         lpDDSPic2->Lock(NULL, &ddsd2, DDLOCK_WAIT, NULL);

  12.         //取得页面象素位深度,和页面内存指针
  13.         int depth=ddsd1.ddpfPixelFormat.dwRGBBitCount/8;
  14.         BYTE *Bitmap1 = (BYTE*)ddsd1.lpSurface;
  15.         BYTE *Bitmap2 = (BYTE*)ddsd2.lpSurface;
  16.        
  17.         //下面进行页面渲染
  18.         int xoff, yoff;
  19.         int k = BACKWIDTH;
  20.         for (int i=1; i<BACKHEIGHT-1; i++)
  21.         {
  22.                 for (int j=0; j<BACKWIDTH; j++)
  23.                 {
  24.                         //计算偏移量
  25.                         xoff = buf1[k-1]-buf1[k+1];
  26.                         yoff = buf1[k-BACKWIDTH]-buf1[k+BACKWIDTH];

  27.                         //判断坐标是否在窗口范围内
  28.                         if ((i+yoff )< 0 ) {k++; continue;}
  29.                         if ((i+yoff )> BACKHEIGHT) {k++; continue;}
  30.                         if ((j+xoff )< 0 ) {k++; continue;}
  31.                         if ((j+xoff )> BACKWIDTH ) {k++; continue;}

  32.                         //计算出偏移象素和原始象素的内存地址偏移量
  33.                         int pos1, pos2;
  34.                         pos1=ddsd1.lPitch*(i+yoff)+ depth*(j+xoff);
  35.                         pos2=ddsd2.lPitch*i+ depth*j;

  36.                         //复制象素
  37.                         for (int d=0; d<depth; d++)
  38.                                 Bitmap2[pos2++]=Bitmap1[pos1++];
  39.                         k++;
  40.                 }
  41.         }
  42.         //解锁页面
  43.         lpDDSPic1->Unlock(&ddsd1);
  44.         lpDDSPic2->Unlock(&ddsd2);
  45. }

  46. //********************************************************
  47. //更新屏幕
  48. //********************************************************
  49. void UpdateFrame( void )
  50. {
  51.         //随机增加波源
  52.         if (rain==TRUE)
  53.         DropStone(
  54.                         (int)(BACKWIDTH*((short)rand()/32767.0)),
  55.                         (int)(BACKHEIGHT*((short)rand()/32767.0)),
  56.                         3,
  57.                         128
  58.                         );
  59.         if (downripper==TRUE)
  60.         DropStone(
  61.                         (int)(BACKWIDTH*((short)rand()/32767.0)),
  62.                         BACKHEIGHT-3,
  63.                         3,
  64.                         128
  65.                         );
  66.         if (upripper==TRUE)
  67.         DropStone(
  68.                         (int)(BACKWIDTH*((short)rand()/32767.0)),
  69.                         3,
  70.                         3,
  71.                         128
  72.                         );

  73.         RippleSpread();//计算波能数据缓冲区
  74.         RenderRipple();//页面渲染

  75.         //将离屏页面图象Blit到主页面
  76.         RECT Window;
  77.         POINT pt;
  78.         GetClientRect(ChooseWnd(), &Window);
  79.         pt.x=pt.y=0;
  80.         ClientToScreen(ChooseWnd(), &pt);
  81.         OffsetRect(&Window, pt.x, pt.y);
  82.         lpDDSPrimary->Blt(&Window, lpDDSPic2, NULL, DDBLT_WAIT, NULL);
  83. }

  84. void MakeRect(RECT *rect, short left, short top, short width, short height)
  85. {
  86.         rect->left=left;
  87.         rect->top=top;
  88.         rect->right=left+width;
  89.         rect->bottom=top+height;
  90. }

  91. //*****************************************************
  92. //增加波源
  93. //*****************************************************
  94. void DropStone(int x,//x坐标
  95.                            int y,//y坐标
  96.                            int stonesize,//波源半径
  97.                            int stoneweight)//波源能量
  98. {
  99.         //判断坐标是否在屏幕范围内
  100.         if ((x+stonesize)>BACKWIDTH ||
  101.                 (y+stonesize)>BACKHEIGHT||
  102.                 (x-stonesize)<0||
  103.                 (y-stonesize)<0)
  104.                 return;

  105.         for (int posx=x-stonesize; posx<x+stonesize; posx++)
  106.                 for (int posy=y-stonesize; posy<y+stonesize; posy++)
  107.                         if ((posx-x)*(posx-x) + (posy-y)*(posy-y) < stonesize*stonesize)
  108.                                 buf1[BACKWIDTH*posy+posx] = -stoneweight;
  109. }
复制代码
源代码下载地址:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:上位机MFC水波特效算法源代码.rar 
文件大小:128.25 KB  售价:1金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例

  

经历1年的编程与录制点击进入查看


  

halcon从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  


回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索