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

跨年烟花C++代码

嘿,朋友们!今天来给大家讲讲一段挺有意思的C++代码呀,这段代码主要是用来实现一个烟花效果展示的程序哦,下面咱们一点点来看哈。

效果

请添加图片描述

1. 开头包含的那些头文件

#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include<string>
#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 就是爆炸中心距离边缘最大半径,xy 是爆炸中心在窗口的坐标位置,还有一些是和图片相关的属性,比如图片的宽高、储存图片像素点的数组呀,另外还有一些像 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 结构体是描述烟花弹的情况哦,像 xy 是烟花弹当前坐标,topXtopY 是最高点坐标,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*30+6if (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 函数擦除一些像素点,再依次调用 choseshootshowFireheartFire 这些函数来分别处理点火、烟花弹升空、烟花绽放、特殊的心形烟花相关的操作,最后调用 FlushBatchDraw 把前面做的绘图操作显示出来,这样整个烟花秀就在屏幕上展示出来啦,这个循环会一直进行,直到有按键输入(虽然代码里现在注释掉了那个判断按键输入的部分,不过按道理加上后可以通过按键来结束程序之类的哦),最后返回 0 表示程序正常结束啦。

总之呀,这段代码通过好多函数相互配合,实现了一个很有意思的烟花展示程序,有各种各样的烟花效果,还有声音、倒计时这些好玩的元素呢,是不是挺厉害的呀。

5 . 完整代码

#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include<string>
#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*30+6if (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;
}

相关文章:

跨年烟花C++代码

嘿&#xff0c;朋友们&#xff01;今天来给大家讲讲一段挺有意思的C代码呀&#xff0c;这段代码主要是用来实现一个烟花效果展示的程序哦&#xff0c;下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include <graphics.h> #include <conio.h> #include &…...

第82期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…...

关于FPGA中添加FIR IP核(采用了GOWIN EDA)

文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和&#xff0c;权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…...

基于机器学习的京东手机商品评论数据可视化分析系统

完整源码项目包获取→点击文章末尾名片&#xff01;...

jenkins入门13--pipeline

Jenkins-pipeline(1)-基础 为什么要使用pipeline 代码&#xff1a;pipeline 以代码的形式实现&#xff0c;通过被捡入源代码控制&#xff0c; 使团队能够编译&#xff0c;审查和迭代其cd流程 可连续性&#xff1a;jenkins 重启 或者中断后都不会影响pipeline job 停顿&#x…...

Ubuntu24.04.1 LTS+Win11双系统安装记录

Win11相关 1.用DiskGenius删除硬盘分区 2.关闭win11的BitLocker&#xff0c;否则禁用安全启动后开机时需要帐户密钥&#xff0c;很麻烦。 3.在设备管理器中找到独立显卡&#xff0c;右键禁用。等ubuntu装好显卡驱动后&#xff0c;再进入win启用。 Ubuntu相关 1.Ubuntu24.04在…...

【前端开发常用网站汇总-01】

1、仿mac界面代码截图 https://codeimg.io/?utm_sourceappinn.com 2、可视化大屏汇总(在线Demo) https://www.xiongze.net/viewdata/index.html 3、在线Photoshop(实现简单P图) https://ps.gaoding.com/#/ 4、在线生成ico图标(png转icon文件) https://www.bitbug.net/in…...

【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.6.1. 生命周期标注语法 生命周期的标注并不会改变引用的生命周期长度。如果某个函数它制定了泛型生命周期参数&#xff0c;那么它就可…...

Three.js教程014:使用tween实现补间动画

补间动画tween 补间动画(Tween Animation)是一种通过平滑过渡的方式,在一段时间内将对象的属性从一个状态变换到另一个状态的动画技术。Three.js 中可以使用 tween.js 来实现补间动画。 【1】导入补间动画库 // 导入tween import * as TWEEN from "three/examples/j…...

Mac软件介绍之录屏软件Filmage Screen

软件介绍 Filmage Screen 是一款专业的视频录制和编辑软件&#xff0c;适用于 Mac 系统 可以选择4k 60fps&#xff0c;可以选择录制电脑屏幕&#xff0c;摄像头录制&#xff0c;可以选择区域录制。同时也支持&#xff0c;简单的视频剪辑。 可以同时录制电脑麦克风声音 标准…...

MySQL使用navicat新增触发器

找到要新增触发器的表&#xff0c;然后点击设计&#xff0c;找到触发器标签。 根据实际需要&#xff0c;填写相关内容&#xff0c;操作完毕&#xff0c;点击保存按钮。 在右侧的预览界面&#xff0c;可以看到新生成的触发器脚本...

