用VS软件开发“浪漫烟花“<笔记摘录>

news2024/11/26 0:33:08

此处主要讲:如何开发一个连续的烟花弹上升并进行烟花爆炸的程序.

第一步自然是创建窗口,设置窗口宽度为1200,高度为800(#include <graphics.h>)

	initgraph(1200, 800);//创建窗口,宽度1200,高度800

 第二步我们需要为这个窗口添加背景音乐,这里我们添加了一首"周杰伦的告白气球.mp3",打开并且播放.因为我们并不需要暂停或者关闭,所以便注释掉对应的程序.

注意,添加音乐的时候要记住添加头文件

#include<mmsystem.h>//媒体头文件

#pragma comment(lib,"winmm.lib")//媒体库文件
	mciSendString("open 告白气球.mp3",0,0,0);
	mciSendString("play 告白气球.mp3", 0, 0, 0);
	//mciSendString("pause 周杰伦 - 告白气球(Live).mp3", 0, 0, 0);
	//mciSendString("close 周杰伦 - 告白气球(Live).mp3", 0, 0, 0);

第三步我们开始在窗口上面添加文本,记不记得学习C++的第一个程序,"hello,world!"

这里类同,只不过是讲对应的文本输入到窗口对应的位置.程序如下:

	settextcolor(YELLOW);//设置字体的颜色
	settextstyle(25,0,"微软雅黑");//设置字体的字号					 
	//outtextxy(320,240,"赵哥真帅");//在创建的窗口,(320,240)的位置的输入赵哥真帅
	outtextxy(400, 200, "XXXXXXXXXX");
	outtextxy(400, 250, "XXXXXXXXXX");
	outtextxy(400, 300, "XXXXXXXXXX");
	outtextxy(400, 350, "XXXXXXXXXX");
	outtextxy(400, 400, "XXXXXXXXXX");
	outtextxy(600, 450, "------小子");

然后在显示的时候,我们可以给这段文本延时5s

	Sleep(5000);

文本结束后,就开始进入烟花弹和烟花的爆炸现场.

第四步,定义烟花弹和烟花

//烟花弹
struct Jet//烟花弹属性
{
	int x, y;//当前坐标
	int hx, hy;//最高点的坐标
	unsigned long t1, t2, dt;//时间来控制速度
	IMAGE img;//保存烟花弹的图片
	bool isshoot;//烟花弹是否属于正在上升的状态
}jet;

//烟花
struct Fire//从中心往外面进行拓展
{
	int r;//当前半径
	int maxr;//最大半径
	int x, y;//中心点的左边//窗口
	int cx, cy;//中心点左边,坐标系不同//图片
	int xy[240][240];   //保存图片当中每一个像素点
	bool isboom;//是否开始爆炸
	bool isdram;//是否开始显示
	unsigned long t1, t2, dt; //爆炸的速度
}fire;

简单解释:烟花弹属性包括了他的当前坐标和最高坐标,因为烟花弹是垂直向上的,所以速度,采用时间t1,t2和dt来进行描述,IMAGE用来保存烟花弹的图片.并定义一个布尔类型isshoot,判断烟花弹是否处于上升状态

关于IMAGE函数的有关解释,可以参考:EasyX 文档 - IMAGE

烟花的基本属性在于:要明白烟花爆炸是从一个中心点,向外速度越来越慢地拓展开来的,因此我们定义烟花的当前半径和最大半径,烟花爆炸的点相对于窗口的坐标,和烟花爆炸上面点相对于图片的坐标,及其设定一个二维数组用于保存图片当中每一个像素点.最后定义两个布尔类型,判断烟花是否爆炸和显示.

第五步 初始化烟花弹和烟花

//初始化烟花弹
void startjet()
{
	jet.x = rand() % (1200 - 20);
	jet.y = 750;
	jet.hx = jet.x;//垂直上升
	jet.hy = rand() % 400;//0-399爆炸
	jet.t1 = GetTickCount(); //获取系统时间
	jet.dt = 10;//dt  10ms
	jet.isshoot = true;
	loadimage(&jet.img, "jet.jpg", 20, 50);
	putimage(jet.x, jet.y, &jet.img, SRCINVERT);
}

//初始化烟花
void startfire() {
	fire.r=0;//当前半径
	fire.maxr=120;//最大半径
	fire.x=0, fire.y=0;//中心点的左边//窗口//等于烟花弹最高点的坐标
	fire.cx=120, fire.cy=120;//中心点左边,坐标系不同//图片
	fire.isboom=false;//是否开始爆炸
	fire.isdram=false;//是否开始显示
	fire.t1 = GetTickCount();
	fire.dt = 5; //爆炸的速度
	fire.xy[239][239];   //保存图片当中每一个像素点
	IMAGE fimg;
	loadimage(&fimg, "flower.jpg", 240,240);

	SetWorkingImage(&fimg);//获取fimg地址的图片
	for (int a = 0; a < 240; a++)//把图片的所有像素点定义在一个数组当中
	{
		for (int b = 0; b < 240; b++)
		{
			fire.xy[a][b]=getpixel(a, b);//窗口获取(a,b)像素点

		}
	}
	SetWorkingImage();//放开对应的图片
}

其次对应上面定义的烟花和烟花弹的结构,对其进行初始状态定义.此处要注意,烟花和烟花弹图片显示的方式不同,烟花弹是作为一个整体,垂直上升的,而烟花是从一个点,爆炸开来的,显示的是每一个范围的像素图.

第六步 发射烟花弹

void shootjet()
{
	//biubiubiu
	jet.t2 = GetTickCount();//t2
	if (jet.t2 - jet.t1 > jet.dt && jet.isshoot == true)
	{
		putimage(jet.x, jet.y, &jet.img, SRCINVERT);

		if (jet.y > jet.hy)//停止在这个烟花的最高位置附近,然后要准备进行爆炸
			jet.y -= 5;
		putimage(jet.x, jet.y, &jet.img, SRCINVERT);//y-5之后再演示烟花弹下一个位置

		if (jet.y <= jet.hy)//到达最高点了
		{
			//擦除烟花弹
			putimage(jet.x, jet.y, &jet.img, SRCINVERT);
			fire.isboom = true;//开始爆炸烟花
			jet.isshoot = false;
			fire.x = jet.x;
			fire.y = jet.y+10;
			//showfire(pMem);

		}
		if (jet.isshoot == false)
		{
			//再次初始化烟花弹
			startjet();
			//fire.isdram = false;
		}
		jet.t1 = jet.t2;
	}
}

当到达最高点的时候,要将烟花弹擦除,并且记录下此时的坐标,将其赋给烟花相对于窗口的中心点坐标,开始爆炸烟花,如果烟花弹的上升状态转换为false了,那么便再设定一个新的发射烟花弹函数,也就是回溯的调用,最后要记住循环完,将t2的数值赋值给t1;确保能够一直循环运行下去.

运行到这里,就可以看到一个又一个烟花弹上升并擦除的界面了.

第七步  烟花爆炸

先设定一个时间数组,用来控制自内向外爆炸的时间长度,越往外面速度越慢

//爆炸烟花
void showfire(DWORD *pMem)
{
	//dt数组
//爆炸速度:在半径小的时候爆炸特别快
//半径越大,爆炸越来越慢
	int drt[12] = { 5,5,5,6,6,15,25,25,25,55,55,65 };//12个为什么?120%10
	fire.t2 = GetTickCount();
	if (fire.t2 - fire.t1 > fire.dt && fire.isboom == true)
	{
		if (fire.r < fire.maxr)
		{
			fire.r++;//半径不断地变大
			fire.dt = drt[fire.r / 10];
			fire.isdram = true;
		}
		if (fire.r >= fire.maxr - 1)
		{
			fire.isdram = false;
			fire.isboom = false;
			fire.dt = 5;
			fire.t1 = GetTickCount();
			fire.r = 0;
		}
		fire.t1 = fire.t2;
	}
	if (fire.isdram == true)//可以开始绘制
	{
		//628次  2Π
		for (double a = 0; a <= 6.28; a += 0.01)
		{
			//相对于图片左上角的坐标
			int x1 = fire.cx + fire.r * cos(a);
			int y1 = fire.cy - fire.r * sin(a);
			//x1 y1  628个来自于图片的像素点坐标<240
			fire.xy[x1][y1];//存储上面的像素点坐标
			
			if (x1 > 0 && x1 < 240 && y1>0 && y1 < 240 )   //图片像素是240*240,所以只输出像素内的点
			{
				int b = fire.xy[x1][y1] & 0xff;
				int g = (fire.xy[x1][y1] >> 8) & 0xff;
				int r = (fire.xy[x1][y1] >> 16);
				//烟花像素点在窗口上的坐标
				int xx = fire.x + fire.r * cos(a);
				int yy = fire.y - fire.r * sin(a);
				// 较暗的像素点不输出、防止越界
				if (r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 1200 && yy > 0 && yy < 800)
					pMem[yy * 1200 + xx] = BGR(fire.xy[x1][y1]);	// 显存操作绘制烟花

			}

		}
	}

	fire.isdram = false;
}

如果fire.isdram==true的时候,也就是可以开始绘制爆炸烟花了.循环当中采用了数学函数,可以定义到每一个像素点的坐标,然后再根据前面烟花弹停止上升的最高点,来确定烟花像素点在窗口上的坐标.设定一个条件判断,如果像素点较暗,则不输出,其他像素点输出.

最后在每一次循环结束的时候要将isdram设置成false

最后,运行主函数

int main()
{
	srand(time(0));
	initgraph(1200, 800);//创建窗口,宽度1200,高度800
	
	mciSendString("open 告白气球.mp3",0,0,0);
	mciSendString("play 告白气球.mp3", 0, 0, 0);
	//mciSendString("pause 周杰伦 - 告白气球(Live).mp3", 0, 0, 0);
	//mciSendString("close 周杰伦 - 告白气球(Live).mp3", 0, 0, 0);
	//mci send  string  

	settextcolor(YELLOW);//设置字体的颜色
	settextstyle(25,0,"微软雅黑");//设置字体的字号					 
	//outtextxy(320,240,"赵哥真帅");//在创建的窗口,(320,240)的位置的输入赵哥真帅
	outtextxy(400, 200, "XXXXXXXXXX");
	outtextxy(400, 250, "XXXXXXXXXX");
	outtextxy(400, 300, "XXXXXXXXXX");
	outtextxy(400, 350, "XXXXXXXXXX");
	outtextxy(400, 400, "XXXXXXXXXX");
	outtextxy(600, 450, "------小子");
	
	int uuu=getchar();//按回车键继续
	Sleep(5000);
	//DWORD st1 = timeGetTime();			// 播放花样计时
	DWORD* pMem = GetImageBuffer();		// 获取窗口显存指针
	//初始化烟花弹
	startjet();
	//初始化烟花
	startfire();
	while (1)
	{
			Sleep(1);
			// 随机选择 4000 个像素点擦除
			for (int clr = 0; clr < 2000; 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;	// 对显存赋值擦出像素点

					//Style(st1);
				}
				shootjet();
			
				showfire(pMem);

			}
			//Style(st1);
			FlushBatchDraw();	// 显示前面的所有绘图操作
		
	}
	

	while (1);
	return 0;
}

