原文《帥爆了!C++也可以弄出黑客帝國的數字瀑布流這個做屏保覺得帥~》http://www.ic2012.cn/read-htm-tid-386-ordertype-desc-ds-1.html採用VC++6.0和EasyX2012立冬版;(加了一些廢話)
本人使用VS2013社區版和EasyX_20151015(beta)版;(比如EasyX15版字體設置由setfont改爲了settextstyle等)
本人初學C++,想找個地方系統的存儲源代碼以方便本人學習,如此而已。
#include <stdafx.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
/***********************宏定義**********************/
#define PI 3.1415926 //圓周率
#define WIDTH 1500 //屏幕寬度,流星出生區域
#define HEIGHT 800 //屏幕高度,流星出生區域
#define V 20 //流星速度,單次移動的像素數
#define LENGTH 20 //流星字符數
#define DELAY 30 //延時
#define NUM 45 //流星個數
/******************定義流星結構體*******************/
struct meteor
{
int x0;
int y0;
int yh;
char str[LENGTH]; //默認20個
}me[NUM] = { 0 }; //默認45顆流星
/*********************函數聲明**********************/
char AsciiRand();
void Move(char *p);
void InitMeteor(struct meteor *me);
int color(int y, int y0, int yh);
void Meteors(struct meteor me[]);
/***********************主函數**********************/
int main(void)
{
//接收鍵盤輸入的變量
char c = '\0';
//初始化 WIDTH * HEIGHT的繪圖窗口
// win api 獲取顯示器分辨率方法:
initgraph(WIDTH, HEIGHT);
// int width = GetSystemMetrics(SM_CXSCREEN);
// int height = GetSystemMetrics(SM_CYSCREEN);
//獲得窗口句柄
HWND hwnd = GetHWnd();
//修改窗口名稱
SetWindowText(hwnd, _T("黑客帝國“01”瀑布流"));
//最大化顯示窗口
//ModifyStyle(WS_CAPTION, 0);
ShowWindow(hwnd, SW_SHOWMAXIMIZED);
//ChangeDisplaySettings
//全屏http://download.csdn.net/source/271342
//http://wenku.baidu.com/view/a02e4bf8aef8941ea76e052c.html
// Set WS_EX_LAYERED on this window
//SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
// 透明度:
//SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA);
//彈出提示
MessageBox(hwnd, TEXT("點擊【確定】,現在開始演示“01”瀑布流效果,Esc鍵退出"), TEXT("提示"), MB_OK | MB_ICONWARNING);
//設置隨機種子
srand((unsigned)time(NULL));
//對NUM個流星體初始化
for (int i = 0; i < NUM; i++)
{
InitMeteor(&me[i]);
}
while (c != 27)
{
//開始批量繪圖
BeginBatchDraw();
//繪製一幀動畫
Meteors(me);
//執行未完成的繪製任務
FlushBatchDraw();
//延時
Sleep(DELAY);
//清屏
cleardevice();
for (int i = 0; i < NUM; i++)
{
//流星向下移動一步(V個像素)
me[i].yh += V;
Move(me[i].str);
//若某個流星完全走出畫面,則初始化
if (me[i].yh > HEIGHT + LENGTH * V)
{
InitMeteor(&me[i]);
}
}
//如果Esc鍵按下退出
if (_kbhit())
{
c = _getch();
}
}
//結束批量繪圖
EndBatchDraw();
//結束繪圖環境
closegraph();
return 0;
}
/***********************函數體**********************/
////產生隨機可見ascii碼
//char asciirand()
//{
// return ((char)(rand() % (126 - 33) + 33));
//}
//產生隨機01字符
char zoRand()
{
return ((char)(rand() % 2 + '0'));
}
//字符後移,可以使顯示時字符相對屏幕位置不變
void Move(char *p)
{
char *pt = p + LENGTH;
while (pt > p)
{
*(--pt) = *(pt - 1);
}
//*p = AsciiRand();
*p = zoRand();
}
//對一顆流星初始化
void InitMeteor(struct meteor *me)
{
me->x0 = rand() % WIDTH;
me->yh = me->y0 = rand() % HEIGHT;
for (int i = 0; i < LENGTH; i++)
{
//*(me->str + i) = AsciiRand();
*(me->str + i) = zoRand();
}
}
//確定流星的顏色
int color(int y, int y0, int yh)
{
int color;
//出生點之前的流星體置成黑色
if (y < y0)
{
color = 0;
}
//流星顏色自頭至尾按照餘弦函數遞減
else
{
//尾跡消失
color = (int)(255 * cos((yh - y) * PI / (2 * LENGTH * V)));
//尾跡不消失
//color = 255;
}
return color;
}
//打印一幀流星的畫面
void Meteors(struct meteor me[])
{
//設置格式:背景透明,字符高度,字體粗細,字體
setbkmode(TRANSPARENT);
settextstyle(16, 0,_T("Arial"));
//開始打印一幀圖像
int y;
for (int n = 0; n < NUM; n++)
{
for (int j = 0; j < LENGTH; j++)
{
//流星中第j個字符的縱座標
y = me[n].yh - j * V;
//設置顏色,流星的頭部是白色的
setcolor(RGB(255 * (0 == j), color(y, me[n].y0, me[n].yh), 255 * (0 == j)));
//打印字符
outtextxy(me[n].x0, y, me[n].str[j]);
}
}
}
沒找到地方傳附件。