再上一個例子當(dāng)中,我們可以讓小球無限的運動反彈,細心的同學(xué)再修改代碼時候可能會發(fā)現(xiàn),當(dāng)我們把間隔時間縮短(如Sleep(5))讓小球運動變快的時候,會發(fā)現(xiàn)小球運動過程中的閃爍比較明顯,似乎看著有些不夠細膩。
這就是畫圖本身刷新幀率導(dǎo)致的,由于easyX每次繪制圖片都會有開銷,當(dāng)間隔太短,就會出現(xiàn)延遲,產(chǎn)生這種問題。那么解決辦法也是有的,easyX提供了批量繪制的函數(shù),即將每一次繪圖相關(guān)的操作之后可以不立馬執(zhí)行,而是等需要顯示的時候一次性繪圖顯示
void BeginBatchDraw(); //開始批量繪圖。執(zhí)行后,任何繪圖操作都將暫時不輸出到繪圖窗口上 //直到執(zhí)行 FlushBatchDraw 或 EndBatchDraw 才將之前的繪圖輸出。 void FlushBatchDraw(); //開始將前面未繪制的圖形一次性繪制 void EndBatchDraw(); //結(jié)束批量繪圖
這三個函數(shù)我們將BeginBatchDraw()放到循環(huán)開始,EndBatchDraw();放到循環(huán)結(jié)束,F(xiàn)lushBatchDraw()放到繪圓之后就可以減少這種閃爍的情況。
完整代碼如下:
//彈球游戲 //www.sztianhecheng.cn #include <graphics.h> // 引用圖形庫頭文件 #include <conio.h> #define WIDTH 640 #define HIGH 480 #define R 10 int main() { int i; int Vx=5,Vy=5; int x=WIDTH/2,y=HIGH/2; //表示小球的圓心坐標(biāo) initgraph(WIDTH, HIGH); // 創(chuàng)建繪圖窗口,大小為 640x480 像素 BeginBatchDraw(); while(1) { //繪制小球圖案 setfillcolor(GREEN); fillcircle(x,y,R); FlushBatchDraw(); Sleep(5); //原位置擦除小球圖案 setcolor(BLACK); setfillcolor(BLACK); fillcircle(x,y,R); x=x+Vx; y=y+Vy; if(x<=R || x>=WIDTH-R) Vx=-Vx; if(y<=R || y>=HIGH-R) Vy=-Vy; } EndBatchDraw(); getch(); // 按任意鍵繼續(xù) closegraph(); // 關(guān)閉繪圖窗口 return 0; }
運行后參考效果:
請大家參考并嘗試運行、觀察比對效果~
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程