1. ホーム
  2. C++

新春花火コード】のご紹介] Cに「花火」と書いて、心の中の人に見せてあげてください。

2022-02-22 04:57:25

前置き

あなたは窓から花火を見る、私は窓からあなたを見る、この時、あなたは花火よりずっと素敵に見える、あなたの目は花火でいっぱいの空を映す、私の瞳孔はあなたの輝く目の色を映す、この時、私は花火より孤独だ

こんにちは!キツネです~~。

私は前にプログラマのデートについての記事を掲載している、今日は突然現れ、熟考に落ちた、今誰もがプログラマがそれをロマンスする方法を知らないと思う、本当に大きな間違い、今日はあなたがプログラマの恋愛は何ですか見てみましょう!.

 今日は"Fireworks"の告白の手順を書きます!驚かず、興奮せず、覚えて、心の中の人に持っていってあげてください!!!!

メロドラマは言わずもがな、コードに直行しましょう

I. 構造体

<スパン すべての最初の、もちろん、私は芸術の言葉の構造について多くを語る必要はありません私たちの古い友人の構造であり、何を自分のコンテンツを書くために知っている必要がありますヘクタール

// The fireworks structure
struct FIRE
{
	int r; // current blast radius
	int max_r; // maximum radius of the center of the explosion from the edge
	int x, y; // coordinates of the center of the explosion in the window
	int cen_x, cen_y; // coordinates of the center of the explosion relative to the top left corner of the image
	int width, height; // width and height of the image
	int xy[240][240]; // store the image pixel points

	bool show; // whether to bloom or not
	bool draw; // start outputting pixel points
	DWORD t1, t2, dt; // bloom speed
}Fire[NUM];

// Fireworks structure
struct JET
{
	int x, y; // coordinates of the spraying point
	int hx, hy; // highest point coordinates ------ will be assigned to x, y inside FIRE
	int height; // height of the firework
	bool shoot; // whether it can be fired

	DWORD t1, t2, dt; // launch speed
	IMAGE img[2]; // store a light and dark image of the firework
	byte n : 1; // picture subscript
}Jet[NUM];

// happy birthday art word structure
struct HAPPY // store the Happy Birthday artwork image
{
	int x, y; // coordinates of the upper left corner of the image for each word
	IMAGE img; // store a single word image
	static int num; // the letter number
}Happy[NUM];

II. 初期化

花火のパラメータを初期化し、すべての準備をする

// Initialize the fireworks parameters
void Init( int i )
{
	// The farthest distance from the center of the firework to the edge of the image, and the distance from the center of the firework to the top left corner of the image (x, y), respectively
	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 };

	/**** initialize fireworks *****/

	Fire[i].x = 0; // coordinates of the center of the firework
	Fire[i].y = 0;
	Fire[i].width = 240; // image width
	Fire[i].height = 240; // height of the image
	Fire[i].max_r = r[i]; // maximum radius
	Fire[i].cen_x = x[i]; // center distance from top left corner
	Fire[i].cen_y = y[i];
	Fire[i].show = false; // whether to bloom
	Fire[i].dt = 5; // bloom time interval
	Fire[i].t1 = timeGetTime();
	Fire[i].r = 0; // start blooming from 0

	/**** initialize firework shell *****/

	Jet[i].x = -240; // coordinates of the upper left corner of the firework bomb
	Jet[i].y = -240;
	Jet[i].hx = -240; // coordinates of the highest point of the firework launch
	Jet[i].hy = -240;
	Jet[i].height = 0; // launch height
	Jet[i].t1 = timeGetTime();
	Jet[i].dt = rand() % 10; // launch speed time interval
	Jet[i].n = 0; // subscript of fireworks flashing picture
	Jet[i].shoot = false; // whether to launch
}

三、花火ロード機能

画像を読み込んで、花火のピクセルドット色を格納する

// Load the image
void Load()
{
/**** store the pixel dot color of the fireworks ****/
	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();
}


4つ目は、花火打ち上げ機能

花火のスキャンと打ち上げ、打ち上げの開始と停止の制御

// Scanning for fireworks and firing them
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 )
		{
			/**** fireworks rise *****/
			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 );

			/**** goes up to 3 / 4 of the height, decelerating *****/
			if ( (Jet[i].y - Jet[i].hy) * 4 < Jet[i].height )
				Jet[i].dt = rand() % 4 + 10 ;

			/**** goes up to the maximum height *****/
			if ( Jet[i].y <= Jet[i].hy )
			{
				// Play the explosion sound
				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 ); // erase the fireworks
				Fire[i].x = Jet[i].hx + 10; // explode in the middle of the firework shells
				Fire[i].y = Jet[i].hy; // bloom at the highest point
				Fire[i].show = true; // start the bloom
				Jet[i].shoot = false; // stop firing

				// Show the corresponding letter
				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;
		}
	}
}


V. 花火の打ち上げ機能

<スパン 表示パターン、花火の見栄えを良くする方法

