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;
}
效果图
版权声明:本文为veis原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。