出售本站【域名】【外链】

织梦CMS - 轻松建站从此开始!

智能永康-教育培训

当前位置: 智能永康-教育培训 > 高考绽放 > 文章页

“浪漫烟花“程序<VS

时间:2024-12-02 02:20来源: 作者:admin 点击: 38 次
结果:多个烟花弹同时上升,然后进行爆炸,并进行了花样设计,采取心型设计方案,背景音乐设置为"小幸运",除此在最初,窗口设置有文本. 接下来,就让我们来分析代码: // 烟花结构 struct FIRE { int r; // 当前爆炸半径 int max_r; /

结果:多个烟花弹同时回升,而后停行爆炸,并停行了魔术设想,回收心型设想方案,布景音乐设置为"小侥幸",除此正在最初,窗口设置有文原.

接下来,就让咱们来阐明代码:

// 烟花构造 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的光阳数组,光阳越来越长,代表的便是速度越来越慢.

烟花和烟花弹每一个构造的尾部都新建一个数组构造,这么下面就可以间接应用了.

接下来,咱们来追念一下上面步调的流程:

第一步:一个回形的文原弹出,并显示几多止笔朱

第二步:布景音乐播放

第三步:烟花弹回升并爆炸烟花

第四步:魔术烟花,也便是心型烟花弹的回升和爆炸

这接下来,每一步咱们都设定一个径自函数来默示.

首先:文原输出
 

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(); }

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,按回车继续.

第二步布景音乐播放
 

// 播放布景音乐 mciSendString("open D:/program/yanhua/小侥幸.mp3 alias bk", 0, 0, 0); mciSendString("play bk repeat", 0, 0, 0);

间接放正在了主函数里面

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; } } }

(责任编辑:)

------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:
发布者资料
查看详细资料 发送留言 加为好友 用户等级: 注册时间:2025-02-07 09:02 最后登录:2025-02-07 09:02
栏目列表
推荐内容
  • 关于高考的优秀演讲稿

    关于高考的优秀演讲稿(精选24篇) 同学们,从今天开始,高考冲刺的战役正式打响。高考,是人生征途中最激动人心的驿站之一,它对翻开我们生命中崭新的一页有着不可估量...

  • 美丽的风景作文(精选70篇)

    在日常生活或是工作学习中,大家都尝试过写作文吧,借助作文人们可以反映客观事物、表达思想感情、传递知识信息。如何写一篇有思想、有文采的作文呢?下面是小编收集整理的...

  • 高考语文满分作文范例及解析

    浏览下面的资料,依据要求做文。   下面是华为创始人任正非承受采访的片断。   主持人:您拥护正在补短板的历程中,自发的知识产权的翻新。 ...

  • 我看高考800字作文(2017全国2)

    《等待春天的日子》是2017年全国2卷我看高考800字作文,聚焦在“我的高考”上,把自己的“高考”比作“春天”,那么高一是“萌芽”,高二是“生长”,高三是“绽放...

  • 2025年高考作文素材积累:我的阿勒泰.docx

    2025年高考作文素材积累:我的阿勒泰.docx,不落窠臼的返乡故事,治愈心灵的文化密码 2024年5月7日起,由马伊琍、周依然、于适主演的《我的阿勒泰》在央视...

  • 快看!2024高考7篇满分作文!绝对惊艳,赶快收藏!

    快看!2024高考7篇满分作文!绝对惊艳,赶快收藏!,高考,屈原,朱自清...

  • 美就在身边中考满分作文精选5篇

    美就在身边中考满分作文精选5篇 世上有千万种美,样样精彩,样样惹人注目。下面是小编整理的美就在身边满分作文,欢迎大家阅读!【作文题目】22.请从以下两题中任选一...

  • 2024年满分高考优秀作文(精选45篇)

    对我国绝大多数考生来说,高考是真正意义上的“一考定终身”但是,考生面临的竞争也非常激烈,因此高考时的每一分都至关重要,有时候多考一分,便能超过千人,未来的路或许...

  • 乘风破浪,让青春无悔绽放!

    龙虎首页...

  • 高考满分作文:父爱(精选55篇)

    在平平淡淡的日常中,大家都不可避免地要接触到作文吧,借助作文人们可以实现文化交流的目的。你知道作文怎样才能写的好吗?以下是小编帮大家整理的高考满分作文:父爱,仅...