深入理解 DOM:构建动态 Web 页面的基石

在 Web 开发的世界里&#xff0c;DOM (Document Object Model) 就像一位无声的英雄&#xff0c;默默地支撑着我们每天浏览的各种动态网页。你可能每天都在和它打交道&#xff0c;却未必真正了解它。那么&#xff0c;DOM 到底是什么&#xff1f;它为什么如此重要&#xff1f;让我…...

如何构建多层决策树

构建一颗多层的决策树时&#xff0c;通过递归选择最佳划分特征&#xff08;依据 信息增益 或 基尼系数&#xff09;对数据集进行划分&#xff0c;直到满足停止条件&#xff08;例如叶节点纯度达到要求或树的深度限制&#xff09;。以下是基于 信息增益 和 基尼系数 的递推公式和…...

人工智能 前馈神经网络练习题

为了构建一个有两个输入&#xff08; X 1 X_1 X1​、 X 2 X_2 X2​&#xff09;和一个输出的单层感知器&#xff0c;并进行分类&#xff0c;我们需要计算权值 w 1 w_1 w1​和 w 2 w_2 w2​的更新过程。以下是详细的步骤和计算过程&#xff1a; 初始化参数 初始权值&#xff1a…...

stable diffusion安装mov2mov

第一步&#xff1a; 下载mov2mov&#xff0c;地址&#xff1a;https://gitcode.com/gh_mirrors/sd/sd-webui-mov2mov 下载包到web-ui的sd-webui-aki-v4.10\extensions文件夹面解压 第二步&#xff1a;在文件夹中调出cmd窗口&#xff0c;执行下列命令&#xff0c; git restore…...

人工智能学习框架概述

1. 引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;各种学习框架应运而生&#xff0c;为研究人员和开发者提供了便利。这些框架不仅简化了复杂的算法实现&#xff0c;还提供了用于构建、训练和评估模型的工具和环境。本文将对目前流行的人工智能学习框…...

(二)WebGL的渲染管线初识

WebGL的渲染管线可以被看作是将一组数据&#xff08;例如模型、纹理、颜色等&#xff09;经过一系列处理阶段&#xff0c;最终生成图像并显示在屏幕上的过程。为了帮助你理解这一过程&#xff0c;我将通过一个通俗易懂的移动例子来一步步详细讲解WebGL 的渲染管线及其关键绘制原…...

1. 使用springboot做一个音乐播放器软件项目【前期规划】

背景&#xff1a; 现在大部分音乐软件都是要冲会员才可以无限常听的。对于喜欢听音乐的小伙伴&#xff0c;资金又比较紧张&#xff0c;是那么的不友好。作为程序员的我&#xff0c;也是喜欢听着歌&#xff0c;敲着代码。 最近就想做一个音乐播放器的软件&#xff0c;在内网中使…...

在macOS上安装MySQL

macOS的MySQL有多种不同的形式&#xff1a; 1、本机包安装程序&#xff0c;它使用本机macOS安装程序&#xff08;DMG&#xff09;引导您完成MySQL的安装。有关详细信息&#xff0c;请参阅第2.4.2节&#xff0c;“使用本机包在macOS上安装MySQL”。您可以将包安装程序与macOS一…...

使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢

在 Vue 项目中&#xff0c;使用 Webpack 模板 和 vue.config.js 来配置相关插件的主要区别在于配置的复杂度、灵活性和易用性。以下是两者的详细对比&#xff1a; 1. Webpack 模板 Webpack 模板是 Vue CLI 早期版本&#xff08;如 Vue CLI 2.x&#xff09;中提供的项目初始化模…...

ansible-性能优化

一. 简述&#xff1a; 搞过运维自动化工具的人&#xff0c;肯定会发现很多运维伙伴们经常用saltstack和ansible做比较&#xff0c;单从执行效率上来说&#xff0c;ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解])&#xff0c;但其实…...

Nginx:认证与授权

