C语言实现水波纹效果
本文实例为大家分享了C语言实现水波纹效果的具体代码,供大家参考,具体内容如下
#include#include #include #definePIC_HEIGHT600 #definePIC_WIDTH800 voidFrameFun();//帧逻辑函数,处理每一帧的逻辑 voidRenderFun();//帧渲染函数,输出每一帧到显示设备 IMAGEsrc_img;//原位图 IMAGEdest_img(PIC_WIDTH,PIC_HEIGHT);//处理后显示的位图 DWORD*img_ptr1;//原图片片内存指针 DWORD*img_ptr2;//处理后显示的位图内存指针 //以下两个buf为每一个点的波幅,前者为当前波幅,后者为下一个时刻的波幅。 short*buf=newshort[PIC_HEIGHT*PIC_WIDTH+PIC_WIDTH]; short*buf2=newshort[PIC_HEIGHT*PIC_WIDTH+PIC_WIDTH]; voidmain() { //初始化设备,加载图片 initgraph(PIC_WIDTH,PIC_HEIGHT); SetWindowText(GetHWnd(),"Wave-水波纹效果(点击产生一个水波纹。移动鼠标连续产生水波纹)"); loadimage(&src_img,"water.jpg");//加载图片,大小:800*600 setbkmode(TRANSPARENT); settextcolor(BLACK); setfont(25,0,"Arial"); //获得内存指针 img_ptr1=GetImageBuffer(&src_img); img_ptr2=GetImageBuffer(&dest_img); //初始化波幅数组 memset(buf,0,(PIC_HEIGHT*PIC_WIDTH+PIC_WIDTH)*sizeof(short)); memset(buf2,0,(PIC_HEIGHT*PIC_WIDTH+PIC_WIDTH)*sizeof(short)); //Let'sGo! BeginBatchDraw();//双缓冲,闪屏时需要 while(true) { FrameFun(); RenderFun(); FlushBatchDraw(); Sleep(1); } EndBatchDraw(); } //计算出下一个时刻所有点的波幅 voidnextFrame() { for(inti=PIC_WIDTH;i >1)-buf2[i]; //波能衰减 buf2[i]-=buf2[i]>>5; } short*ptmp=buf; buf=buf2; buf2=ptmp; } //处理当前时刻波幅影响之后的位图,保存在dest_img中 voidRenderRipple() { inti=0; for(inty=0;y =PIC_WIDTH)a=PIC_WIDTH-1; if(a<0)a=0; if(b>=PIC_HEIGHT)b=PIC_HEIGHT-1; if(b<0)b=0; //处理偏移 img_ptr2[i]=img_ptr1[a+(b*PIC_WIDTH)]; i++; } } } //鼠标模拟投石头 //参数说明: //(x,y):鼠标坐标 //stonesize:“石头”的大小 //stoneweight:投“石头”的力度 //Ps:如果产生错误,一般就是数组越界所致,请酌情调整“石头”的大小和“石头”的力度 voiddisturb(intx,inty,intstonesize,intstoneweight) { //突破边界不处理 if((x>=PIC_WIDTH-stonesize)|| (x =PIC_HEIGHT-stonesize)|| (y FPS_COUNT) { i=0; intnewTime=GetTickCount(); intelapsedTime=newTime-oldTime; fps=FPS_COUNT/(elapsedTime/1000.0f); oldTime=newTime; } i++; returnfps; } //渲染 voidRenderFun() { RenderRipple(); putimage(0,0,&dest_img); chars[5]; sprintf(s,"%.1f",getFps()); outtextxy(0,0,s); } //逻辑 voidFrameFun() { //鼠标 if(MouseHit()) { MOUSEMSGmsg=GetMouseMsg(); if(msg.uMsg==WM_MOUSEMOVE) { disturb(msg.x,msg.y,3,256); } elseif(msg.uMsg==WM_LBUTTONDOWN) { disturb(msg.x,msg.y,3,2560); } FlushMouseMsgBuffer(); } //计算下一帧的波幅 nextFrame(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。