C語言實現(xiàn)刮刮樂效果是示例代碼
程序簡介
這個程序模擬了刮刮樂的刮卡操作,按下鼠標左鍵并移動可以刮開刮卡層。
刮卡操作是通過掩碼圖實現(xiàn)的,一張隱藏的待刮開背景圖,一張掩碼圖。
刮卡的時候,是在黑色的掩碼圖上畫線,顯示的時候,通過掩碼圖將背景圖顯示出來。
現(xiàn)在具體說一下顯示方式:
首先,背景圖就是普通的 IMAGE 對象,不做任何處理。
其次,掩碼圖中,未刮開區(qū)域對應的是黑色,已刮開區(qū)域對應的是白色。
顯示的步驟:
1. 將背景圖中未刮開的區(qū)域置為黑色:
操作目標(D):背景圖
操作源(S):掩碼圖
操作:背景圖 AND 掩碼圖
⇒ 操作目標 AND 操作源 ⇒ D a S ⇒ DSa(后綴表達式),可以在三元光柵操作碼中找到 DSa 對應的操作碼是 008800C6(SRCAND)。
2. 將覆蓋層中已刮開的區(qū)域置為黑色:
操作目標(D):覆蓋層
操作源(S):掩碼圖
操作:覆蓋層 AND (NOT 掩碼圖)
⇒ 操作目標 AND (NOT 操作源) ⇒ D a (n S) ⇒ DSna(后綴表達式),可以在三元光柵操作碼中找到 DSna 對應的操作碼是 00220326。
3. 將背景圖合并到覆蓋層中,就是將前兩步的 IMAGE 圖像進行 OR 操作合并:
操作目標(D):覆蓋層
操作源(S):背景圖
操作:覆蓋層 OR 背景圖
⇒ 操作目標 OR 操作源 ⇒ D o S ⇒ DSo(后綴表達式),可以在三元光柵操作碼中找到 DSo 對應的操作碼是 00EE0086(SRCPAINT)。
以上步驟,就是顯示刮卡效果的函數(shù)的原理:
// 顯示刮卡效果 void Show() { IMAGE tmp = imgContent; SetWorkingImage(&tmp); putimage(0, 0, &imgMask, SRCAND); // 將背景圖中未刮開的區(qū)域置為黑色 SetWorkingImage(); putimage(offsetx, offsety, &imgMask, 0x00220326); // 將覆蓋層中已刮開的區(qū)域置為黑色 putimage(offsetx, offsety, &tmp, SRCPAINT); // 將背景圖合并到覆蓋層中 }
同時,該程序還使用了用圖像填充區(qū)域的技術,以及輸出字符符號的技術。
程序執(zhí)行效果
友情提示:更換一下刮獎區(qū)的文字,可能是一件有趣的事情。
完整源代碼
// // 程序名稱:C語言刮刮樂(掩碼圖的范例) // 編譯環(huán)境:Visual C++ 6.0 ~ 2019,EasyX_20220116 // #include <graphics.h> const int offsetx = 170; // 刮獎區(qū)的偏移 x 坐標 const int offsety = 260; // 刮獎區(qū)的偏移 y 坐標 IMAGE imgContent(300, 100); // 刮開后的內容 IMAGE imgMask(300, 100); // 已刮部分的掩碼層 // 繪制刮刮卡 void DrawCard() { // 白色背景 setbkcolor(0xf0f0f0); cleardevice(); // 設置刮刮卡填充單元 IMAGE unit(32, 32); SetWorkingImage(&unit); // 設置繪圖設備為 unit 對象 setbkcolor(0x1a3bf0); // 設置背景色 cleardevice(); settextstyle(20, 0, _T("Webdings"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); // 設置圖標字體 settextcolor(0x152fe5); outtextxy(0, 16, 0x59); // 輸出兩個心 outtextxy(16, 0, 0x59); settextcolor(0x284ff5); outtextxy(0, 0, 0x73); // 輸出兩個問號 outtextxy(16, 16, 0x73); SetWorkingImage(); // 用 IMAGE 對象填充矩形區(qū)域 setfillstyle(BS_DIBPATTERN, NULL, &unit); // 設置填充模式 solidrectangle(150, 30, 490, 450); // 畫填充矩形 TCHAR s[] = _T("刮刮樂"); settextstyle(80, 0, _T("黑體"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); setbkmode(TRANSPARENT); settextcolor(0x034089); outtextxy(offsetx + (300 - textwidth(s)) / 2 + 5, 105, s); settextcolor(0x10c2fe); outtextxy(offsetx + (300 - textwidth(s)) / 2, 100, s); // 設置覆蓋層填充單元 IMAGE unit2(80, 50); SetWorkingImage(&unit2); // 設置繪圖設備為 unit 對象 setbkcolor(LIGHTGRAY); cleardevice(); settextstyle(20, 0, _T("黑體"), 150, 150, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); settextcolor(0x606060); outtextxy(10, 20, _T("刮獎區(qū)")); SetWorkingImage(); // 用 IMAGE 對象填充矩形區(qū)域 setfillstyle(BS_DIBPATTERN, NULL, &unit2); // 設置填充模式 solidrectangle(offsetx, offsety, offsetx + 300, offsety + 100); // 畫填充矩形 } // 初始化刮獎區(qū)內容 void InitContent() { // 繪制刮獎區(qū)內容 SetWorkingImage(&imgContent); setbkcolor(0x05d5ff); cleardevice(); settextcolor(0x0024b8); TCHAR s1[] = _T("EasyX"); TCHAR s2[] = _T("點亮你的創(chuàng)造力"); settextstyle(40, 0, _T("黑體"), 0, 0, 900, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); outtextxy((300 - textwidth(s1)) / 2, 10, s1); outtextxy((300 - textwidth(s2)) / 2, 50, s2); // 繪制刮卡的掩碼圖 SetWorkingImage(&imgMask); setbkcolor(BLACK); cleardevice(); setlinestyle(PS_SOLID, 10); // 設置刮卡操作的粗細 SetWorkingImage(); } // 實現(xiàn)刮卡操作 void Scrape(int x1, int y1, int x2, int y2) { SetWorkingImage(&imgMask); line(x1, y1, x2, y2); } // 顯示刮卡效果 void Show() { IMAGE tmp = imgContent; SetWorkingImage(&tmp); putimage(0, 0, &imgMask, SRCAND); // 將背景圖中未刮開的區(qū)域置為黑色 SetWorkingImage(); putimage(offsetx, offsety, &imgMask, 0x00220326); // 將覆蓋層中已刮開的區(qū)域置為黑色 putimage(offsetx, offsety, &tmp, SRCPAINT); // 將背景圖合并到覆蓋層中 } // 主函數(shù) int main() { initgraph(640, 480); // 初始化圖形窗口 DrawCard(); // 繪制刮刮樂卡片 InitContent(); // 初始化刮獎區(qū)內容 // 獲取鼠標消息,實現(xiàn)刮卡操作 ExMessage msg; int x, y, oldx, oldy; bool scrape = false; while(true) { msg = getmessage(EM_MOUSE); switch(msg.message) { case WM_LBUTTONDOWN: scrape = true; x = oldx = msg.x - offsetx; y = oldy = msg.y - offsety; Scrape(oldx, oldy, x, y); break; case WM_LBUTTONUP: scrape = false; break; case WM_MOUSEMOVE: if (scrape) { oldx = x; oldy = y; x = msg.x - offsetx; y = msg.y - offsety; Scrape(oldx, oldy, x, y); } break; } // 顯示當前結果 Show(); } return 0; }
到此這篇關于C語言實現(xiàn)刮刮樂效果是示例代碼的文章就介紹到這了,更多相關C語言刮刮樂內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)修改函數(shù)代碼HOOK的封裝方法
這篇文章主要介紹了C++實現(xiàn)修改函數(shù)代碼HOOK的封裝方法,有助于深入了解C++的HOOK原理,需要的朋友可以參考下2014-10-10