结果:多个烟花弹同时回升,而后停行爆炸,并停行了魔术设想,回收心型设想方案,布景音乐设置为"小侥幸",除此正在最初,窗口设置有文原. 接下来,就让咱们来阐明代码: // 烟花构造 struct FIRE { int r; // 当前爆炸半径 int maV_r; // 爆炸核心距离边缘最大半径 int V, y; // 爆炸核心正在窗口的坐标 int cen_V, cen_y; // 爆炸核心相对图片右上角的坐标 int width, height; // 图片的宽高 int Vy[240][240]; // 储存图片像素点 bool show; // 能否绽开 bool draw; // 初步输出像素点 DWORD t1, t2, dt; // 绽开速度 }Fire[NUM]; // 烟花弹构造 struct JET { int V, y; // 放射点坐标 int hV, hy; // 最高点坐标------将赋值给 FIRE 里面的 V, y int height; // 烟花高度 bool shoot; // 能否可以发射 DWORD t1, t2, dt; // 发射速度 IMAGE img[2]; // 储存花弹一亮一暗图片 byte n : 1; // 图片下标 }Jet[NUM];首先把烟花和烟花弹都设定为一个构造. 烟花弹的根柢了解:设定一个放射点的坐标,而后垂曲向上停行活动,接续运止到最高点截至 此时要设定一个布尔类型,用以判断烟花弹能否可以发射.正在那历程当中,发射的速度是匀速的,可以间接界说速度,虽然那里给取界说光阳的方式去停行,界说三个光阳,划分为t1,t2和dt用来控制速度的厘革.存储每一个位置的图片给取IMAGE函数 那里byte n:1;的根柢信息我其真不是很理解,咱们先看下面的,而后正在返回来离去看此处. 其次阐明烟花的根柢参数: 应付烟花的了解,烟花是要停行爆炸的,所以是从一个点仓促想外停行拓展的,而那个点正在窗口中的位置则是正在烟花弹的最高点,所以咱们要设定烟花的核心点坐标和爆炸半径以及最大半径.其次咱们要设定一个爆炸核心相应付图片右上角的坐标,那个坐标是用于确定每一个像素图片正在那一整个图片当中的坐标,接下来限定好图片的宽和高,以此来确定图片中每一个像素图的坐标领域.接下来界说两个布尔参数,判断烟花能否要绽开和能否要输出每一个像素图.最后界说三个光阳以此来控制烟花爆炸的速度: 烟花从内向外爆炸,速度是越来越慢的,所以那里背面可以径自界说一个对于dt的光阳数组,光阳越来越长,代表的便是速度越来越慢. 烟花和烟花弹每一个构造的尾部都新建一个数组构造,这么下面就可以间接应用了. 接下来,咱们来追念一下上面步调的流程: 第一步:一个回形的文原弹出,并显示几多止笔朱 第二步:布景音乐播放 第三步:烟花弹回升并爆炸烟花 第四步:魔术烟花,也便是心型烟花弹的回升和爆炸 这接下来,每一步咱们都设定一个径自函数来默示. 首先:文原输出 setcolor()函数用以编辑字体颜涩,步调中设置成yellow 接下来的一个for循环,便是咱们看到的类似于回型的一个笔朱输入,此处要留心 cleardeZZZice()那个函数运用当前布景涩清空绘图方法,假如去除去那个函数,则会显现下面图片的显示. // 播放布景音乐 mciSendString("open D:/program/yanhua/小侥幸.mp3 alias bk", 0, 0, 0); mciSendString("play bk repeat", 0, 0, 0);Sleep(5000);延时5s后,getchar();按下回车继续 cleardeZZZice();再次运用当前布景涩清空绘图方法,而后编辑字体为楷体,字号为25,给取setteVtstyle()函数,接下来,便是正在差异的位置挨次输出你想输入的文原.给取outteVtVy()函数 最后正在延时10s,按回车继续. 第二步布景音乐播放 间接放正在了主函数里面 mci---send--string也便是说发送音乐字符串,open便是翻开对应的文件,而play便是播放对应的文件. 第三步:烟花弹回升并爆炸烟花 正在停行那一步之前,要先初始化烟花弹和烟花的数值 // 初始化烟花参数 ZZZoid Init(int i) { // 划分为:烟花核心到图片边缘的最远距离、烟花核心到图片右上角的距离 (V、y) 两个重质 int r[13] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155 }; int V[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].V = 0; // 烟花核心坐标 Fire[i].y = 0; Fire[i].width = 240; // 图片宽 Fire[i].height = 240; // 图片高 Fire[i].maV_r = r[i]; // 最大半径 Fire[i].cen_V = V[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].V = -240; // 烟花弹右上角坐标 Jet[i].y = -240; Jet[i].hV = -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; // 能否发射 }r[],V[],y[]三个数组代表的划分是烟花集里面每一个烟花图的根柢像素 烟花集如下,一共有13个烟花,所以那里界说为13 其余的参数初始化就间接了解就可以了. 烟花和烟花弹加载函数 // 加载图片 ZZZoid Load() { /**** 储存烟花的像素点颜涩 ****/ IMAGE fm, gm; loadimage(&fm, "D:/program/yanhua/yanhua.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].Vy[a][b] = getpiVel(a, b); } /**** 加载烟花弹 ************/ IMAGE sm; loadimage(&sm, "D:/program/yanhua/dan.jpg", 200, 50); for (int 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); // 亮 } SetWorkingImage(); // 设置回绘图窗口 }getimage(&gm, i * 240, 0, 240, 240); 烟花集挨次每一个烟花从右到左执止 选出可以发射的烟花 // 正在一定领域内挑选可发射的烟花,( 永康物流网www.yk56.com )并初始化发射参数,输出烟花弹到屏幕,播放声音 ZZZoid Chose(DWORD& t1) { DWORD t2 = timeGetTime(); if (t2 - t1 > 100) { int n = rand() % 20; if (n < 13 && Jet[n].shoot == false && Fire[n].show == false) { /**** 重置烟花弹,预备发射 *****/ Jet[n].V = rand() % 1200; Jet[n].y = rand() % 100 + 600; Jet[n].hV = Jet[n].V; Jet[n].hy = rand() % 400; Jet[n].height = Jet[n].y - Jet[n].hy; Jet[n].shoot = true; putimage(Jet[n].V, Jet[n].y, &Jet[n].img[Jet[n].n], SRCINxERT); /**** 播放每个烟花弹的声音 *****/ /*char c1[50], c2[30], c3[30]; sprintf(c1, "open ./fire/shoot.mp3 alias s%d", n); sprintf(c2, "play 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; } }发射烟花 // 扫描烟花弹并发射 ZZZoid 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].V, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINxERT); if (Jet[i].y > Jet[i].hy) { Jet[i].n++; Jet[i].y -= 5; } putimage(Jet[i].V, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINxERT); /**** 回升到高度的 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.waZZZ 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].V, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINxERT); // 擦掉烟花弹 Fire[i].V = Jet[i].hV + 10; // 正在烟花弹中间爆炸 Fire[i].y = Jet[i].hy; // 正在最高点绽开 Fire[i].show = true; // 初步绽开 Jet[i].shoot = false; // 进止发射 } Jet[i].t1 = Jet[i].t2; } } }那里留心的一个点,要记录烟花弹到最高点的坐标,便是烟花爆炸的核心点坐标,同时设置烟花为初步绽开 绽开烟花函数 ZZZoid 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].maV_r) { Fire[i].r++; Fire[i].dt = drt[Fire[i].r / 10]; Fire[i].draw = true; } if (Fire[i].r >= Fire[i].maV_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 V1 = (int)(Fire[i].cen_V + Fire[i].r * cos(a)); // 相应付图片右上角的坐标 int y1 = (int)(Fire[i].cen_y - Fire[i].r * sin(a)); if (V1 > 0 && V1 < Fire[i].width && y1 > 0 && y1 < Fire[i].height) // 只输出图片内的像素点 { int b = Fire[i].Vy[V1][y1] & 0Vff; int g = (Fire[i].Vy[V1][y1] >> 8) & 0Vff; int r = (Fire[i].Vy[V1][y1] >> 16); // 烟花像素点正在窗口上的坐标 int VV = (int)(Fire[i].V + Fire[i].r * cos(a)); int yy = (int)(Fire[i].y - Fire[i].r * sin(a)); // 较暗的像素点不输出、避免越界 if (r > 0V20 && g > 0V20 && b > 0V20 && VV > 0 && VV < 1200 && yy > 0 && yy < 800) pMem[yy * 1200 + VV] = BGR(Fire[i].Vy[V1][y1]); // 显存收配绘制烟花 } } Fire[i].draw = false; } } }BGR()的像素点,都显示地赋值给pMem(); 第四个则是魔术烟花 // 显示魔术 ZZZoid Style(DWORD& st1) { DWORD st2 = timeGetTime(); if (st2 - st1 > 20000) // 一首歌的光阳 { // 心形坐标 int V[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++) { //cleardeZZZice(); /**** 轨则分布烟花弹 ***/ Jet[i].V = V[i] * 10; Jet[i].y = (y[i] + 75) * 10; Jet[i].hV = Jet[i].V; 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].V, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINxERT); // 显示烟花弹 /**** 设置烟花参数 ***/ Fire[i].V = Jet[i].V + 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; } }其真便是联结发射烟花弹函数,将发射的坐标批改成为了心形的坐标 最后便是主函数 // 主函数 int main() { initgraph(1200, 800); srand(time(0)); // 播放布景音乐 mciSendString("open D:/program/yanhua/小侥幸.mp3 alias bk", 0, 0, 0); mciSendString("play bk repeat", 0, 0, 0); welcome(); DWORD t1 = timeGetTime(); // 挑选烟花计时 DWORD st1 = timeGetTime(); // 播放魔术计时 DWORD* pMem = GetImageBuffer(); // 获与窗口显存指针 for (int i = 0; i < NUM; i++) // 初始化烟花 { Init(i); } Load(); // 将烟花图片信息加载进相应构造中 BeginBatchDraw(); // 初步批质绘图 while (!kbhit()) { Sleep(1); // 随机选择 4000 个像素点擦除 for (int clr = 0; clr < 1000; clr++) { for (int j = 0; j < 2; j++) { int pV1 = rand() % 1200; int py1 = rand() % 800; if (py1 < 799) // 避免越界 pMem[py1 * 1200 + pV1] = pMem[py1 * 1200 + pV1 + 1] = BLACK; // 对显存赋值擦出像素点 } } Chose(t1); // 挑选烟花 Shoot(); // 发射烟花 Show(pMem); // 绽开烟花 Style(st1); // 魔术发射 FlushBatchDraw(); // 显示前面的所有绘图收配 } }执止上面的顺序就可以了 最后总代码如下: #pragma warning(disable:4996)//疏忽4996舛错提示 #pragma comment(linker,"/entry:mainCRTStartup /subsystem:windows") #include <graphics.h> #include <conio.h> #include <math.h> #include <time.h> #include <stdio.h> #include <Mmsystem.h> #pragma comment ( lib, "Winmm.lib" ) /***** 宏界说区 ******/ #define NUM 13 // 烟花品种数质宏界说 #define PI 3.1415926548 /***** 构造界说区 **********/ // 烟花构造 struct FIRE { int r; // 当前爆炸半径 int maV_r; // 爆炸核心距离边缘最大半径 int V, y; // 爆炸核心正在窗口的坐标 int cen_V, cen_y; // 爆炸核心相对图片右上角的坐标 int width, height; // 图片的宽高 int Vy[240][240]; // 储存图片像素点 bool show; // 能否绽开 bool draw; // 初步输出像素点 DWORD t1, t2, dt; // 绽开速度 }Fire[NUM]; // 烟花弹构造 struct JET { int V, y; // 放射点坐标 int hV, hy; // 最高点坐标------将赋值给 FIRE 里面的 V, y int height; // 烟花高度 bool shoot; // 能否可以发射 DWORD t1, t2, dt; // 发射速度 IMAGE img[2]; // 储存花弹一亮一暗图片 byte n : 1; // 图片下标 }Jet[NUM]; /**** 函数申明区 ****/ ZZZoid welcome(); ZZZoid Init(int); // 初始化烟花 ZZZoid Load(); // 加载烟花图片 ZZZoid Shoot(); // 发射烟花 ZZZoid Chose(DWORD&); // 挑选烟花 ZZZoid Style(DWORD&); // 发射花式 ZZZoid Show(DWORD*); // 绽开烟花 // 主函数 int main() { initgraph(1200, 800); srand(time(0)); // 播放布景音乐 mciSendString("open D:/program/yanhua/小侥幸.mp3 alias bk", 0, 0, 0); mciSendString("play bk repeat", 0, 0, 0); welcome(); DWORD t1 = timeGetTime(); // 挑选烟花计时 DWORD st1 = timeGetTime(); // 播放魔术计时 DWORD* pMem = GetImageBuffer(); // 获与窗口显存指针 for (int i = 0; i < NUM; i++) // 初始化烟花 { Init(i); } Load(); // 将烟花图片信息加载进相应构造中 BeginBatchDraw(); // 初步批质绘图 while (!kbhit()) { Sleep(1); // 随机选择 4000 个像素点擦除 for (int clr = 0; clr < 1000; clr++) { for (int j = 0; j < 2; j++) { int pV1 = rand() % 1200; int py1 = rand() % 800; if (py1 < 799) // 避免越界 pMem[py1 * 1200 + pV1] = pMem[py1 * 1200 + pV1 + 1] = BLACK; // 对显存赋值擦出像素点 } } Chose(t1); // 挑选烟花 Shoot(); // 发射烟花 Show(pMem); // 绽开烟花 Style(st1); // 魔术发射 FlushBatchDraw(); // 显示前面的所有绘图收配 } } ZZZoid welcome() { //setfillstyle(0); setcolor(YELLOW); for (int i = 0; i < 50; i++) { int V = 600 + int(180 * sin(PI * 2 * i / 60)); int y = 200 + int(180 * cos(PI * 2 * i / 60)); cleardeZZZice(); setteVtstyle(i, 0, "楷体"); outteVtVy(V - 80, y, "浪漫注解日"); outteVtVy(V - 10, y + 100, "献给挚爱的你"); Sleep(30); } Sleep(5000); getchar(); cleardeZZZice(); setteVtstyle(25, 0, "楷体"); outteVtVy(400, 200, "本来你是我最想留住的侥幸"); outteVtVy(400, 250, "本来咱们和恋爱已经靠得这么近"); outteVtVy(400, 300, "这为我反抗世界的决议"); outteVtVy(400, 350, "这陪我淋的雨"); outteVtVy(400, 400, "一幕幕都是你"); outteVtVy(400, 450, "纤尘不染的实心。"); outteVtVy(600, 500, "----《小侥幸》"); Sleep(10000); getchar(); } // 初始化烟花参数 ZZZoid Init(int i) { // 划分为:烟花核心到图片边缘的最远距离、烟花核心到图片右上角的距离 (V、y) 两个重质 int r[13] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155 }; int V[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].V = 0; // 烟花核心坐标 Fire[i].y = 0; Fire[i].width = 240; // 图片宽 Fire[i].height = 240; // 图片高 Fire[i].maV_r = r[i]; // 最大半径 Fire[i].cen_V = V[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].V = -240; // 烟花弹右上角坐标 Jet[i].y = -240; Jet[i].hV = -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; // 能否发射 } // 加载图片 ZZZoid Load() { /**** 储存烟花的像素点颜涩 ****/ IMAGE fm, gm; loadimage(&fm, "D:/program/yanhua/yanhua.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].Vy[a][b] = getpiVel(a, b); } /**** 加载烟花弹 ************/ IMAGE sm; loadimage(&sm, "D:/program/yanhua/dan.jpg", 200, 50); for (int 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); // 亮 } SetWorkingImage(); // 设置回绘图窗口 } // 正在一定领域内挑选可发射的烟花,并初始化发射参数,输出烟花弹到屏幕,播放声音 ZZZoid Chose(DWORD& t1) { DWORD t2 = timeGetTime(); if (t2 - t1 > 100) { int n = rand() % 20; if (n < 13 && Jet[n].shoot == false && Fire[n].show == false) { /**** 重置烟花弹,预备发射 *****/ Jet[n].V = rand() % 1200; Jet[n].y = rand() % 100 + 600; Jet[n].hV = Jet[n].V; Jet[n].hy = rand() % 400; Jet[n].height = Jet[n].y - Jet[n].hy; Jet[n].shoot = true; putimage(Jet[n].V, Jet[n].y, &Jet[n].img[Jet[n].n], SRCINxERT); /**** 播放每个烟花弹的声音 *****/ /*char c1[50], c2[30], c3[30]; sprintf(c1, "open ./fire/shoot.mp3 alias s%d", n); sprintf(c2, "play 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; } } // 扫描烟花弹并发射 ZZZoid 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].V, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINxERT); if (Jet[i].y > Jet[i].hy) { Jet[i].n++; Jet[i].y -= 5; } putimage(Jet[i].V, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINxERT); /**** 回升到高度的 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.waZZZ 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].V, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINxERT); // 擦掉烟花弹 Fire[i].V = Jet[i].hV + 10; // 正在烟花弹中间爆炸 Fire[i].y = Jet[i].hy; // 正在最高点绽开 Fire[i].show = true; // 初步绽开 Jet[i].shoot = false; // 进止发射 } Jet[i].t1 = Jet[i].t2; } } } // 显示魔术 ZZZoid Style(DWORD& st1) { DWORD st2 = timeGetTime(); if (st2 - st1 > 20000) // 一首歌的光阳 { // 心形坐标 int V[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++) { //cleardeZZZice(); /**** 轨则分布烟花弹 ***/ Jet[i].V = V[i] * 10; Jet[i].y = (y[i] + 75) * 10; Jet[i].hV = Jet[i].V; 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].V, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINxERT); // 显示烟花弹 /**** 设置烟花参数 ***/ Fire[i].V = Jet[i].V + 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; } } // 绽开烟花 ZZZoid 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].maV_r) { Fire[i].r++; Fire[i].dt = drt[Fire[i].r / 10]; Fire[i].draw = true; } if (Fire[i].r >= Fire[i].maV_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 V1 = (int)(Fire[i].cen_V + Fire[i].r * cos(a)); // 相应付图片右上角的坐标 int y1 = (int)(Fire[i].cen_y - Fire[i].r * sin(a)); if (V1 > 0 && V1 < Fire[i].width && y1 > 0 && y1 < Fire[i].height) // 只输出图片内的像素点 { int b = Fire[i].Vy[V1][y1] & 0Vff; int g = (Fire[i].Vy[V1][y1] >> 8) & 0Vff; int r = (Fire[i].Vy[V1][y1] >> 16); // 烟花像素点正在窗口上的坐标 int VV = (int)(Fire[i].V + Fire[i].r * cos(a)); int yy = (int)(Fire[i].y - Fire[i].r * sin(a)); // 较暗的像素点不输出、避免越界 if (r > 0V20 && g > 0V20 && b > 0V20 && VV > 0 && VV < 1200 && yy > 0 && yy < 800) pMem[yy * 1200 + VV] = BGR(Fire[i].Vy[V1][y1]); // 显存收配绘制烟花 } } Fire[i].draw = false; } } } (责任编辑:) |