怎么用C语言给喜欢的人写烟花
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"怎么用C语言给喜欢的人写烟花",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用C语言给喜欢的人写烟花"吧!一、结构体首先当然是我们的老
千家信息网最后更新 2026年11月02日怎么用C语言给喜欢的人写烟花
本篇内容主要讲解"怎么用C语言给喜欢的人写烟花",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用C语言给喜欢的人写烟花"吧!
一、结构体
首先当然是我们的老朋友结构体,其中艺术字结构体不用我多说,该写什么内容自己应该知道哈
// 烟花结构struct FIRE{ int r; // 当前爆炸半径 int max_r; // 爆炸中心距离边缘最大半径 int x, y; // 爆炸中心在窗口的坐标 int cen_x, cen_y; // 爆炸中心相对图片左上角的坐标 int width, height; // 图片的宽高 int xy[240][240]; // 储存图片像素点 bool show; // 是否绽放 bool draw; // 开始输出像素点 DWORD t1, t2, dt; // 绽放速度}Fire[NUM]; // 烟花弹结构struct JET{ int x, y; // 喷射点坐标 int hx, hy; // 最高点坐标------将赋值给 FIRE 里面的 x, y int height; // 烟花高度 bool shoot; // 是否可以发射 DWORD t1, t2, dt; // 发射速度 IMAGE img[2]; // 储存花弹一亮一暗图片 byte n : 1; // 图片下标}Jet[NUM]; // happy birthday 艺术字结构struct HAPPY // 储存 Happy Birthday 艺术字图片{ int x, y; // 每个字的图片的左上角坐标 IMAGE img; // 储存单个字图片 static int num; // 字母序号}Happy[NUM];二、初始化
初始化烟花参数,把一切准备工作完成好
// 初始化烟花参数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 }; /**** 初始化烟花 *****/ Fire[i].x = 0; // 烟花中心坐标 Fire[i].y = 0; Fire[i].width = 240; // 图片宽 Fire[i].height = 240; // 图片高 Fire[i].max_r = r[i]; // 最大半径 Fire[i].cen_x = x[i]; // 中心距左上角距离 Fire[i].cen_y = y[i]; Fire[i].show = false; // 是否绽放 Fire[i].dt = 5; // 绽放时间间隔 Fire[i].t1 = timeGetTime(); Fire[i].r = 0; // 从 0 开始绽放 /**** 初始化烟花弹 *****/ Jet[i].x = -240; // 烟花弹左上角坐标 Jet[i].y = -240; Jet[i].hx = -240; // 烟花弹发射最高点坐标 Jet[i].hy = -240; Jet[i].height = 0; // 发射高度 Jet[i].t1 = timeGetTime(); Jet[i].dt = rand() % 10; // 发射速度时间间隔 Jet[i].n = 0; // 烟花弹闪烁图片下标 Jet[i].shoot = false; // 是否发射}三、烟花加载函数
加载图片,储存烟花的像素点颜色
// 加载图片void Load(){/**** 储存烟花的像素点颜色 ****/ IMAGE fm, gm; loadimage( &fm, "./fire/flower.jpg", 3120, 240 ); for ( int i = 0; i < 13; i++ ) { SetWorkingImage( &fm ); getimage( &gm, i * 240, 0, 240, 240 ); SetWorkingImage( &gm ); for ( int a = 0; a < 240; a++ ) for ( int b = 0; b < 240; b++ ) Fire[i].xy[a][b] = getpixel( a, b ); } IMAGE sm; loadimage( &sm, "./fire/shoot.jpg", 200, 50 ); for ( i = 0; i < 13; i++ ) { SetWorkingImage( &sm ); int n = rand() % 5; getimage( &Jet[i].img[0], n * 20, 0, 20, 50 ); getimage( &Jet[i].img[1], (n + 5) * 20, 0, 20, 50 ); } IMAGE hm; loadimage( &hm, "./fire/happy.jpg", 689, 115 ); SetWorkingImage( &hm ); for ( i = 0; i < 13; i++ ) { Happy[i].x = i * 90; Happy[i].y = rand() % 100 + 500; getimage( &Happy[i].img, i * 53, 0, 53, 115 ); } Wish.x = 0; Wish.y = 100; Wish.t1 = timeGetTime(); Wish.dt = 46; Wish.dir = 0; Wish.dxy = rand() % 8 + 1; loadimage( &Wish.img, "./fire/yaojing.jpg", 490, 100 ); putimage( Wish.x, Wish.y, &Wish.img, SRCINVERT ); SetWorkingImage();}四、烟花发射函数
扫描烟花弹并发射,控制开始与停止发射
// 扫描烟花弹并发射void Shoot(){ for ( int i = 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 < Jet[i].height ) Jet[i].dt = rand() % 4 + 10 ; /**** 上升到最大高度 *****/ if ( Jet[i].y <= Jet[i].hy ) { // 播放爆炸声 char c1[50], c2[30], c3[30]; sprintf( c1, "open ./fire/bomb.wav alias n%d", i ); sprintf( c2, "play 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].img[Jet[i].n], SRCINVERT ); // 擦掉烟花弹 Fire[i].x = Jet[i].hx + 10; // 在烟花弹中间爆炸 Fire[i].y = Jet[i].hy; // 在最高点绽放 Fire[i].show = true; // 开始绽放 Jet[i].shoot = false; // 停止发射 // 显示对应字母 putimage( Happy[HAPPY::num].x, Happy[HAPPY::num].y, &Happy[HAPPY::num].img, SRCINVERT ); HAPPY::num++; if ( HAPPY::num > 12 ) HAPPY::num = 0; } Jet[i].t1 = Jet[i].t2; } }}五、烟花显示函数
显示花样,如何让烟花变得更好看
// 显示花样void Style( DWORD& st1 ){ DWORD st2 = timeGetTime(); 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 < NUM; i++ ) { cleardevice(); /**** 规律分布烟花弹 ***/ Jet[i].x = x[i] * 10; Jet[i].y = ( y[i] + 75 ) * 10; Jet[i].hx = Jet[i].x; Jet[i].hy = y[i] * 10; Jet[i].height = Jet[i].y - Jet[i].hy; Jet[i].shoot = true; Jet[i].dt = 7; putimage( Jet[i].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT ); // 显示烟花弹 /**** 设置烟花参数 ***/ Fire[i].x = Jet[i].x + 10; Fire[i].y = Jet[i].hy; Fire[i].show = false; Fire[i].r = 0; /**** 播放发射声音 ***/ char c1[50], c2[30], c3[30]; sprintf( c1, "open ./fire/shoot.mp3 alias s%d", i ); sprintf( c2, "play 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; }}六、烟花绽放函数
绽放烟花,烟花个阶段绽放时间间隔,制作变速绽放效果等等,这里大家也可以自己去优化,去增加自己的东西
// 绽放烟花void Show( DWORD* pMem ){ // 烟花个阶段绽放时间间隔,制作变速绽放效果 int drt[16] = { 5, 5, 5, 5, 5, 6, 25, 25, 25, 25, 55, 55, 55, 55, 55 }; for ( int i = 0; i < NUM; i++ ) { Fire[i].t2 = timeGetTime(); // 增加爆炸半径,绽放烟花,增加时间间隔做变速效果 if ( Fire[i].t2 - Fire[i].t1 > Fire[i].dt && Fire[i].show == true ) { if ( Fire[i].r < Fire[i].max_r ) { Fire[i].r++; Fire[i].dt = drt[Fire[i].r / 10]; Fire[i].draw = 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 ( double a = 0; a <= 6.28; a += 0.01 ) { int x1 = (int)( Fire[i].cen_x + Fire[i].r * cos(a) ); // 相对于图片左上角的坐标 int y1 = (int)( Fire[i].cen_y - Fire[i].r * sin(a) ); if ( x1 > 0 && x1 < Fire[i].width && y1 > 0 && y1 < Fire[i].height ) // 只输出图片内的像素点 { int b = Fire[i].xy[x1][y1] & 0xff; int g = ( Fire[i].xy[x1][y1] >> 8 ) & 0xff; int r = ( Fire[i].xy[x1][y1] >> 16 ); // 烟花像素点在窗口上的坐标 int xx = (int)( Fire[i].x + Fire[i].r * cos(a) ); int yy = (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; } }}七、主函数
// 主函数void main(){ initgraph( 1200, 800 ); srand( time(0) ); // 播放背景音乐 mciSendString( "open ./fire/bk.mp3 alias bk", 0, 0, 0 ); mciSendString( "play bk repeat", 0, 0, 0 ); setfillstyle( 0 ); setfont ( 36, 0, "楷体" ); setcolor ( YELLOW ); outtextxy ( 370, 100, "yy滺滺__出厂 .... ^_^" ); DWORD t1 = timeGetTime(); // 筛选烟花计时 DWORD st1 = timeGetTime(); // 播放花样计时 DWORD* pMem = GetImageBuffer(); // 获取窗口显存指针 for ( int i = 0; i < NUM; i++ ) // 初始化烟花 { Init( i ); } Load(); // 将烟花图片信息加载进相应结构中 BeginBatchDraw(); // 开始批量绘图 while ( !kbhit() ) { Sleep( 10 ); // 随机选择 4000 个像素点擦除 for ( int clr = 0; clr < 1000; clr++ ) { for ( int j = 0; j < 2; j++ ) { int px1 = rand() % 1200; int py1 = rand() % 800; if ( py1 < 799 ) // 防止越界 pMem[py1 * 1200 + px1] = pMem[py1 * 1200 + px1 + 1] = BLACK; // 对显存赋值擦出像素点 } } Chose ( t1 ); // 筛选烟花 Shoot ( ); // 发射烟花 Show ( pMem ); // 绽放烟花 Wishing ( ); // 滚动字符 Style ( st1 ); // 花样发射 FlushBatchDraw( ); // 显示前面的所有绘图操作 }}到此,相信大家对"怎么用C语言给喜欢的人写烟花"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
烟花
图片
发射
坐标
烟花弹
像素
结构
函数
爆炸
左上角
时间
半径
花样
高度
语言
最大
内容
参数
显存
艺术
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网高科技
广东猪兼强互联网科技有限公司
新华互联网科技学院
盈实互联网科技
互联网 科技公司
上海喔噻互联网科技
万达互联网科技
深圳期待互联网科技
中国互联网金融科技基金
隆华科技工业互联网
互联网之后的科技是什么
互联网科技项目计划书材料类
昊天互联网科技有限公司
宜昌元轩互联网科技有限公司
浙南科技城互联网大厦建设工程
长沙茂晟互联网科技有限公司
互联网科技和医药行业
深圳互联网科技园地址
科技互联网专业务虚会材料
前海云享互联网科技
互联网加科技
互联网科技行业发展
互联网金融公司科技
苏州大垚互联网科技
互联网科技宣传片
成都互联网科技公司工作好不好
怎样加入科技互联网
全球科技与互联网公司市值变化
互联网科技手机排行榜
互联网科技创新创业项目