話不多說直接貼代碼:
1 #include <graphics.h> 2 #include <time.h> 3 #include <conio.h> 4 5 #define MAXSTAR 500 // 星星總數 6 7 class star 8 { 9 private: 10 int x; 11 int y; 12 int color; 13 double step; 14 public: 15 star();//默認構造函數初始化 16 void move(void); 17 }; 18 star::star() 19 { 20 x = rand() % 640; 21 y = rand() % 480;//產生0-480的的坐標 22 step = (rand() % 5000) / 1000.0 + 1; 23 color = (int)((step / 6) * 255 + 0.5); 24 color = RGB(color, color, color); 25 } 26 27 void star::move() 28 { 29 putpixel(x, y, BLACK); 30 x = x + (int)step; 31 if (x > 640) 32 { 33 x = 0; 34 y = rand() % 480;//產生0-480的的坐標 35 step = (rand() % 5000) / 1000.0 + 1; 36 color = (int)((step / 6) * 255 + 0.5); 37 color = RGB(color, color, color); 38 } 39 putpixel(x, y, color); 40 } 41 42 // 主函數 43 void main() 44 { 45 srand((unsigned)time(NULL)); // 隨機種子 46 initgraph(640, 480); // 創建繪圖窗口 47 48 star sky[MAXSTAR]; 49 50 while (!_kbhit()) 51 { 52 for (int i = 0; i < MAXSTAR; i++) 53 { 54 sky[i].move(); 55 } 56 Sleep(20); 57 } 58 closegraph(); // 關閉繪圖窗口 59 }
如上述代碼所示,代碼的基本思想創建一個類里面包含隱藏數據以及類方法作為公共接口,我們首先創建一個類定義的數組,數組的每一個成員代表着一顆星星,我們要想繪制一個動態的銀河星空我們就要讓星星從左至右依次循環,再一次循環中星星的顏色不變,位移不變只是x軸數據一直在隨着step步進,然后擦掉之前自己坐標畫出的點,當超過繪制范圍時這點的處理很關鍵,此時要把x=0,而y,color,step這些都要重新進行隨機化這樣整體的星空效果才能出來,每個星星移位結束后進行延時進行下一輪循環。下面是一個靜態的x效果圖: