天天看點

C/C++實作電影黑客帝國中的代碼雨效果

C/C++實作代碼雨效果

目錄

  • C/C++實作代碼雨效果
    • 說明
    • 使用的庫說明
    • 測試代碼
    • 效果圖

說明

  • 最近整理電腦資料,翻出了以前寫的代碼,順便整理一下到部落格上,當做一次備份記錄
  • 先看看靜态效果
    C/C++實作電影黑客帝國中的代碼雨效果
  • 需要分為以下步驟實作
    • 生成代碼串
    • 把代碼串繪制到視窗中
    • 使用雙緩沖機制避免螢幕閃爍
    • 讓代碼串往下移動
    • 随機選擇代碼串中的随機字元位置做随機修改

使用的庫說明

  • 使用easyX圖形庫實作,庫安裝包路徑:https://easyx.cn/downloads/

測試代碼

#include <stdio.h>
#include <time.h>
#include <Windows.h>
#include <graphics.h>

#define WIDTH 960
#define HEIGHT 640
#define STR_SIZE 20
#define STR_NUM 128
#define STR_WIDTH 15


typedef struct Rain
{
	int x;
	int y;
	int speed;
	TCHAR str[STR_SIZE];
}Rain; 
Rain rain[STR_NUM];

// 随機生成一個字元
char CreateCh()
{
	char ch = 0;
	int flag = rand() % 3; // 0~2
	if (flag == 0)
		ch = rand() % 26 + \'a\'; // 産生小寫字母a~z
	else if (flag == 1)
		ch = rand() % 26 + \'A\'; // 産生大寫字母A~Z
	else
		ch = rand() % 10 + \'0\'; // 産生數字0~9

	return ch;
}
// 初始化結構體成員
void InitRain()
{
	// 初始化字元的位置和速度
	for (int i = 0; i < STR_NUM; ++i)
	{
		rain[i].x = i*STR_WIDTH;
		rain[i].y = rand() % HEIGHT;
		rain[i].speed = rand() % 5 + 5;
	}
	// 擷取随機字元填充進數組
	for (int i = 0; i < STR_NUM; i++)
	{
		for (int j = 0; j < STR_SIZE; j++)
		{
			rain[i].str[j] = CreateCh();
		}
	}
}
// 輸出到視窗中
void DrawRain()
{
	cleardevice();
	for (int i = 0; i < STR_NUM; i++)
	{
		for (int j = 0; j < STR_SIZE; j++)
		{
			outtextxy(rain[i].x, rain[i].y-STR_WIDTH*j, rain[i].str[j]);
			settextcolor(RGB(0, 255-j*13, 0));
		}
	}
}
// 移動字元
void MoveRain()
{
	for (int i = 0; i < STR_NUM; i++)
	{
		rain[i].y += rain[i].speed;
		if (rain[i].y- STR_WIDTH*STR_SIZE > HEIGHT)
		{
			rain[i].y = 0;
		}
	}
}
// 随機改變字元
void ChangeCh()
{
	for (int i = 0; i < STR_NUM; i++)
	{
		rain[rand() % STR_NUM].str[rand() % STR_SIZE] = CreateCh();
	}
}
int main()
{
	srand((unsigned int)time(NULL)); // 初始化随機數種子
	initgraph(WIDTH, HEIGHT);
	InitRain();
	DWORD t1, t2;
	t1 = GetTickCount();
	t2 = t1;
	while (1)
	{
		BeginBatchDraw(); // 雙緩沖機制
		DrawRain();
		ChangeCh();
		if (t2 - t1 > 20)
		{
			MoveRain();
			t1 = t2;
		}
		t2 = GetTickCount();
		EndBatchDraw();
	}
	getchar();
	closegraph();
	return 0;
}

           

效果圖

C/C++實作電影黑客帝國中的代碼雨效果