新春花火コード】のご紹介] Cに「花火」と書いて、心の中の人に見せてあげてください。
前置き
あなたは窓から花火を見る、私は窓からあなたを見る、この時、あなたは花火よりずっと素敵に見える、あなたの目は花火でいっぱいの空を映す、私の瞳孔はあなたの輝く目の色を映す、この時、私は花火より孤独だ
こんにちは!キツネです~~。
私は前にプログラマのデートについての記事を掲載している、今日は突然現れ、熟考に落ちた、今誰もがプログラマがそれをロマンスする方法を知らないと思う、本当に大きな間違い、今日はあなたがプログラマの恋愛は何ですか見てみましょう!.
今日は"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オーナーに心配を与えることができることを望みます、どうもありがとうございました!
ちなみに、特に重要なことをひとつ
そのために短いビデオを作りました、私とまだ独身のプログラマーに、わざわざお知らせしているロマンを少しでも褒めていただければと思います。
動画ポータルです。
今後もプロジェクトのソースコードや教材に注目していただければと思います。また、質問にもできる限りお答えしていきたいと思います。もし、C/C++の学習教材や他のプロジェクトのソースコードが欲しいなら、グループ[ ]に追加することができます。
<スパン
1083227756
もっと詳しく プログラマーの今後の発展に関心を持ちたい方は、グループを追加して気軽にチャットすることも可能です。また、WeChatの公開番号をフォローすることもできます:[ ]。
キツネのコーディングタイム
]、皆さんと一緒に学び、進歩したいと思います!!!!
以下のリンクからグループに入り、学習教材とプロジェクトのソースコードや資料を入手することができます。
受信するグループを入力 https://jq.qq.com/? _wv=1027&k=sttR3REF https://jq.qq.com/? _wv=1027&k=sttR3REF
関連
-
C++がpythonを呼び出す
-
C++のコンパイルエラーで修飾子が破棄される [-fpermissive] 。
-
C++ [エラー] 'std::string {aka std::basic_string<char>}' を 'char*' に変換できないエラー
-
警告を表示します。ISO C++は文字列定数を'char*'に変換することを禁じています[-Write-strings]。
-
警告: この関数では 'p' が初期化されていない状態で使用されることがあります。
-
C/C++ におけるランダム関数 rand() および srand() の使用法
-
C++11 ランダムライブラリ乱数
-
ランタイムエラー: 'std::logic_error' のインスタンスを投げた後に terminate が呼び出されました。
-
文字列がこのスコープで宣言されていない 問題の解決
-
C++エラー:不明な型名
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinederror: 'dynamic_cast' の前に unqualified-id を指定する必要があります。
-
C/C++共通エラーの概要
-
コンパイルエラー: 制御が非ボイド関数の末尾に達する可能性がある
-
C++ max() 関数エラー: 'max' の呼び出しに一致する関数がない
-
C++: エラー C2228: '.str' の左側にはクラス/構造体/結合が必要
-
stoi' の解決策は、Dev-c++ のこのスコープで宣言されていません。
-
[エラー]'cout' はこのスコープで宣言されていません。
-
C++ shared_ptr コンパイルエラー 'shared_ptr' がこのスコープで宣言されていない問題を修正しました。
-
エラー: "" から非スカラー型 "" への変換
-
デバッグエラー Assertion Failed 問題について