怎么用C语言给喜欢的人写烟花

技术怎么用C语言给喜欢的人写烟花本篇内容主要讲解“怎么用C语言给喜欢的人写烟花”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C语言给喜欢的人写烟花”吧!一、结构体首先当

本文主要讲解“如何用C语言为喜欢的人写烟花”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习“如何用C语言为喜欢的人写烟花”!

00-1010首先当然是我们的老朋友结构。艺术字结构就不用多说了。我应该知道写什么。

//烟花结构

structure fire

{

intr//当前爆炸半径

int max _ r;//爆炸中心距边缘的最大半径

intx,y;//窗口中爆炸中心的坐标

intcen_x,cen _ y;//爆炸中心相对于图片左上角的坐标

宽度、高度;//图片的宽度和高度

int xy[240][240];//存储图片像素

布尔肖;//开花了吗?

booldraw//开始输出像素

DWORDt1、t2、dt;//开花速度

} Fire[NUM];

//烟花弹结构

structure jet

{

intx,y;//注入点坐标

inthx,hy;//最高点的坐标-将被分配给FIRE中的x,y。

八分之一;//烟花高度

boolshoot//可以发射吗?

DWORDt1、t2、dt;//发射速度

IMAGEimg[2];//保存一张明暗花炸弹的图片

byten:1//图片下标

} Jet[NUM];

//快乐生日艺术字结构

结构快乐//保存快乐生日艺术字图片

{

intx,y;//每个单词图片左上角的坐标

IMAGEimg//保存单个单词图片

staticintnum//字母序列号

}快乐[NUM];00-1010初始化烟花参数,完成所有准备工作。

//初始化fireworks参数

无效初始化

{

//分别是:烟花中心到图片边缘的最远距离和烟花中心到图片左上角的距离(x,y)。

intr[13]={120,120,155,123,130,147,138,138,130,135,140,132,155 };

intx[13]={120,120,110,117,110,93,102,102,110,105,100,108,110 };

inty[13]={120,120,85,118,120,103,105,110,110,120,120,104,85 };

/* * * * *初始化烟花* * * */

开火。x=0;//烟花中心坐标

开火。y=0;

开火。宽度=240;//图片宽度

开火。高度=240;//图像高度

开火。max _ r=r[I];//最大半径

开火。cen _ x=x[I];//从中心到左上角的距离

开火。cen _ y=y[I];

开火。show=false//开花了吗?

火[我]

.dt = 5; // 绽放时间间隔
Fire[i].t1 = timeGetTime();
Fire[i].r = 0; // 从 0 开始绽放
 
/**** 初始化烟花弹 *****/
 
Jet[i].x = -240; // 烟花弹左上角坐标
Jet[i].y = -240;
Jet[i].hx = -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; // 是否发射
}

三、烟花加载函数

加载图片,储存烟花的像素点颜色

// 加载图片
void Load()
{
/**** 储存烟花的像素点颜色 ****/
	IMAGE fm, gm;
	loadimage( &fm, "./fire/flower.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].xy[a][b] = getpixel( a, b );
	}
 
	IMAGE sm;
	loadimage( &sm, "./fire/shoot.jpg", 200, 50 );
 
	for ( 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 );
	}
 
	IMAGE hm;
	loadimage( &hm, "./fire/happy.jpg", 689, 115 );
	SetWorkingImage( &hm );
 
	for ( i = 0; i < 13; i++ )
	{
		Happy[i].x = i * 90;
		Happy[i].y = rand() % 100 + 500;
		getimage( &Happy[i].img, i * 53, 0, 53, 115 );
	}
 
	Wish.x		= 0;
	Wish.y		= 100;
	Wish.t1		= timeGetTime();
	Wish.dt		= 46;
	Wish.dir	= 0;
	Wish.dxy	= rand() % 8 + 1;
	loadimage( &Wish.img, "./fire/yaojing.jpg", 490, 100 );
	putimage( Wish.x, Wish.y, &Wish.img, SRCINVERT );
 
	SetWorkingImage();
}

四、烟花发射函数

扫描烟花弹并发射,控制开始与停止发射

// 扫描烟花弹并发射
void 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].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT );
 
			if ( Jet[i].y > Jet[i].hy )
			{
				Jet[i].n++;
				Jet[i].y -= 5;
			}
 
			putimage( Jet[i].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT );
 
			/**** 上升到高度的 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.wav 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].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT );	// 擦掉烟花弹
				Fire[i].x = Jet[i].hx + 10;											// 在烟花弹中间爆炸
				Fire[i].y = Jet[i].hy;												// 在最高点绽放
				Fire[i].show = true;					// 开始绽放
				Jet[i].shoot = false;					// 停止发射
 
				// 显示对应字母
				putimage( Happy[HAPPY::num].x, Happy[HAPPY::num].y, &Happy[HAPPY::num].img, SRCINVERT );
				HAPPY::num++;
 
				if ( HAPPY::num > 12 )
					HAPPY::num = 0;
			}
			Jet[i].t1 = Jet[i].t2;
		}
	}
}

五、烟花显示函数

显示花样,如何让烟花变得更好看

// 显示花样
void Style( DWORD& st1 )
{
	DWORD st2 = timeGetTime();
 
	if ( st2 - st1 > 266000 )		// 一首歌的时间
	{
		// 心形坐标
		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 < NUM; i++ )
		{
			cleardevice();
			/**** 规律分布烟花弹 ***/
			Jet[i].x		= x[i] * 10;
			Jet[i].y		= ( y[i] + 75 ) * 10;
			Jet[i].hx		= Jet[i].x;
			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].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT );	// 显示烟花弹
 
			/**** 设置烟花参数 ***/
			Fire[i].x		= Jet[i].x + 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;
	}
}

