当前位置: 首页 > news >正文

网站后台模板html做网站对象存储

网站后台模板html,做网站对象存储,wordpress购买邀请码,什么做网站站群嘿#xff0c;朋友们#xff01;今天来给大家讲讲一段挺有意思的C代码呀#xff0c;这段代码主要是用来实现一个烟花效果展示的程序哦#xff0c;下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include graphics.h #include conio.h #include 朋友们今天来给大家讲讲一段挺有意思的C代码呀这段代码主要是用来实现一个烟花效果展示的程序哦下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include graphics.h #include conio.h #include math.h #include time.h #include stdio.h #includestring #include mmsystem.h #pragma comment ( lib, Winmm.lib )这里面包含了好多头文件呢。像 graphics.h 是和图形绘制相关的能帮咱们在屏幕上画出各种图形呀conio.h 可以用来处理控制台的输入输出相关操作math.h 就提供了像三角函数这些数学运算的功能time.h 能获取时间相关信息stdio.h 用于标准输入输出操作string 是处理字符串的而 mmsystem.h 以及后面关联的 Winmm.lib 呢是和多媒体操作有关的比如播放声音之类的操作都会用到哦。 2. 定义的一些常量和结构体 #define PI 3.14 #define NUM 13这里定义了 PI 就是咱们数学里常用的圆周率啦值设成了 3.14 哦。还有 NUM 定义成了 13它在后面表示烟花或者烟花弹的数量相关的意思呢。 然后有两个结构体哦 struct Fire {int r; // 当前爆炸半径int max_r; // 爆炸中心距离边缘最大半径int x, y; // 爆炸中心在窗口的坐标int cent2LeftTopX, cent2LeftTopY; // 爆炸中心相对图片左上角的坐标int width, height; // 图片的宽高int pix[240][240]; // 储存图片像素点bool show; // 是否绽放bool draw; // 开始输出像素点DWORD t1, t2, dt; // 绽放速度 }fires[NUM];Fire 结构体是用来描述烟花的相关属性的像 r 表示当前爆炸半径呀max_r 就是爆炸中心距离边缘最大半径x、y 是爆炸中心在窗口的坐标位置还有一些是和图片相关的属性比如图片的宽高、储存图片像素点的数组呀另外还有一些像 show 用来标记是否绽放、draw 标记是不是开始输出像素点再有几个时间相关的变量用来控制绽放速度呢。 struct Bullet {int x, y; // 烟花弹的当前坐标int topX, topY; // 最高点坐标------将赋值给 FIRE 里面的 x, yint height; // 烟花高度bool shoot; // 是否可以发射DWORD t1, t2, dt; // 发射速度IMAGE img[2]; // 储存花弹一亮一暗图片unsigned char n : 1; // 图片下标 n }bullets[NUM];Bullet 结构体是描述烟花弹的情况哦像 x、y 是烟花弹当前坐标topX、topY 是最高点坐标height 是烟花高度shoot 标记是否可以发射同样也有时间相关变量控制发射速度还有个 img 数组用来储存花弹一亮一暗的图片以及一个 n 用来作为图片下标的哦。 3. 各种函数的作用 3.1 initFire 函数 // 初始化指定的烟花和烟花弹 void initFire(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 };/**** 初始化烟花 *****/fires[i].x 0; // 烟花中心坐标fires[i].y 0;fires[i].width 240; // 图片宽fires[i].height 240; // 图片高fires[i].max_r r[i]; // 最大半径fires[i].cent2LeftTopX x[i]; // 中心距左上角距离fires[i].cent2LeftTopY y[i];fires[i].show false; // 是否绽放fires[i].dt 5; // 绽放时间间隔fires[i].t1 timeGetTime();fires[i].r 0; // 从 0 开始绽放fires[i].draw false;/**** 初始化烟花弹 *****///timeGetTime 该时间为从系统开启算起所经过的时间,单位毫秒bullets[i].t1 timeGetTime();bullets[i].dt rand() % 10; // 发射速度时间间隔bullets[i].n 0; // 烟花弹闪烁图片下标bullets[i].shoot false; // 是否发射 }这个函数就是用来初始化指定的烟花和烟花弹啦。它给烟花和烟花弹的各个属性赋值呀比如给烟花的坐标先初始化为 0设置图片宽高最大半径等还设置了绽放相关的时间间隔等属性对于烟花弹呢也设置了发射速度时间间隔初始化图片下标标记还没发射这些操作哦。 3.2 loadFireImages 函数 // 加载图片 void loadFireImages() {/**** 储存烟花的像素点颜色 ****/IMAGE fm, gm;loadimage(fm, fire/flower.jpg);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)fires[i].pix[a][b] getpixel(a, b);}/**** 加载烟花弹 ************/IMAGE sm;loadimage(sm, fire/shoot.jpg);for (int i 0; i 13; i){SetWorkingImage(sm);int n rand() % 5; //0..4getimage(bullets[i].img[0], n * 20, 0, 20, 50); // 暗getimage(bullets[i].img[1], (n 5) * 20, 0, 20, 50); // 亮}//设置绘图设备为默认绘图窗口就是当前游戏窗口SetWorkingImage(); // 设置回绘图窗口 }这个函数主要干两件大事哦。一是储存烟花的像素点颜色它会先加载一张烟花的图片然后通过循环把这张图片分割成一个个小的图片因为有13个烟花嘛再把每个小图片里的像素点颜色信息存到对应的烟花结构体里的数组中呢。另一件事就是加载烟花弹的图片啦它会随机选一部分图片区域0到4的范围里选获取一亮一暗两张不同状态的图片存到烟花弹结构体的 img 数组里哦最后还会把绘图设备设置回默认绘图窗口呢。 3.3 drawFire 函数 void drawFire(int i) {if (!fires[i].draw) {return;}// 弧度 PI 3.14 2PI 6.28 360度for (double a 0; a 6.28; a 0.01) //0-2PI 弧度{//三角函数int x1 (int)(fires[i].cent2LeftTopX fires[i].r * cos(a)); // 相对于图片左上角的坐标int y1 (int)(fires[i].cent2LeftTopY - fires[i].r * sin(a)); // 方向和easyx的Y坐标相反if (x1 0 x1 fires[i].width y1 0 y1 fires[i].height) // 只输出图片内的像素点{int b fires[i].pix[x1][y1] 0xff; //得到三原色的最低字节(B)int g (fires[i].pix[x1][y1] 8) 0xff; //第2个字节int r (fires[i].pix[x1][y1] 16);// 烟花像素点在窗口上的坐标int xx (int)(fires[i].x fires[i].r * cos(a));int yy (int)(fires[i].y - fires[i].r * sin(a));// 较暗的像素点不输出、防止越界//二维数组 当成 一位数组使用的案例 //颜色值接近黑色的不输出。// 看电影 5排第6个座位 5*306if (r 0x20 g 0x20 b 0x20 xx 0 xx 1200 yy 0 yy 800)pMem[yy * 1200 xx] BGR(fires[i].pix[x1][y1]); // 显存操作绘制烟花}}fires[i].draw false; }这个函数就是用来真正把烟花画出来的哦。不过它得先判断这个烟花是不是到了可以画的状态也就是 draw 属性是不是 true如果不是就直接返回啦。然后它通过一个循环利用三角函数来算出烟花每个像素点相对图片左上角的坐标再根据这个算出在窗口上的坐标还会判断这个像素点是不是在图片范围内呀以及颜色是不是太暗接近黑色就不画出来要是符合条件就通过操作显存把这个像素点画到窗口上最后把这个烟花的 draw 属性再设为 false 哦。 3.4 testFire 函数 void testFire() {int n 5;bullets[n].x 600;bullets[n].y 600;bullets[n].topX 600;bullets[n].topY 200;// 绘制烟花的初始状态即在起始位置绘制烟花putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);while (bullets[n].y bullets[n].topY) {// 擦除putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);bullets[n].y - 5;// 绘制putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);Sleep(50);}// 先擦除烟花弹putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);fires[n].show true;fires[n].x bullets[n].x 10;fires[n].y bullets[n].y;while (fires[n].r fires[n].max_r) {fires[n].draw true;drawFire(n);fires[n].r;Sleep(10);} }这是一个测试烟花效果的函数哦。它先设定了一个烟花弹的初始坐标、最高点坐标这些信息然后就开始模拟烟花弹升空的过程啦一边擦除原来位置的图像一边更新位置重新绘制等烟花弹到达最高点后就把烟花的相关属性设置好开始让烟花绽放也是通过循环不断更新烟花半径然后画出来哦。 3.5 chose 函数 void chose(DWORD t1) //t1位为上一次点烟花弹的时间 {DWORD t2 timeGetTime();if (t2 - t1 100) // 100ms点一次{int n rand() % 30; //取摸的数字越大烟花发射频率越慢因为13的概率就越低if (n 13 bullets[n].shoot false fires[n].show false){/**** 重置烟花弹预备发射 *****/bullets[n].x rand() % 1200;bullets[n].y rand() % 100 600; // 600-699bullets[n].topX bullets[n].x;bullets[n].topY rand() % 400; // 0.399bullets[n].height bullets[n].y - bullets[n].topY;bullets[n].shoot true;// 绘制烟花的初始状态即在起始位置绘制烟花putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);/**** 播放每个烟花弹的声音 *****/char cmd[50];sprintf_s(cmd, play s%d, n);mciSendString(cmd, 0, 0, 0);}t1 t2;} }这个函数是根据时间来决定要不要发射烟花弹哦。它先获取当前时间然后看看距离上一次点烟花弹的时间有没有超过 100 毫秒如果超过了就随机选一个编号如果这个编号对应的烟花弹没发射而且对应的烟花也没在绽放那就重置这个烟花弹的一些属性比如坐标呀、高度这些还会绘制烟花弹的初始状态并且播放这个烟花弹对应的声音呢最后更新上一次点烟花弹的时间哦。 3.6 init 函数 void init() {// 创建窗口initgraph(1200, 800);// 播放背景音乐mciSendString(play fire/ring.mp3 repeat, 0, 0, 0);for (int i 0; i NUM; i) { // 初始化烟花和烟花弹initFire(i);}loadFireImages();// 这个函数用于获取绘图设备的显示缓冲区指针。pMem GetImageBuffer(); // 获取窗口显存指针// 打开音效并设置别名char cmd[128];for (int i 0; i 13; i) {sprintf_s(cmd, sizeof(cmd), open fire/shoot.mp3 alias s%d, i);mciSendString(cmd, 0, 0, 0); // 打开13次sprintf_s(cmd, sizeof(cmd), open fire/bomb.wav alias f%d, i);mciSendString(cmd, 0, 0, 0); // 打开13次}loadimage(head, fire/head.png, 400, 300, true); }这个可是整个程序初始化的大管家函数呀。它先创建了一个 1200×800 大小的窗口然后播放背景音乐。接着会循环调用 initFire 函数去初始化所有的烟花和烟花弹再调用 loadFireImages 函数加载图片获取绘图设备的显示缓冲区指针还会打开好多音效文件并且设置别名最后还会加载一个头的图片哦虽然暂时不知道具体用在哪不过也是初始化的一部分啦。 3.7 clearImage 函数 void clearImage() {for (int i 0; i 2000; i){int px1 rand() % 1200; // 0..1199int py1 rand() % 800; // 0.799pMem[py1 * 1200 px1] BLACK;pMem[py1 * 1200 px1 1] BLACK; // 对显存赋值擦出像素点 } }这个函数就是用来随机擦除一些像素点的哦通过循环随机生成坐标然后把对应的显存位置设置成黑色这样就相当于擦除了一些像素点啦让画面有那种随机的感觉哦。 3.8 shoot 函数 void shoot() {for (int i 0; i 13; i) {bullets[i].t2 timeGetTime();if (bullets[i].t2 - bullets[i].t1 bullets[i].dt bullets[i].shoot true) {// 擦除putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);// 更新烟花弹的位置和图片状态if (bullets[i].y bullets[i].topY) {bullets[i].n;bullets[i].y - 5;}// 在新位置上重新绘制putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);/**** 上升到高度的 3 / 4减速 *****/// 即距离最高点还有1/4的时候减速if ((bullets[i].y - bullets[i].topY) * 4 bullets[i].height)bullets[i].dt rand() % 4 10; // 10..13/**** 上升到最大高度 *****/if (bullets[i].y bullets[i].topY) {// 擦除烟花弹putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);// 准备渲染“烟花”fires[i].x bullets[i].topX 10; // 在烟花弹中间爆炸fires[i].y bullets[i].topY; // 在最高点绽放fires[i].show true; // 开始绽放bullets[i].shoot false; // 停止发射// 关闭点烟花的音效并播放爆炸的音效, 并重新打开点烟花的音效char c1[64], c2[64];sprintf_s(c1, close s%d, i);sprintf_s(c2, play f%d, i);mciSendString(c1, 0, 0, 0);mciSendString(c2, 0, 0, 0);sprintf_s(c1, sizeof(c1), open fire/shoot.mp3 alias s%d, i);mciSendString(c1, 0, 0, 0);}// 更新烟花弹的时间bullets[i].t1 bullets[i].t2;}} }这个函数是处理烟花弹升空过程的哦。它会遍历所有的烟花弹先获取当前时间看看是不是到了该更新烟花弹位置的时候啦如果到了就先擦除原来位置的烟花弹图像然后根据情况更新烟花弹的位置、图片状态比如切换一亮一暗的图片呀要是快到最高点了还会减速呢等烟花弹到达最大高度后就擦除烟花弹准备让烟花开始绽放啦还会处理相关的音效关闭点烟花的音效播放爆炸的音效然后再重新打开点烟花的音效哦。 3.9 showFire 函数 void showFire() {// 烟花个阶段绽放时间间隔制作变速绽放效果// 为什么数组大小定义为16// 目前烟花的最大半径是155准备以半径/10可刻度不同的半径绽放速度不同// 半径越大绽放越慢// 10 20 30 40 50 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) {fires[i].t2 timeGetTime();// 增加爆炸半径绽放烟花增加时间间隔做变速效果if (fires[i].t2 - fires[i].t1 fires[i].dt fires[i].show true) {// 更新烟花半径if (fires[i].r fires[i].max_r) {fires[i].r;fires[i].dt drt[fires[i].r / 10];fires[i].draw true;}// 销毁烟花并重新初始化该序号的飞弹和烟花if (fires[i].r fires[i].max_r) {fires[i].draw false;initFire(i);// 关闭爆炸音效并重新打开爆炸音效char cmd[64];sprintf_s(cmd, close f%d, i);mciSendString(cmd, 0, 0, 0);sprintf_s(cmd, sizeof(cmd), open fire/bomb.wav alias f%d, i);mciSendString(cmd, 0, 0, 0);}// 更新烟花的时间fires[i].t1 fires[i].t2;}// 绘制指定的烟花drawFire(i);} }这个函数是用来控制烟花绽放的过程哦。它有个数组 drt 用来控制不同半径下烟花绽放的时间间隔实现变速绽放效果呢。它会遍历所有的烟花看看是不是到了该更新绽放状态的时候啦如果到了就更新烟花半径要是半径还没到最大就继续增加半径并且更新绽放时间间隔要是半径达到最大了就销毁这个烟花重新初始化这个序号对应的烟花弹和烟花同时也会处理相关的音效关闭爆炸音效再重新打开哦最后还会调用 drawFire 函数把烟花画出来呢。 3.10 heartFire 函数 void heartFire(DWORD st1) {DWORD st2 timeGetTime();static bool flag false;static DWORD startTime 0;if (flag st2 - startTime 3500) {putimage(430, 250, head);flag false;}if (st2 - st1 20000) // 20秒{flag true;startTime timeGetTime();// 先擦除正在发送的烟花弹for (int i 0; i 13; i) {if (bullets[i].shoot)putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);}// 心形坐标int x[13] { 600, 750, 910, 1000, 950, 750, 600, 450, 250, 150, 250, 410, 600 };int y[13] { 650, 530, 400, 220, 50, 40, 200, 40, 50, 220, 400, 530, 650 };for (int i 0; i NUM; i){bullets[i].x x[i];bullets[i].y y[i] 750; //每个烟花弹的发射距离都是750确保同时爆炸bullets[i].topX x[i];bullets[i].topY y[i];bullets[i].height bullets[i].y - bullets[i].topY;bullets[i].shoot true;bullets[i].dt 7;// 显示烟花弹putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);/**** 设置烟花参数 ***/fires[i].x bullets[i].x 10;fires[i].y bullets[i].topY;fires[i].show false;fires[i].r 0;}st1 st2;} }这个函数挺有意思的哦它有时间相关的判断呢。如果满足一定时间条件比如超过 20 秒呀就会做一些操作先是把一个头的图片显示出来一会儿通过标记和时间判断控制显示时长哦然后还会擦除正在发射的烟花弹接着按照心形的坐标来设置好多烟花弹的发射位置、高度这些属性让它们准备发射同时设置对应的烟花的一些初始属性哦感觉是要搞个心形烟花秀的样子呢。 3.11 daoJiShi 函数 void daoJiShi() {IMAGE img[6];char name[64];for (int i 0; i 6; i) {sprintf(name, fire/%d.png, i);loadimage(img[i], name);}for (int i 5; i 0; i--) {BeginBatchDraw();cleardevice();putimage((1200 - img[i].getwidth()) / 2, (800 - img[i].getheight()) / 2, img[i]);EndBatchDraw();Sleep(1000);}cleardevice(); }这个函数就是用来做倒计时显示的哦。它先加载了 6 张不同的图片文件名是按数字命名的呢然后从最后一张开始一张张地在屏幕中间显示出来每次显示间隔 1 秒显示完了就把屏幕清空估计是为了在正式放烟花前搞个倒计时的小效果呀。 4. main 函数 int main(void) {init();daoJiShi();DWORD t1 timeGetTime(); // 筛选烟花计时DWORD ht1 timeGetTime(); // 播放花样计时BeginBatchDraw();// kbhit()判断有没有按键输入while(1)//while (!_kbhit()){// 帧等待Sleep(10);clearImage();chose(t1); //点火shoot(); //升空showFire();heartFire(ht1);FlushBatchDraw(); // 显示前面的所有绘图操作// 烟花// to do...}return 0; }这个就是整个程序的入口啦就像一扇大门一样哦。它先调用 init 函数进行初始化再调用 daoJiShi 函数做倒计时显示。然后获取两个时间相关的变量一个用来控制筛选烟花的计时一个用来控制播放花样的计时哦。接着进入一个大的循环在循环里先等 10 毫秒相当于控制一下帧率呀然后调用 clearImage 函数擦除一些像素点再依次调用 chose、shoot、showFire、heartFire 这些函数来分别处理点火、烟花弹升空、烟花绽放、特殊的心形烟花相关的操作最后调用 FlushBatchDraw 把前面做的绘图操作显示出来这样整个烟花秀就在屏幕上展示出来啦这个循环会一直进行直到有按键输入虽然代码里现在注释掉了那个判断按键输入的部分不过按道理加上后可以通过按键来结束程序之类的哦最后返回 0 表示程序正常结束啦。 总之呀这段代码通过好多函数相互配合实现了一个很有意思的烟花展示程序有各种各样的烟花效果还有声音、倒计时这些好玩的元素呢是不是挺厉害的呀。 5 . 完整代码 #include graphics.h #include conio.h #include math.h #include time.h #include stdio.h #includestring #include mmsystem.h #pragma comment ( lib, Winmm.lib )#define PI 3.14 #define NUM 13// 指向绘图设备的显示缓冲区。 DWORD* pMem;IMAGE head;// 烟花结构 struct Fire {int r; // 当前爆炸半径int max_r; // 爆炸中心距离边缘最大半径int x, y; // 爆炸中心在窗口的坐标int cent2LeftTopX, cent2LeftTopY; // 爆炸中心相对图片左上角的坐标int width, height; // 图片的宽高int pix[240][240]; // 储存图片像素点bool show; // 是否绽放bool draw; // 开始输出像素点DWORD t1, t2, dt; // 绽放速度 }fires[NUM];// 烟花弹结构 struct Bullet {int x, y; // 烟花弹的当前坐标int topX, topY; // 最高点坐标------将赋值给 FIRE 里面的 x, yint height; // 烟花高度bool shoot; // 是否可以发射DWORD t1, t2, dt; // 发射速度IMAGE img[2]; // 储存花弹一亮一暗图片unsigned char n : 1; // 图片下标 n }bullets[NUM];// 初始化指定的烟花和烟花弹 void initFire(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 };/**** 初始化烟花 *****/fires[i].x 0; // 烟花中心坐标fires[i].y 0;fires[i].width 240; // 图片宽fires[i].height 240; // 图片高fires[i].max_r r[i]; // 最大半径fires[i].cent2LeftTopX x[i]; // 中心距左上角距离fires[i].cent2LeftTopY y[i];fires[i].show false; // 是否绽放fires[i].dt 5; // 绽放时间间隔fires[i].t1 timeGetTime();fires[i].r 0; // 从 0 开始绽放fires[i].draw false;/**** 初始化烟花弹 *****///timeGetTime 该时间为从系统开启算起所经过的时间,单位毫秒bullets[i].t1 timeGetTime();bullets[i].dt rand() % 10; // 发射速度时间间隔bullets[i].n 0; // 烟花弹闪烁图片下标bullets[i].shoot false; // 是否发射 }// 加载图片 void loadFireImages() {/**** 储存烟花的像素点颜色 ****/IMAGE fm, gm;loadimage(fm, fire/flower.jpg);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)fires[i].pix[a][b] getpixel(a, b);}/**** 加载烟花弹 ************/IMAGE sm;loadimage(sm, fire/shoot.jpg);for (int i 0; i 13; i){SetWorkingImage(sm);int n rand() % 5; //0..4getimage(bullets[i].img[0], n * 20, 0, 20, 50); // 暗getimage(bullets[i].img[1], (n 5) * 20, 0, 20, 50); // 亮}//设置绘图设备为默认绘图窗口就是当前游戏窗口SetWorkingImage(); // 设置回绘图窗口 }void drawFire(int i) {if (!fires[i].draw) {return;}// 弧度 PI 3.14 2PI 6.28 360度for (double a 0; a 6.28; a 0.01) //0-2PI 弧度{//三角函数int x1 (int)(fires[i].cent2LeftTopX fires[i].r * cos(a)); // 相对于图片左上角的坐标int y1 (int)(fires[i].cent2LeftTopY - fires[i].r * sin(a)); // 方向和easyx的Y坐标相反if (x1 0 x1 fires[i].width y1 0 y1 fires[i].height) // 只输出图片内的像素点{int b fires[i].pix[x1][y1] 0xff; //得到三原色的最低字节(B)int g (fires[i].pix[x1][y1] 8) 0xff; //第2个字节int r (fires[i].pix[x1][y1] 16);// 烟花像素点在窗口上的坐标int xx (int)(fires[i].x fires[i].r * cos(a));int yy (int)(fires[i].y - fires[i].r * sin(a));// 较暗的像素点不输出、防止越界//二维数组 当成 一位数组使用的案例 //颜色值接近黑色的不输出。// 看电影 5排第6个座位 5*306if (r 0x20 g 0x20 b 0x20 xx 0 xx 1200 yy 0 yy 800)pMem[yy * 1200 xx] BGR(fires[i].pix[x1][y1]); // 显存操作绘制烟花}}fires[i].draw false; }void testFire() {int n 5;bullets[n].x 600;bullets[n].y 600;bullets[n].topX 600;bullets[n].topY 200;// 绘制烟花的初始状态即在起始位置绘制烟花putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);while (bullets[n].y bullets[n].topY) {// 擦除putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);bullets[n].y - 5;// 绘制putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);Sleep(50);}// 先擦除烟花弹putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);fires[n].show true;fires[n].x bullets[n].x 10;fires[n].y bullets[n].y;while (fires[n].r fires[n].max_r) {fires[n].draw true;drawFire(n);fires[n].r;Sleep(10);} }// C的引用 void chose(DWORD t1) //t1位为上一次点烟花弹的时间 {DWORD t2 timeGetTime();if (t2 - t1 100) // 100ms点一次{int n rand() % 30; //取摸的数字越大烟花发射频率越慢因为13的概率就越低if (n 13 bullets[n].shoot false fires[n].show false){/**** 重置烟花弹预备发射 *****/bullets[n].x rand() % 1200;bullets[n].y rand() % 100 600; // 600-699bullets[n].topX bullets[n].x;bullets[n].topY rand() % 400; // 0.399bullets[n].height bullets[n].y - bullets[n].topY;bullets[n].shoot true;// 绘制烟花的初始状态即在起始位置绘制烟花putimage(bullets[n].x, bullets[n].y, bullets[n].img[bullets[n].n], SRCINVERT);/**** 播放每个烟花弹的声音 *****/char cmd[50];sprintf_s(cmd, play s%d, n);mciSendString(cmd, 0, 0, 0);}t1 t2;} }// 项目初始化 void init() {// 创建窗口initgraph(1200, 800);// 播放背景音乐mciSendString(play fire/ring.mp3 repeat, 0, 0, 0);for (int i 0; i NUM; i) { // 初始化烟花和烟花弹initFire(i);}loadFireImages();// 这个函数用于获取绘图设备的显示缓冲区指针。pMem GetImageBuffer(); // 获取窗口显存指针// 打开音效并设置别名char cmd[128];for (int i 0; i 13; i) {sprintf_s(cmd, sizeof(cmd), open fire/shoot.mp3 alias s%d, i);mciSendString(cmd, 0, 0, 0); // 打开13次sprintf_s(cmd, sizeof(cmd), open fire/bomb.wav alias f%d, i);mciSendString(cmd, 0, 0, 0); // 打开13次}loadimage(head, fire/head.png, 400, 300, true); }void clearImage() {for (int i 0; i 2000; i){int px1 rand() % 1200; // 0..1199int py1 rand() % 800; // 0.799pMem[py1 * 1200 px1] BLACK;pMem[py1 * 1200 px1 1] BLACK; // 对显存赋值擦出像素点 } }// 烟花弹升空 void shoot() {for (int i 0; i 13; i) {bullets[i].t2 timeGetTime();if (bullets[i].t2 - bullets[i].t1 bullets[i].dt bullets[i].shoot true) {// 擦除putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);// 更新烟花弹的位置和图片状态if (bullets[i].y bullets[i].topY) {bullets[i].n;bullets[i].y - 5;}// 在新位置上重新绘制putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);/**** 上升到高度的 3 / 4减速 *****/// 即距离最高点还有1/4的时候减速if ((bullets[i].y - bullets[i].topY) * 4 bullets[i].height)bullets[i].dt rand() % 4 10; // 10..13/**** 上升到最大高度 *****/if (bullets[i].y bullets[i].topY) {// 擦除烟花弹putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);// 准备渲染“烟花”fires[i].x bullets[i].topX 10; // 在烟花弹中间爆炸fires[i].y bullets[i].topY; // 在最高点绽放fires[i].show true; // 开始绽放bullets[i].shoot false; // 停止发射// 关闭点烟花的音效并播放爆炸的音效, 并重新打开点烟花的音效char c1[64], c2[64];sprintf_s(c1, close s%d, i);sprintf_s(c2, play f%d, i);mciSendString(c1, 0, 0, 0);mciSendString(c2, 0, 0, 0);sprintf_s(c1, sizeof(c1), open fire/shoot.mp3 alias s%d, i);mciSendString(c1, 0, 0, 0);}// 更新烟花弹的时间bullets[i].t1 bullets[i].t2;}} }// 绽放烟花 void showFire() {// 烟花个阶段绽放时间间隔制作变速绽放效果// 为什么数组大小定义为16// 目前烟花的最大半径是155准备以半径/10可刻度不同的半径绽放速度不同// 半径越大绽放越慢// 10 20 30 40 50 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) {fires[i].t2 timeGetTime();// 增加爆炸半径绽放烟花增加时间间隔做变速效果if (fires[i].t2 - fires[i].t1 fires[i].dt fires[i].show true) {// 更新烟花半径if (fires[i].r fires[i].max_r) {fires[i].r;fires[i].dt drt[fires[i].r / 10];fires[i].draw true;}// 销毁烟花并重新初始化该序号的飞弹和烟花if (fires[i].r fires[i].max_r) {fires[i].draw false;initFire(i);// 关闭爆炸音效并重新打开爆炸音效char cmd[64];sprintf_s(cmd, close f%d, i);mciSendString(cmd, 0, 0, 0);sprintf_s(cmd, sizeof(cmd), open fire/bomb.wav alias f%d, i);mciSendString(cmd, 0, 0, 0);}// 更新烟花的时间fires[i].t1 fires[i].t2;}// 绘制指定的烟花drawFire(i);} }void heartFire(DWORD st1) {DWORD st2 timeGetTime();static bool flag false;static DWORD startTime 0;if (flag st2 - startTime 3500) {putimage(430, 250, head);flag false;}if (st2 - st1 20000) // 20秒{flag true;startTime timeGetTime();// 先擦除正在发送的烟花弹for (int i 0; i 13; i) {if (bullets[i].shoot)putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);}// 心形坐标int x[13] { 600, 750, 910, 1000, 950, 750, 600, 450, 250, 150, 250, 410, 600 };int y[13] { 650, 530, 400, 220, 50, 40, 200, 40, 50, 220, 400, 530, 650 };for (int i 0; i NUM; i){bullets[i].x x[i];bullets[i].y y[i] 750; //每个烟花弹的发射距离都是750确保同时爆炸bullets[i].topX x[i];bullets[i].topY y[i];bullets[i].height bullets[i].y - bullets[i].topY;bullets[i].shoot true;bullets[i].dt 7;// 显示烟花弹putimage(bullets[i].x, bullets[i].y, bullets[i].img[bullets[i].n], SRCINVERT);/**** 设置烟花参数 ***/fires[i].x bullets[i].x 10;fires[i].y bullets[i].topY;fires[i].show false;fires[i].r 0;}st1 st2;} }void daoJiShi() {IMAGE img[6];char name[64];for (int i 0; i 6; i) {sprintf(name, fire/%d.png, i);loadimage(img[i], name);}for (int i 5; i 0; i--) {BeginBatchDraw();cleardevice();putimage((1200 - img[i].getwidth()) / 2, (800 - img[i].getheight()) / 2, img[i]);EndBatchDraw();Sleep(1000);}cleardevice(); }int main(void) {init();daoJiShi();DWORD t1 timeGetTime(); // 筛选烟花计时DWORD ht1 timeGetTime(); // 播放花样计时BeginBatchDraw();// kbhit()判断有没有按键输入while(1)//while (!_kbhit()){// 帧等待Sleep(10);clearImage();chose(t1); //点火shoot(); //升空showFire();heartFire(ht1);FlushBatchDraw(); // 显示前面的所有绘图操作// 烟花// to do...}return 0; }
http://www.w-s-a.com/news/435482/