总代码和相关素材如下:

#pragma warning(disable:4996)//忽略4996错误提示
#pragma comment(linker,"/entry:mainCRTStartup /subsystem:windows")
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <easyx.h>//图形界面库
#include<time.h>
#include<math.h>
#include<string.h>
//歌曲需要的头文件
#include<mmsystem.h>//媒体头文件

#pragma comment(lib,"winmm.lib")//媒体库文件
//烟花弹
struct Jet//烟花弹属性
{
	int x, y;//当前坐标
	int hx, hy;//最高点的坐标
	unsigned long t1, t2, dt;//时间来控制速度
	IMAGE img;//保存烟花弹的图片
	bool isshoot;//烟花弹是否属于正在上升的状态
}jet;

//烟花
struct Fire//从中心往外面进行拓展
{
	int r;//当前半径
	int maxr;//最大半径
	int x, y;//中心点的左边//窗口
	int cx, cy;//中心点左边,坐标系不同//图片
	int xy[240][240];   //保存图片当中每一个像素点
	bool isboom;//是否开始爆炸
	bool isdram;//是否开始显示
	unsigned long t1, t2, dt; //爆炸的速度
}fire;

//初始化烟花弹
void startjet()
{
	jet.x = rand() % (1200 - 20);
	jet.y = 750;
	jet.hx = jet.x;//垂直上升
	jet.hy = rand() % 400;//0-399爆炸
	jet.t1 = GetTickCount(); //获取系统时间
	jet.dt = 10;//dt  10ms
	jet.isshoot = true;
	loadimage(&jet.img, "jet.jpg", 20, 50);
	putimage(jet.x, jet.y, &jet.img, SRCINVERT);
}