// Display the pattern
void Style( DWORD& st1 )
{
	DWORD st2 = timeGetTime();

	if ( st2 - st1 > 266000 ) // the time of a song
	{
		// heart coordinates
		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();
			/**** regular distribution of fireworks bombs ***/
			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 ); // show fireworks bombs

			/**** set fireworks parameters ***/
			Fire[i].x = Jet[i].x + 10;
			Fire[i].y = Jet[i].hy;
			Fire[i].show = false;
			Fire[i].r = 0;

			/**** play launch sound ***/
			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;
	}
}

VI. 花火のブルーム機能

花火の開花、花火のステージの開花時間間隔、可変速開花効果を生成するなど、ここではまた、独自のものを追加するには、自分自身を最適化することができます。

// Show the fireworks
void Show( DWORD* pMem )
{
	// The fireworks bloom time interval for each stage, creating a variable speed bloom effect
	int drt[16] = { 5, 5, 5, 5, 5, 5, 6, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55 };

	for ( int i = 0; i < NUM; i++ )
	{
		Fire[i].t2 = timeGetTime();

		// increase explosion radius, bloom fireworks, increase time interval to do variable speed effect
		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 the number of fireworks can explode, draw fireworks according to the current explosion radius, color value close to black is not output.
		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) ); // coordinates relative to the top left corner of the image
				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 ) // output only the pixel points within the image
				{
					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 );

					// coordinates of the fireworks pixel point on the window
					int xx = (int)( Fire[i].x + Fire[i].r * cos(a) );
					int yy = (int)( Fire[i].y - Fire[i].r * sin(a) );

					// Darker pixels are not output, prevent out-of-bounds
					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] ); // display operation to draw fireworks
				}
			}
			Fire[i].draw = false;
		}
	}
}

VII. 主な機能

// The main function
void main()
{
	initgraph( 1200, 800 );
	srand( time(0) );

	// Play background music
	mciSendString( "open . /fire/bk.mp3 alias bk", 0, 0, 0 );
	mciSendString( "play bk repeat", 0, 0, 0 );

	setfillstyle( 0 );
	setfont ( 36, 0, "italic" );
	setcolor ( YELLOW );
	outtextxy ( 370, 100, "yyyy兾兾兾 .... ^_^" );

	DWORD t1 = timeGetTime(); // filter fireworks timing
	DWORD st1 = timeGetTime(); // Play pattern timing
	DWORD* pMem = GetImageBuffer(); // Get window memory pointer

	for ( int i = 0; i < NUM; i++ ) // initialize fireworks
	{
		Init( i );
	}
	Load(); // Load the firework image information into the corresponding structure
	BeginBatchDraw(); // Start batch drawing

	while ( !kbhit() )
	{
		Sleep( 10 );

		// select 4000 random pixels to erase
		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 ) // prevent out-of-bounds
					pMem[py1 * 1200 + px1] = pMem[py1 * 1200 + px1 + 1] = BLACK; // assign pixel points to memory to be erased
			}
		}
		Chose ( t1 ); // filter fireworks
		Shoot ( ); // fire the fireworks
		Show ( pMem ); // fire the fireworks
		Wishing ( ); // scrolling characters
		Style ( st1 ); // Pattern firing
		FlushBatchDraw( ); // Show all previous drawing operations
	}
}

概要

プログラマーのロマンスはここだけではありません、ハハハ、もしあなたが熱心に心の中の誰かに見せたいなら、グループに入って直接手に入れることができます、もちろん、自分で書いて完成させるのが一番です、ネット上にはたくさんの資料があります、どう最適化し改善するかは自分の腕次第です!!。ここであなたが欲しい知識と幸福を得ることができることを望みます、そしてUPオーナーに心配を与えることができることを望みます、どうもありがとうございました!

ちなみに、特に重要なことをひとつ

そのために短いビデオを作りました、私とまだ独身のプログラマーに、わざわざお知らせしているロマンを少しでも褒めていただければと思います。

動画ポータルです。

花火はあなたのように美しくありません https://www.bilibili.com/video/BV1XS4y1d7CQ/ https://www.bilibili.com/video/BV1XS4y1d7CQ/

今後もプロジェクトのソースコードや教材に注目していただければと思います。また、質問にもできる限りお答えしていきたいと思います。もし、C/C++の学習教材や他のプロジェクトのソースコードが欲しいなら、グループ[ ]に追加することができます。 <スパン 1083227756 もっと詳しく プログラマーの今後の発展に関心を持ちたい方は、グループを追加して気軽にチャットすることも可能です。また、WeChatの公開番号をフォローすることもできます:[ ]。 キツネのコーディングタイム ]、皆さんと一緒に学び、進歩したいと思います!!!!
以下のリンクからグループに入り、学習教材とプロジェクトのソースコードや資料を入手することができます。

受信するグループを入力 https://jq.qq.com/? _wv=1027&k=sttR3REF https://jq.qq.com/? _wv=1027&k=sttR3REF