相关文章:

  • 苏网站建设网页设计和网页美工
  • 跨境电商平台网站广州地铁站路线图
  • 吉林省交通建设集团有限公司网站企业网站推广的策略有哪些
  • 网站内链怎么做更好郑州网站建设哪家便宜
  • 建设大型购物网站运城哪里做网站
  • php企业网站通讯录管理系统做网站在线支付系统多少钱?
  • 怎么区分用vs和dw做的网站贝贝网网站开发背景
  • 无锡网站建设制作建设信息网查询
  • 彩票系统网站开发建设人力资源网官网
  • 有专门下载地图做方案的网站吗网站建设平台计划书
  • 网站闭站保护10个著名摄影网站
  • 安徽省建设工程信息网官网首页网站关键词排名优化工具
  • 深圳网站建设 百业网站专题教程
  • 公司seo是指什么意思如何来做网站优化
  • 化妆品网站建设平台的分析湖南网站搜索排名优化电话
  • 织梦网站修改教程视频教程管理类网站开发价格
  • 如何让新网站快速收录企业建站的作用是什么
  • 在线制作简历的网站做的最好的微电影网站
  • h5制作的网站网络游戏投诉平台
  • 做外贸网站好还是内贸网站好珠海新盈科技有限公 网站建设
  • php和网站开发网络软营销
  • 大型做网站的公司有哪些wordpress注册链接无效
  • 推荐门户网站建设公司网站开发移动端
  • 公司网站的栏目设置成都十大监理公司排名
  • 安溪住房和城乡建设网站关岭县建设局网站
  • 网站域名注销备案徐州房产网
  • 筑聘网windows优化大师自动安装
  • 龙华高端网站设计门户网站建设方案公司
  • 网站开发作用网站建设哪家专业
  • 网站设计报告总结南宁商城网站推广公司