//初始化烟花
void startfire() {
	fire.r=0;//当前半径
	fire.maxr=120;//最大半径
	fire.x=0, fire.y=0;//中心点的左边//窗口//等于烟花弹最高点的坐标
	fire.cx=120, fire.cy=120;//中心点左边,坐标系不同//图片
	fire.isboom=false;//是否开始爆炸
	fire.isdram=false;//是否开始显示
	fire.t1 = GetTickCount();
	fire.dt = 5; //爆炸的速度
	fire.xy[239][239];   //保存图片当中每一个像素点
	IMAGE fimg;
	loadimage(&fimg, "flower.jpg", 240,240);

	SetWorkingImage(&fimg);//获取fimg地址的图片
	for (int a = 0; a < 240; a++)//把图片的所有像素点定义在一个数组当中
	{
		for (int b = 0; b < 240; b++)
		{
			fire.xy[a][b]=getpixel(a, b);//窗口获取(a,b)像素点

		}
	}
	SetWorkingImage();//放开对应的图片
}

//发射烟花弹
void shootjet()
{
	//biubiubiu
	jet.t2 = GetTickCount();//t2
	if (jet.t2 - jet.t1 > jet.dt && jet.isshoot == true)
	{
		putimage(jet.x, jet.y, &jet.img, SRCINVERT);

		if (jet.y > jet.hy)//停止在这个烟花的最高位置附近,然后要准备进行爆炸
			jet.y -= 5;
		putimage(jet.x, jet.y, &jet.img, SRCINVERT);//y-5之后再演示烟花弹下一个位置

		if (jet.y <= jet.hy)//到达最高点了
		{
			//擦除烟花弹
			putimage(jet.x, jet.y, &jet.img, SRCINVERT);
			fire.isboom = true;//开始爆炸烟花
			jet.isshoot = false;
			fire.x = jet.x;
			fire.y = jet.y+10;
			//showfire(pMem);

		}
		if (jet.isshoot == false)
		{
			//再次初始化烟花弹
			startjet();
			//fire.isdram = false;
		}
		jet.t1 = jet.t2;
	}
}
//爆炸烟花
void showfire(DWORD *pMem)
{
	//dt数组
//爆炸速度:在半径小的时候爆炸特别快
//半径越大,爆炸越来越慢
	int drt[12] = { 5,5,5,6,6,15,25,25,25,55,55,65 };//12个为什么?120%10
	fire.t2 = GetTickCount();
	if (fire.t2 - fire.t1 > fire.dt && fire.isboom == true)
	{
		if (fire.r < fire.maxr)
		{
			fire.r++;//半径不断地变大
			fire.dt = drt[fire.r / 10];
			fire.isdram = true;
		}
		if (fire.r >= fire.maxr - 1)
		{
			fire.isdram = false;
			fire.isboom = false;
			fire.dt = 5;
			fire.t1 = GetTickCount();
			fire.r = 0;
		}
		fire.t1 = fire.t2;
	}
	if (fire.isdram == true)//可以开始绘制
	{
		//628次  2Π
		for (double a = 0; a <= 6.28; a += 0.01)
		{
			//相对于图片左上角的坐标
			int x1 = fire.cx + fire.r * cos(a);
			int y1 = fire.cy - fire.r * sin(a);
			//x1 y1  628个来自于图片的像素点坐标<240
			fire.xy[x1][y1];//存储上面的像素点坐标
			
			if (x1 > 0 && x1 < 240 && y1>0 && y1 < 240 )   //图片像素是240*240,所以只输出像素内的点
			{
				int b = fire.xy[x1][y1] & 0xff;
				int g = (fire.xy[x1][y1] >> 8) & 0xff;
				int r = (fire.xy[x1][y1] >> 16);
				//烟花像素点在窗口上的坐标
				int xx = fire.x + fire.r * cos(a);
				int yy = fire.y - fire.r * sin(a);
				// 较暗的像素点不输出、防止越界
				if (r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 1200 && yy > 0 && yy < 800)
					pMem[yy * 1200 + xx] = BGR(fire.xy[x1][y1]);	// 显存操作绘制烟花

			}

		}
	}

	fire.isdram = false;
}