认证(Authentication)和授权(Authorization)是确保 Web 应用安全的重要机制。Nginx 提供了多种方式来实现这些功能,以保护资源免受未授权访问。 认证(Authentication):验证用户的身份,确认请求来自合法用户。通常涉及用户名和密码、令牌或其他形式的身份验证。授权(A…...

【项目实战1】五子棋游戏

目录 C语言编程实现五子棋&#xff1a;&#xff1a; game.h game.c 1.打印菜单 2.打印棋盘 3.玩家下棋 4.判断五子连珠 5.判断输赢 6.游戏运行 game.c完整源代码展示 test.c C语言编程实现五子棋&#xff1a;&#xff1a; game.h #pragma once #include<stdio.h> …...

【VUE】a链接下载跨域文件直接打开而非下载(解决办法)

背景&#xff1a;a链接下载跨域文件时&#xff0c;浏览器默认会打开文件&#xff0c;而非直接下载 <a :href"url" :download"fileName">下载</a>data() {return {url: http://xxxxx.mp4,fileName: xxxxx.mp4} }解决方式 服务器设置HTTP请求头…...

消息队列RabbitMQ

目录 为什么需要消息队列? 什么是消息队列&#xff1f; 如何技术选型&#xff1f; WorkQueues模型 Fanout交换机 Direct交换机 Topic交换机 声明队列交换机 消息转换器 消息可靠性问题 1.发送者的可靠性 生产者重连 生产者确认 Spring AMQP生产者消费确认…...

Windows11环境下设置MySQL8字符集utf8mb4_unicode_ci

1.关闭MySQL8的服务CTRLshiftESC&#xff0c;找到MySQL关闭服务即可 2.找到配置文件路径&#xff08;msi版本默认&#xff09; C:\ProgramData\MySQL\MySQL Server 8.0 3.使用管理员权限编辑my.ini文件并保存 # Other default tuning values # MySQL Server Instance Config…...

css出现边框

前言 正常情况下&#xff0c;开启 contenteditable 属性后会出现 “黑色边框”。 如下图所示&#xff0c;很影响美观&#xff1a; 您可能想去掉它&#xff0c;就像下面这样&#xff1a; 解决方案 通过选择器&#xff0c;将 focus 聚焦时移除 outline 属性即可。 如下代码所示&a…...

Qt QDockWidget详解以及例程

Qt QDockWidget详解以及例程 引言一、基本用法二、深入了解2.1 窗口功能相关2.2 停靠区域限制2.3 在主窗体布局 引言 QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列)&#xff0c;也可以作为QMainWindow上的顶级窗口浮动 (类似一…...

node.js内置模块之---stream 模块

stream 模块的作用 在 Node.js 中&#xff0c;stream 模块是一个用于处理流&#xff08;stream&#xff09;的核心模块。流是一种处理数据的抽象方式&#xff0c;允许程序处理大量数据时不会一次性将所有数据加载到内存中&#xff0c;从而提高性能和内存效率。通过流&#xff0…...

EdgeX规则引擎eKuiper

EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…...

SpringBoot | 基于 MyBatis 的分页与模糊查询的开发模板

关注&#xff1a;CodingTechWork 引言 在开发 Web 应用时&#xff0c;常常需要处理复杂的查询需求&#xff0c;尤其是在涉及到用户管理功能时&#xff0c;分页查询和模糊查询是常见的需求之一。  本文将通过一个具体的示例&#xff0c;展示如何使用 MyBatis实现分页和模糊查…...

数据库(3)--针对列的CRUD操作

1.Create 新增 语法&#xff1a; insert into 表名 &#xff08;列名&#xff09;values &#xff08;列&#xff09;... 创建一个学生表用于演示&#xff1a; create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…...

利用Java爬取1688商品详情API接口:技术与应用指南

引言 1688作为中国领先的B2B电子商务平台&#xff0c;拥有海量的商品信息。对于商家和市场研究人员来说&#xff0c;能够从1688获取商品详情信息&#xff0c;对于市场分析、竞品研究等具有重要价值。本文将详细介绍如何使用Java编写爬虫程序&#xff0c;以合法、高效的方式获取…...

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一&#xff1a;可以使用管理员权限进行安装。方法二&#xff1a;更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发&#xff0c;今日着手准备开发一个新的 vue 项目时&#xff0c;在…...

git命令收集

强制丢弃所有修改&#xff0c;和仓库代码一致 git reset --hard 更新子模块 git submodule update每个子模块 重置到最新节点 git submodule foreach --recursive git reset --hard清除每个子模块未跟踪的文件 git submodule foreach --recursive git clean -fd清理未跟踪的…...

IDEA中Maven依赖包导入失败报红的潜在原因

在上网试了别人的八个问题总结之后依然没有解决&#xff1a; IDEA中Maven依赖包导入失败报红问题总结最有效8种解决方案_idea导入依赖还是报红-CSDN博客https://blog.csdn.net/qq_43705131/article/details/106165960 江郎才尽之后突然想到一个原因&#xff1a;<dep…...

c/c++ 里的进程间通信 , 管道 pipe 编程举例

&#xff08;1&#xff09;以下是一个网上的使用 pipe 编程的范例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h>int main() {int pipefd…...

