非常美丽的新年祝福!本文主要介绍了用C语言实现美丽的焰火效果。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
本文分享了C语言实现绚丽烟花展示的具体代码,供大家参考。具体内容如下
节目名称:祝福烟花,祝福朋友
编译环境:VC 6.0 easyx(立冬版)
#包含图形. h
#包含conio.h
#包含iostream.h
#包含数学. h
#包含时间. h
#包含stdio.h
# includes mmsystem . h//使用此计时器时必须包含的文件
#pragma注释(lib,' Winmm.lib ')
/* * * * * *宏定义区域* * * * */
#define NUM 13 //烟花类别和数量的宏定义
/* * * * * *结构定义区* * * * * * * */
//烟花结构
结构火灾
{
int r;//当前爆炸半径
int max _ r;//爆炸中心距离边缘的最大半径
int x,y;//窗口中爆炸中心的坐标
int cen_x,cen _ y;//爆炸中心相对于图片左上角的坐标
int宽度,高度;//图片的宽度和高度
int xy[240][240];//存储图片像素
布尔秀;//开花还是不开花?
布尔平局;//开始输出像素。
DWORD t1,t2,dt;//开花速度
} Fire[NUM];
//烟火炸弹结构
结构喷射
{
int x,y;//注入点的坐标
int hx,hy;//最高点的坐标-将被赋给x,y在火
int高度;//烟花高度
布尔射;//能传播吗?
DWORD t1,t2,dt;//启动速度
图像img[2];//保存一张花弹的明暗图。
字节n:1;//图像下标
} Jet[NUM];
//生日快乐艺术字结构
Struct HAPPY //保存生日快乐艺术字图片
{
int x,y;//每个单词的图片左上角的坐标
图像img//保存单字图片
静态整数;//字母顺序号
}快乐[NUM];
int HAPPY:num=0;
//针对. 2012结构的死亡少女
Struct WISH //滚动祝福的画面结构
{
int x,y;//图片左上角的坐标
DWORD t1,t2,dt;//图片移动时间间隔
图像img//保存图片
int dxy//每次的移动量
字节目录:1;//限制两个滚动方向
}愿望;
/* * * *函数声明区* * */
void Init(int);//初始化fireworks
空载荷();//加载烟花图片
void shot();//发射烟花
void choosed(DWORD);//放映烟花
虚空许愿();//滚动祝福
void样式(DWORD);//发射样式
void显示(DWORD *);//烟花绽放
//主函数
void main()
{
initgraph( 1200,800);
srand(time(0));
//播放背景音乐
mciSendString( 'open。/fire/bk.mp3别名bk ',0,0,0);
mciSendString('播放bk重复',0,0,0);
setfillstyle(0);
Setfont (36,0,'斜体');
setcolor(黄色);
Outtextxy (370,100,' yy _ _出厂._');
DWORD t1=time gettime();//过滤焰火计时
DWORD st1=time gettime();//播放模式计时
DWORD * pMem=GetImageBuffer();//获取窗口内存指针
for(int I=0;i NUMI) //初始化fireworks
{
init(I);
}
load();//将烟花图片信息加载到相应的结构中
BeginBatchDraw();//开始批量绘图
而(!kbhit())
{
睡眠(10);
//随机选择4000个像素擦除
for(int clr=0;clr 1000clr)
{
for(int j=0;J2;j)
{
int px1=rand()% 1200;
int py1=rand()% 800;
If (py1 799) //阻止跨越边界
pMem[py1 * 1200 px1]=pMem[py1 * 1200 px1 1]=黑色;//通过给视频内存赋值来擦除像素。
}
}
选择了(t1);//放映烟花
shoot();//发射烟花
显示(pMem);//烟花绽放
许愿();//滚动字符
风格(st1);//模式启动
FlushBatchDraw();//显示所有以前的绘图操作
}
}
//初始化fireworks参数
void Init( int i)
{
//分别是:烟花中心到图片边缘的最远距离和烟花中心到图片左上角的距离(x,y)。
int r[13]={ 120,120,155,123,130,147,138,138,130,135,140,132,155 };
int x[13]={ 120,120,110,117,110,93,102,102,110,105,100,108,110 };
int y[13]={ 120,120,85,118,120,103,105,110,110,120,120,104,85 };
/* * * *初始化fireworks * * * */
火[我]。x=0;//烟花中心坐标
火[我]。y=0;
火[我]。宽度=240;//图片宽
火[我]。身高=240;//图片高
火[我]。max _ r=r[I];//最大半径
火[我]。cen _ x=x[I];//中心距左上角距离
火[我]。cen _ y=y[I];
火[我]。show=false//是否绽放
火[我]。dt=5;//绽放时间间隔
火[我]。t1=time gettime();
火[我]。r=0;//从0 开始绽放
/**** 初始化烟花弹*****/
喷气机[i].x=-240;//烟花弹左上角坐标
喷气机[i].y=-240;
喷气机[i].hx=-240;//烟花弹发射最高点坐标
喷气机[i].hy=-240;
喷气机[i].高度=0;//发射高度
jet[I]。t1=time gettime();
喷气机[i].dt=rand()% 10;//发射速度时间间隔
喷气机[i].n=0;//烟花弹闪烁图片下标
喷气机[i].射=假;//是否发射
}
//加载图片
无效载荷()
{
/**** 储存烟花的像素点颜色****/
图像fm,GM;
loadimage( fm ./fire/flower.jpg ',3120,240);
for(int I=0;i 13我)
{
SetWorkingImage(FM);
getimage( gm,i * 240,0,240,240);
SetWorkingImage(GM);
for(int a=0;一个240;答
for(int b=0;b 240b)
火[我]。xy[a][b]=getpixel( a,b);
}
/**** 加载烟花弹************/
形象sm;
loadimage( sm,' 1 ./fire/shoot.jpg ',200,50);
for(I=0;i 13我)
{
SetWorkingImage(sm);
int n=rand()% 5;
getimage( Jet[i].img[0],n * 20,0,20,50);//暗
getimage( Jet[i].img[1],(^北部5)* 20,0,20,50);//亮
}
/***** 加载生日快乐图片********/
图像hm;
loadimage(嗯./fire/happy.jpg ',689,115);
SetWorkingImage(hm);
for(I=0;i 13我)
{
快乐[我]。x=i * 90
快乐[我]。y=rand()% 100 500;
getimage( Happy[i].img,i * 53,0,53,115);
}
/***** 加载For.2012夭女图片*********/
愿望。x=0;
Wish.y=100
愿望。t1=time gettime();
Wish.dt=46
愿望。dir=0;
愿望。dxy=rand()% 8 1;
loadimage( Wish.img,' 0 ./fire/yaojing.jpg ',490,100);
putimage( Wish.x,Wish.y,Wish.img,src invert);
SetWorkingImage();//设置回绘图窗口
}
//在一定范围内筛选可发射的烟花,并初始化发射参数,输出烟花弹到屏幕,播放声音
无效选择(双字t1)
{
T2=time gettime();
中频(t2 - t1 100)
{
int n=rand()% 20;
if ( n 13 Jet[n].射击==假火. show==false)
{
/**** 重置烟花弹,预备发射*****/
喷气机,喷气机x=rand()% 1200;
喷气机,喷气机y=rand()% 100 600;
喷气机,喷气机hx=Jet[n]。x;
喷气机,喷气机100 . hy=rand()% 400;
喷气机,喷气机。高度=喷射[n]的缩写.y型喷气发动机. hy;
喷气机,喷气机。射=真;
putimage( Jet[n].x,Jet[n].y,Jet[n].喷射,喷射n],SRCINVERT);
/**** 播放每个烟花弹的声音*****/
char c1[50],c2[30],C3[30];
sprintf( c1,打开. fire/shoot.mp3别名s%d ',n);
sprintf( c2,播放s%d ',n);
sprintf( c3,' close n%d ',n);
mciSendString( c3,0,0,0);
mciSendString( c1,0,0,0);
mciSendString( c2,0,0,0);
}
t1=t2
}
}
//扫描烟花弹并发射
无效拍摄()
{
for(int I=0;i 13我)
{
jet[I]。T2=time gettime();
if ( Jet[i].t2 - Jet[i].t1 Jet[i].dt喷气机[i].拍==真)
{
/**** 烟花弹的上升*****/
putimage( Jet[i].x,Jet[i].y,Jet[i].喷气发动机,喷气发动机.n],SRCINVERT);
if ( Jet[i].y Jet[i].hy)
{
喷气机[i].n;
喷气机[i].y-=5;
}
putimage( Jet[i].x,Jet[i].y,Jet[i].喷气发动机,喷气发动机.n],SRCINVERT);
/**** 上升到高度的3/4,减速*****/
如果((Jet[i])。y - Jet[i].hy) * 4 Jet[i].高度)
喷气机[i].dt=rand()% 4 10;
/**** 上升到最大高度*****/
if ( Jet[i].y=Jet[i].hy)
{
//播放爆炸声
char c1[50],c2[30],C3[30];
sprintf( c1,打开火/炸弹别名n%d ',I);
sprintf( c2,播放n%d ',I);
sprintf( c3,' close s%d ',I);
mciSendString( c3,0,0,0);
mciSendString( c1,0,0,0);
mciSendString( c2,0,0,0);
putimage( Jet[i].x,Jet[i].y,Jet[i].喷气发动机,喷气发动机.n],SRCINVERT);//擦掉烟花弹
火[我]。x=Jet[i].hx 10//在烟花弹中间爆炸
火[我]。y=Jet[i].hy;//在最高点绽放
火[我]。show=true//开始绽放
喷气机[i].射=假;//停止发射
//显示对应字母
putimage( Happy[HAPPY:num].x,快乐[开心:num].y,快乐[HAPPY:num].img,src invert);
开心*数量
if ( HAPPY:num 12)
HAPPY:num=0;
}
Jet[I]。t1=Jet[I]。T2;
}
}
}
//制作水平、竖直移动的图片
虚空许愿()
{
愿望。T2=time gettime();
if ( Wish.t2 - Wish.t1 Wish.dt)
{
/**** 图片的移动*****/
putimage( Wish.x,Wish.y,Wish.img,src invert);
if ( Wish.dir==0)
愿望。x=愿望。dxy
其他
愿望。y-=愿望。dxy
putimage( Wish.x,Wish.y,Wish.img,src invert);
/**** 图片出界后*****/
if ( Wish.x 1200 || Wish.y 0)
{
愿望。dir=rand()% 2;//获取随机方向
if ( Wish.dir==0 ) //如果左右运动
{
愿望。y=rand()% 700;//初始位置
愿望。x=-490;
愿望。dxy=rand()% 7 1;//随机运动分量
}
else //上下运动
{
愿望。dxy=rand()% 7 1;
愿望。x=rand()% 700;
Wish.y=800
}
}
愿望。t1=愿望。T2;
}
}
//显示花样
空心样式(双字st1)
{
DWORD st2=time gettime();
if ( st2 - st1 266000 ) //一首歌的时间
{
//心形坐标
int x[13]={ 60,75,91,100,95,75,60,45,25,15,25,41,60 };
int y[13]={ 65,53,40,22,5,4,20,4,5,22,40,53,65 };
for(int I=0;我编号我)
{
清除设备();
/**** 规律分布烟花弹***/
喷气机[i].x=x[I]* 10;
喷气机[i].y=(y[I]75)* 10;
喷气机[i].hx=Jet[i].x;
喷气机[i].hy=y[I]* 10;
喷气机[i].高度喷气机[i].y - Jet[i].hy;
喷气机[i].射=真;
喷气机[i].dt=7;
putimage( Jet[i].x,Jet[i].y,Jet[i].喷气发动机,喷气发动机.n],SRCINVERT);//显示烟花弹
/**** 设置烟花参数***/
火[我]。x=Jet[i].x 10
火[我]。y=Jet[i].hy;
火[我]。show=false
火[我]。r=0;
/**** 播放发射声音***/
char c1[50],c2[30],C3[30];
sprintf( c1,打开. fire/shoot.mp3别名s%d ',I);
sprintf( c2,玩s%d ',I);
sprintf( c3,' close n%d ',I);
mciSendString( c3,0,0,0);
mciSendString( c1,0,0,0);
mciSendString( c2,0,0,0);
}
st1=st2
}
}
//绽放烟花
空显示(双字* pMem)
{
//烟花个阶段绽放时间间隔,制作变速绽放效果
int drt[16]={ 5,5,5,6,25,25,25,55,55,55,55,55,55,55 };
for(int I=0;我编号我)
{
火[我]。T2=time gettime();
//增加爆炸半径,绽放烟花,增加时间间隔做变速效果
如果(火[i].t2 -火[i].t1火【我】。震颤性精神错乱(Delirium Tremens的缩写)火[我]。show==true)
{
如果(火[我]。r火[我].max_r)
{
火[我]。r;
火[我]。dt=drt[Fire[i].r/10];
火[我]。draw=true
}
如果(火[我]。r=Fire[i].max_r - 1)
{
火[我]。draw=false
init(I);
}
火[我]。t1=Fire[I]。T2;
}
//如果该号炮花可爆炸,根据当前爆炸半径画烟花,颜色值接近黑色的不输出。
如果(火[我]。绘制)
{
对于(双a=0;a=6.28a=0.01)
{
int x1=(int)( Fire[i]).cen_x火[我].r * cos(a));//相对于图片左上角的坐标
int y1=(int)( Fire[i]).中心火[i].r * sin(a));
if ( x1 0 x1 Fire[i].宽度y1 0 y1火[我].高度)//只输出图片内的像素点
{
int b=Fire[i].xy[x1][y1]0x ff;
int g=( Fire[i]).xy[x1][y1]8)0x ff;
int r=( Fire[i]).xy[x1][y1]16);
//烟花像素点在窗口上的坐标
int xx=(int)( Fire[i]).x火[我]。r * cos(a));
int yy=(int)( Fire[i]).y - Fire[i].r * sin(a));
//较暗的像素点不输出、防止越界
如果(r0x 20g0x 20b0x 20 xx 0 xx 1200 YY 0 YY 800)
pMem[yy * 1200 xx]=BGR(火【我】。xy[x1][y1]);//显存操作绘制烟花
}
}
火[我]。draw=false
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。