// 显示花样  //本程序不显示
void Style(DWORD& st1)
{
	DWORD st2 = timeGetTime();

	if (st2 - st1 > 2000)		// 一首歌的时间
	{
		// 心形坐标
		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 < 13; i++)
		{
			//cleardevice();
			/**** 规律分布烟花弹 ***/
			jet.x = x[i] * 10;
			jet.y = (y[i] + 75) * 10;
			jet.hx = jet.x;
			jet.hy = y[i] * 10;
			jet.isshoot = true;
			jet.dt = 5;
			putimage(jet.x, jet.y, &jet.img, SRCINVERT);	// 显示烟花弹

			/**** 设置烟花参数 ***/
			fire.x = jet.x + 10;
			fire.y = jet.hy;
			//fire.isdram = false;
			//fire.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()
{
	srand(time(0));
	initgraph(1200, 800);//创建窗口,宽度1200,高度800
	
	mciSendString("open 告白气球.mp3",0,0,0);
	mciSendString("play 告白气球.mp3", 0, 0, 0);
	//mciSendString("pause 周杰伦 - 告白气球(Live).mp3", 0, 0, 0);
	//mciSendString("close 周杰伦 - 告白气球(Live).mp3", 0, 0, 0);
	//mci send  string  

	settextcolor(YELLOW);//设置字体的颜色
	settextstyle(25,0,"微软雅黑");//设置字体的字号					 
	//outtextxy(320,240,"赵哥真帅");//在创建的窗口,(320,240)的位置的输入赵哥真帅
	outtextxy(400, 200, "XXXXXXXXXX");
	outtextxy(400, 250, "XXXXXXXXXX");
	outtextxy(400, 300, "XXXXXXXXXX");
	outtextxy(400, 350, "XXXXXXXXXX");
	outtextxy(400, 400, "XXXXXXXXXX");
	outtextxy(600, 450, "------小子");
	
	int uuu=getchar();//按回车键继续
	Sleep(5000);
	//DWORD st1 = timeGetTime();			// 播放花样计时
	DWORD* pMem = GetImageBuffer();		// 获取窗口显存指针
	//初始化烟花弹
	startjet();
	//初始化烟花
	startfire();
	while (1)
	{
			Sleep(1);
			// 随机选择 4000 个像素点擦除
			for (int clr = 0; clr < 2000; 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;	// 对显存赋值擦出像素点

					//Style(st1);
				}
				shootjet();
			
				showfire(pMem);

			}
			//Style(st1);
			FlushBatchDraw();	// 显示前面的所有绘图操作
		
	}
	

	while (1);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【使用 BERT 的问答系统】第 1 章 : 自然语言处理简介

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【车间调度】基于模拟退火优化算法的的并行车间机器优化调度(Matlab代码实现)

目录 1 概述 2并行机调度问题的的描述 3 模拟退火法 4 基于模拟退火优化算法的的并行车间机器优化调度&#xff08;Matlab代码实现&#xff09; 4.1 运行结果 5 参考文献 6 Matlab代码 1 概述 并行机调度&#xff08;也称并行多机调度, Parallel MachinesScheduling Prob…

你不知道的npm

npm 前端工程化离不开 npm&#xff08;node package manager&#xff09; 或者 Yarn 这些管理工具。npm 或 Yarn 在工程项目中&#xff0c;除了负责依赖的安装和维护以外&#xff0c;还能通过 npm scripts 串联起各个职能部分&#xff0c;让独立的环节自动运转起来。 npm诞生…

跨平台.NET应用UI组件DevExpress XAF v22.1 - 增强Web API Service

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。&#xff…

Web进阶

目录 DOM节点操作&#xff08;上&#xff09; 一、任务目标 二、任务背景 三、任务内容 1、DOM结构及节点 DOM节点操作&#xff08;下&#xff09; 一、任务目标 二、任务背景 三、任务内容 1、DOM修改 DOM控制CSS样式 一、任务目标 二、任务背景 三、任务内容 …

达摩院快速动作识别TPS ECCV论文深入解读

一、论文&代码 论文&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136630615.pdf 模型&代码&#xff1a;ModelScope 魔搭社区 二、背景 高效的时空建模(Spatiotemporal modeling)是视频理解和动作识别的核心问题。相较于图像的Transforme…

ArrayList源码分析

ArrayList源码分析 注意:本笔记分析对象为 Java8 版本,随版本不同,源码会发生变化。 1 ArrayList类图与简介 ArrayList是一个 非线程安全,基于数组实现的一个动态数组。可以看到,它的顶层接口是 Collection<E> 集合类。 Note: ArrayList 可以存放所有元素,包括 n…

C语言详细知识点(下)

⛄️上一篇⛄️C语言详细知识点&#xff08;上&#xff09; 文章目录五、数组1、一维数组的定义及使用2、二维数组的定义及使用3、字符数组的定义及使用六、函数1、函数的定义2、函数的调用3、函数的声明4、函数的嵌套调用5、函数的递归调用七、指针1、什么是指针2、指针变量3、…

如何用蓝牙实现无线定位(二)--信号塔设置

1. 配置BLE4.0模块 根据三点定位原理&#xff0c;本项目需要使用3个信号塔。3个信号塔的主体均为BLE4.0模块&#xff0c;需要把BLE4.0模块的AT指令设置为“从设备”。 方法为&#xff1a; &#xff08;1&#xff09;给控制板刷一套空的程序。初始打开arduino IDE或新建&#x…

RabbitMQ事务消息

通过对信道的设置实现 channel.txSelect()&#xff1b;通知服务器开启事务模式&#xff1b;服务端会返回Tx.Select-Ok channel.basicPublish&#xff1b;发送消息&#xff0c;可以是多条&#xff0c;可以是消费消息提交ackchannel.txCommit() &#xff1b;提交事务&#xff1b;…

Devkit开发框架插件工具——Gzip工程创建

Devkit开发框架插件工具——Gzip工程创建 基于鲲鹏亲和开发框架进行原生开发&#xff0c;创建通用计算功能。 二、 操作前提。 1、 在鲲鹏社区申请远程实验室&#xff0c;操作系统选择OpenEuler。 点击链接&#xff1a;鲲鹏社区-官网丨凝心聚力 共创行业新价值&#xff0c;打…

[附源码]Python计算机毕业设计Django的网上点餐系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

蓝牙耳机什么牌子音质最好?高音质蓝牙耳机盘点

如今蓝牙耳机是越来越获得大众的喜爱了&#xff0c;越来越多的年轻人都离不开它了&#xff0c;很多人在买耳机的时候会在意蓝牙耳机的音质&#xff0c;毕竟在自己的耳朵里面听到完美的音乐还是很重要的。下面为大家介绍几款音质超赞的无线蓝牙耳机。 1、南卡小音舱 蓝牙版本&…

关于使用图表控件LightningChart的十大常见问题及解答

LightningChart是芬兰的一款高性能图表开发控件&#xff0c;其中的LightningChart .NET支持实时可视化1万亿个数据点&#xff0c;且可以直接用于.NET WinForms、WPD、传统的Win32 C的应用程序中&#xff1b;而LightningChart JS是一款性能极高的JavaScript图表库&#xff0c;专…

如何设计高可用架构

高可用复杂度模型 计算高可用 任务分配 将任务分配给多个服务器执行 复杂度分析 增加“任务分配器”节点&#xff0c;可以是独立的服务器&#xff0c;也可以是SDK任务分配器需要管理所有的服务器&#xff0c;可以通过配置文件&#xff0c;也可以通过配置服务器&#xff08;例…

2023 年 10 大 Web 开发趋势

公司的在线形象是最重要的。您使用的平台越多&#xff0c;您就会变得越成功&#xff01;拥有在线形象的困难部分是脱颖而出。如果你没有有趣的东西可以提供&#xff0c;你会迷失在人群中。 除了网站具有的基本功能外&#xff0c;您还需要拥有更多功能才能使您的网站具有可持续…

基于BDD的接口自动化框架开箱即用

1、背景说明 项目思想&#xff1a;BDD 行为驱动开发的思想褒贬不一&#xff0c;这里不多说。遵循的宗旨能解决业务痛点的思想就是好思想。 接口测试工具在实际的业务测试场景中往往会遇到一些使用上的局限性&#xff0c;自定义扩展要求技术较高&#xff0c;如果二次开发工具…

平安康养的生意经:养老的壳,金融的核

图片来源Unsplash 文丨螳螂观察 作者丨陈淼 根据第七次人口普查数据&#xff0c;我国60岁及以上老年人口占总人口的比重为18.7%&#xff0c;人口结构即将进入中度老龄化。而伴随着社会老龄化趋势的加剧&#xff0c;背后的养老市场也在迎来巨大的商业化增长。 现阶段&#x…

下班路上捡了一部手机,我用8年开发知识主动找到了失主

☆ 我们学习开发知识&#xff0c;其实并不是只解决当前用户的需求&#xff0c;实现UI原型的还原&#xff0c;不应该只把自己嵌套在当前的浏览器或者某个docker的环境下。 因为不管你在tomcat或者数据库里折腾得再欢&#xff0c;可能到了生活中发现自己失去了超能力。 ☆ 记得有…

校园论坛(Java)——环境配置篇

校园论坛&#xff08;Java&#xff09;——环境配置篇 文章目录校园论坛&#xff08;Java&#xff09;——环境配置篇1、写在前面2、新建Maven项目2.1 引入相关依赖2.2 配置Tomcat环境3、项目发布测试4、项目代码5、参考资料1、写在前面 Windows版本&#xff1a;Windows10JDK版…