【Java】JVM内存相关笔记

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些区域则是依赖用户线程的启动和结束而建立和销毁。 程序计数器&am…...

[项目实战2]贪吃蛇游戏

目录 贪吃蛇游戏&#xff1a;&#xff1a; 一、游戏效果及功能实现&#xff1a; 1.规则 ​​​​​​​ ​​​​​​​ ​​​​​​​ 2.基本功能实现 ​​​​​​​ ​​​​​​​ ​​​​​​​ 3.技术要点 ​​​​​​​…...

PySide6的样式表

PySide6 提供了对 Qt 样式表&#xff08;Qt Style Sheets&#xff0c;简称 QSS&#xff09;的支持&#xff0c;这是一种类似于 CSS 的样式表语言&#xff0c;用于自定义 Qt 应用程序的外观。 1. 什么是 Qt 样式表&#xff08;QSS&#xff09; Qt 样式表是一种声明性的样式表语…...

计算机网络之---局域网

什么叫局域网 局域网&#xff08;LAN&#xff0c;Local Area Network&#xff09; 是指在一个相对较小的区域内&#xff0c;如家庭、办公室、学校、企业等&#xff0c;连接多个计算机和设备的网络。局域网的特点是覆盖范围小、传输速度快、构建成本较低。 局域网的主要特点&…...

使用 uniapp 开发微信小程序遇到的坑

0. 每次修改代码时&#xff0c;都会触发微信开发工具重新编译 终极大坑&#xff0c;暂未找到解决方案 1. input 无法聚焦问题 问题&#xff1a;在小程序开发工具中&#xff0c;input 会突然无法聚焦&#xff0c;重启也不行。但是真机调试可以正常聚焦。 解决办法&#xff1a…...

基于 GEE Sentinel-1 数据集提取水体

目录 1 水体提取原理 2 完整代码 3 运行结果 1 水体提取原理 水体提取是地理信息和遥感技术的关键应用之一&#xff0c;对于多个领域都具有重要的应用价值。它有助于更好地管理水资源&#xff0c;保护环境&#xff0c;减少灾害风险&#xff0c;促进可持续发展&#xff0c;以…...

2025-01-07 Unity 使用 Tip3 —— 游戏保存数据到 Application.persistentDataPath 不生效解决方案更新

文章目录 1 问题描述2 老版解决方案&#xff08;测试可行&#xff09;2.1 创建 js 脚本2.2 添加 js 引用 3 新版解决方案&#xff08;测试不可行&#xff09;4 实际问题 ​ WebGL 平台限制了文件访问系统&#xff0c;在 Unity 以前版本中&#xff0c;开发者想要在 WebGL 上保存…...

关于重构一点简单想法

关于重构一点简单想法 当前工作的组内&#xff0c;由于业务开启的时间正好处于集团php-》go技术栈全面迁移的时间点&#xff0c;组内语言技术栈存在&#xff1a;php、go两套。 因此需求开发过程中通常要考虑两套技术栈的逻辑&#xff0c;一些基础的逻辑也没有办法复用。 在这…...

使用 `llama_index` 构建智能问答系统:多种文档切片方法的评估

使用 llama_index 构建智能问答系统&#xff1a;多种文档切片方法的评估 代码优化与解析1. **代码结构优化**2. **日志管理**3. **环境变量管理**4. **模型初始化**5. **提示模板更新**6. **问答函数优化**7. **索引构建与查询引擎**8. **节点解析器测试** 总结 在现代自然语言…...

Vue3 内置组件之KeepAlive

文章目录 Vue3 内置组件之KeepAlive概述用法简单使用include & excludemax Vue3 内置组件之KeepAlive 概述 <KeepAlive> 是一个内置组件&#xff0c;它的功能是在多个组件间动态切换时缓存被移除的组件实例。 组件在加载时会经历初始、挂载、更新、销毁生命周期&a…...

生物医学信号处理--绪论

前言 参考书籍&#xff1a;刘海龙&#xff0c;生物医学信号处理&#xff0c;化学工业出版社 生物医学信号分类 1、由生理过程自发或者诱发产生的电生理信号和非电生理信号 • 电生理信号&#xff1a;ECG/心电、EEG/脑电、EMG/肌电、 EGG/胃电、 EOG/眼电 • 非电生理信号&am…...

30天开发操作系统 第 12 天 -- 定时器

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…...

android 启动页倒计时页面编写

一、需求和技术 1、实现5,4,3,2,1启动页倒计时 2、倒计时实现使用CountDownTimer 二、activity代码 public class OpenActivity extends AppCompatActivity {private Button in;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanc…...