六、烟花绽放函数

绽放烟花,烟花个阶段绽放时间间隔,制作变速绽放效果等等,这里大家也可以自己去优化,去增加自己的东西

// 绽放烟花
void 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].max_r )
			{
				Fire[i].r++;
				Fire[i].dt = drt[Fire[i].r / 10];
				Fire[i].draw = true;
			}
 
			if ( Fire[i].r >= Fire[i].max_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 x1 = (int)( Fire[i].cen_x + Fire[i].r * cos(a) );				// 相对于图片左上角的坐标
				int y1 = (int)( Fire[i].cen_y - Fire[i].r * sin(a) );
 
				if ( x1 > 0 && x1 < Fire[i].width && y1 > 0 && y1 < Fire[i].height )	// 只输出图片内的像素点
				{
					int b = Fire[i].xy[x1][y1] & 0xff;
					int g = ( Fire[i].xy[x1][y1] >> 8 ) & 0xff;
					int r = ( Fire[i].xy[x1][y1] >> 16 );
 
					// 烟花像素点在窗口上的坐标
					int xx = (int)( Fire[i].x + Fire[i].r * cos(a) );
					int yy = (int)( Fire[i].y - Fire[i].r * sin(a) );
 
					// 较暗的像素点不输出、防止越界
					if ( r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 1200 && yy > 0 && yy < 800 )
						pMem[yy * 1200 + xx] = BGR( Fire[i].xy[x1][y1] );	// 显存操作绘制烟花
				}
			}
			Fire[i].draw = false;
		}
	}
}

七、主函数

// 主函数
void main()
{
	initgraph( 1200, 800 );
	srand( time(0) );
 
	// 播放背景音乐
	mciSendString( "open ./fire/bk.mp3 alias bk", 0, 0, 0 );
	mciSendString( "play bk repeat", 0, 0, 0 );
 
	setfillstyle( 0	);
	setfont		( 36, 0, "楷体"	);
	setcolor	( YELLOW );
	outtextxy	( 370, 100, "yy滺滺__出厂 .... ^_^" );
 
	DWORD t1	= timeGetTime();		// 筛选烟花计时
	DWORD st1	= timeGetTime();		// 播放花样计时
	DWORD* pMem = GetImageBuffer();		// 获取窗口显存指针
 
	for ( int i = 0; i < NUM; i++ )		// 初始化烟花
	{
		Init( i );
	}
	Load();								// 将烟花图片信息加载进相应结构中
	BeginBatchDraw();					// 开始批量绘图
 
	while ( !kbhit() )
	{
		Sleep( 10 );
 
		// 随机选择 4000 个像素点擦除
		for ( int clr = 0; clr < 1000; 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;	// 对显存赋值擦出像素点
			}
		}
		Chose	( t1	);		// 筛选烟花
		Shoot	(		);		// 发射烟花
		Show	( pMem	);		// 绽放烟花
		Wishing	(		);		// 滚动字符
		Style	( st1	);		// 花样发射
		FlushBatchDraw(	);		// 显示前面的所有绘图操作
	}
}

到此,相信大家对“怎么用C语言给喜欢的人写烟花”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/104194.html

(0)

相关推荐

  • html和css基础知识有哪些

    技术html和css基础知识有哪些本篇内容主要讲解“html和css基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html和css基础知识有哪些”吧!Html是

    攻略 2021年12月10日
  • leetcode翻转链表(leetcode如何删除链表)

    技术LeetCode怎样反转链表这篇文章主要为大家展示了“LeetCode怎样反转链表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“LeetCode怎样反转链表”这篇文章吧。

    攻略 2021年12月15日
  • express框架

    技术express框架 express框架Express框架
    Express简化了关于NodeJS应用的开发
    官网地址:https://www.expressjs.com.cn/使用npm instal

    礼包 2021年10月19日
  • 几种常见的Python算法实现分别有哪些

    技术几种常见的Python算法实现分别有哪些这篇文章将为大家详细讲解有关几种常见的Python算法实现分别有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、选择排序

    攻略 2021年10月25日
  • 2021-2022-1 20211410周意凯《信息安全专业导论》第六周学习总结

    技术2021-2022-1 20211410周意凯《信息安全专业导论》第六周学习总结 2021-2022-1 20211410周意凯《信息安全专业导论》第六周学习总结学习目标Polya如何解决问题
    简单

    礼包 2021年11月1日
  • excel中Alt键的使用技巧有哪些

    技术excel中Alt键的使用技巧有哪些这篇文章将为大家详细讲解有关excel中Alt键的使用技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  1.Alt+Enter 强制换

    攻略 2021年10月29日