非常漂亮的新年祝福!C语言实现漂亮的烟花效果
本文实例为大家分享了C语言实现漂亮的烟花效果展示的具体代码,供大家参考,具体内容如下
程序名称:祝福烟花,祝福朋友
编译环境:VC++6.0&&easyx(立冬版)
#include#include #include #include #include #include #include //使用该计时器必须包含的文件 #pragmacomment(lib,"Winmm.lib") /*****宏定义区******/ #defineNUM13//烟花种类数量宏定义 /*****结构定义区**********/ //烟花结构 structFIRE { intr;//当前爆炸半径 intmax_r;//爆炸中心距离边缘最大半径 intx,y;//爆炸中心在窗口的坐标 intcen_x,cen_y;//爆炸中心相对图片左上角的坐标 intwidth,height;//图片的宽高 intxy[240][240];//储存图片像素点 boolshow;//是否绽放 booldraw;//开始输出像素点 DWORDt1,t2,dt;//绽放速度 }Fire[NUM]; //烟花弹结构 structJET { intx,y;//喷射点坐标 inthx,hy;//最高点坐标------将赋值给FIRE里面的x,y intheight;//烟花高度 boolshoot;//是否可以发射 DWORDt1,t2,dt;//发射速度 IMAGEimg[2];//储存花弹一亮一暗图片 byten:1;//图片下标 }Jet[NUM]; //happybirthday艺术字结构 structHAPPY//储存HappyBirthday艺术字图片 { intx,y;//每个字的图片的左上角坐标 IMAGEimg;//储存单个字图片 staticintnum;//字母序号 }Happy[NUM]; intHAPPY::num=0; //For.2012の夭女结构 structWISH//滚动祝福图片结构 { intx,y;//图片左上角坐标 DWORDt1,t2,dt;//图片运动时间间隔 IMAGEimg;//储存图片 intdxy;//每次的移动量 bytedir:1;//限制两个滚动方向 }Wish; /****函数申明区****/ voidInit(int);//初始化烟花 voidLoad();//加载烟花图片 voidShoot();//发射烟花 voidChose(DWORD&);//筛选烟花 voidWishing();//滚动祝福 voidStyle(DWORD&);//发射样式 voidShow(DWORD*);//绽放烟花 //主函数 voidmain() { initgraph(1200,800); srand(time(0)); //播放背景音乐 mciSendString("open./fire/bk.mp3aliasbk",0,0,0); mciSendString("playbkrepeat",0,0,0); setfillstyle(0); setfont(36,0,"楷体"); setcolor(YELLOW); outtextxy(370,100,"yy滺滺__出厂....^_^"); DWORDt1=timeGetTime();//筛选烟花计时 DWORDst1=timeGetTime();//播放花样计时 DWORD*pMem=GetImageBuffer();//获取窗口显存指针 for(inti=0;i 100) { intn=rand()%20; if(n<13&&Jet[n].shoot==false&&Fire[n].show==false) { /****重置烟花弹,预备发射*****/ Jet[n].x=rand()%1200; Jet[n].y=rand()%100+600; Jet[n].hx=Jet[n].x; Jet[n].hy=rand()%400; Jet[n].height=Jet[n].y-Jet[n].hy; Jet[n].shoot=true; putimage(Jet[n].x,Jet[n].y,&Jet[n].img[Jet[n].n],SRCINVERT); /****播放每个烟花弹的声音*****/ charc1[50],c2[30],c3[30]; sprintf(c1,"open./fire/shoot.mp3aliass%d",n); sprintf(c2,"plays%d",n); sprintf(c3,"closen%d",n); mciSendString(c3,0,0,0); mciSendString(c1,0,0,0); mciSendString(c2,0,0,0); } t1=t2; } } //扫描烟花弹并发射 voidShoot() { for(inti=0;i<13;i++) { Jet[i].t2=timeGetTime(); if(Jet[i].t2-Jet[i].t1>Jet[i].dt&&Jet[i].shoot==true) { /****烟花弹的上升*****/ putimage(Jet[i].x,Jet[i].y,&Jet[i].img[Jet[i].n],SRCINVERT); if(Jet[i].y>Jet[i].hy) { Jet[i].n++; Jet[i].y-=5; } putimage(Jet[i].x,Jet[i].y,&Jet[i].img[Jet[i].n],SRCINVERT); /****上升到高度的3/4,减速*****/ if((Jet[i].y-Jet[i].hy)*4 12) HAPPY::num=0; } Jet[i].t1=Jet[i].t2; } } } //制作水平、竖直移动的图片 voidWishing() { Wish.t2=timeGetTime(); if(Wish.t2-Wish.t1>Wish.dt) { /****图片的移动*****/ putimage(Wish.x,Wish.y,&Wish.img,SRCINVERT); if(Wish.dir==0) Wish.x+=Wish.dxy; else Wish.y-=Wish.dxy; putimage(Wish.x,Wish.y,&Wish.img,SRCINVERT); /****图片出界后*****/ if(Wish.x>1200||Wish.y<0) { Wish.dir=rand()%2;//获取随机方向 if(Wish.dir==0)//如果左右运动 { Wish.y=rand()%700;//初始位置 Wish.x=-490; Wish.dxy=rand()%7+1;//随机运动分量 } else//上下运动 { Wish.dxy=rand()%7+1; Wish.x=rand()%700; Wish.y=800; } } Wish.t1=Wish.t2; } } //显示花样 voidStyle(DWORD&st1) { DWORDst2=timeGetTime(); if(st2-st1>266000)//一首歌的时间 { //心形坐标 intx[13]={60,75,91,100,95,75,60,45,25,15,25,41,60}; inty[13]={65,53,40,22,5,4,20,4,5,22,40,53,65}; for(inti=0;i Fire[i].dt&&Fire[i].show==true) { if(Fire[i].r =Fire[i].max_r-1) { Fire[i].draw=false; Init(i); } Fire[i].t1=Fire[i].t2; } //如果该号炮花可爆炸,根据当前爆炸半径画烟花,颜色值接近黑色的不输出。 if(Fire[i].draw) { for(doublea=0;a<=6.28;a+=0.01) { intx1=(int)(Fire[i].cen_x+Fire[i].r*cos(a));//相对于图片左上角的坐标 inty1=(int)(Fire[i].cen_y-Fire[i].r*sin(a)); if(x1>0&&x1 0&&y1 >8)&0xff; intr=(Fire[i].xy[x1][y1]>>16); //烟花像素点在窗口上的坐标 intxx=(int)(Fire[i].x+Fire[i].r*cos(a)); intyy=(int)(Fire[i].y-Fire[i].r*sin(a)); //较暗的像素点不输出、防止越界 if(r>0x20&&g>0x20&&b>0x20&&xx>0&&xx<1200&&yy>0&&yy<800) pMem[yy*1200+xx]=BGR(Fire[i].xy[x1][y1]);//显存操作绘制烟花 } } Fire[i].draw=false; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。