win32编程 三缓冲  实现透明贴图

一、收获

  1. 三缓冲贴图:

 

        //以贴背景图为例//1.获取DCg_hdc = GetDC(hwnd);//2.创建兼容DCg_mdc = CreateCompatibleDC(g_hdc);g_bufdc = CreateCompatibleDC(g_hdc);//创建一个和窗口兼容的位图对象HBITMAP hBitMap = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);SelectObject(g_mdc, hBitMap);//3.加载位图
·    g_hBackGround = (HBITMAP)LoadImage(NULL, _T("bg.bmp"), IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE);//贴背景图SelectObject(g_bufdc, g_hBackGround);BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY);//把图片复制到HDCBitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);

  

  2.人物图像贴图方式:

        //1.获取DCg_hdc = GetDC(hwnd);//2.创建兼容DCg_mdc = CreateCompatibleDC(g_hdc);g_bufdc = CreateCompatibleDC(g_hdc);//创建一个和窗口兼容的位图对象HBITMAP hBitMap = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);SelectObject(g_mdc, hBitMap);//3.加载位图g_hSprite = (HBITMAP)LoadImage(NULL, _T("goright.bmp"), IMAGE_BITMAP, 480, 108, LR_LOADFROMFILE);g_hBackGround = (HBITMAP)LoadImage(NULL, _T("bg.bmp"), IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE);//贴人物SelectObject(g_bufdc, g_hSprite);TransparentBlt(g_mdc, g_iX, g_iY, 60, 108, g_bufdc, g_iNum * 60, 0, 60, 108, RGB(255, 0, 0));//把图片复制到HDCBitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);

  

  3.语法:

//1.背景
wnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//2.EX版本的使用,
//        1 size sizeof(WNDCLASSEX)  2 RegisterClassEx(&wnd)
if (!RegisterClassEx(&wnd)){return -1;}//3.消息循环
while (msg.message != WM_QUIT){if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))  //REMOVE{TranslateMessage(&msg);DispatchMessage(&msg);}else{}}//4.注销窗口Game_CleanUp(hwnd);UnregisterClass(wnd.lpszClassName, hInstance);    //5.获取系统时间g_tNow = GetTickCount();if (g_tNow - g_tPre > 50)Game_Paint(hwnd);//6.没有{}
case WM_CREATE:PlaySound(_T("仙剑三·原版景天.wav"), NULL, SND_ASYNC | SND_LOOP | SND_FILENAME);Game_Init(hwnd);break;//7.DeleteObject(g_hBackGround);DeleteObject(g_hSprite);DeleteObject(g_mdc);DeleteObject(g_bufdc);ReleaseDC(hwnd, g_hdc); //GetDC()只能被释放 如果删除不释放 就会一直占用着

  

    4.出现bug::

  原因及解决办法:  函数未被调用,函数名错误。

二、完整源代码

  1 #include<Windows.h>
  2 #include<tchar.h>
  3
  4 #pragma comment(lib,"Msimg32.lib")        //加载静态库
  5 #pragma comment(lib,"winmm.lib")
  6
  7 #define WINDOW_TITLE _T("透明动画")
  8 #define WINDOW_WIDTH    800
  9 #define WINDOW_HEIGHT    600
 10
 11 //======================全局函数================================
 12 LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
 13 void Game_Init(HWND hwnd);    //初始化函数
 14 void Game_Paint(HWND hwnd);
 15 void Game_CleanUp(HWND hwnd);//释放资源
 16 //==============================================================
 17
 18 //==========================全局变量============================
 19 DWORD g_tPre, g_tNow;    //用来保存上一次贴图的时间,还有本次贴图的时间
 20 HDC g_hdc, g_mdc, g_bufdc;    //实现三缓冲位图
 21 HBITMAP g_hSprite, g_hBackGround;    //用来加载人物和背景图片
 22 int g_iNum;    //记录图片
 23 int g_iX, g_iY;    //坐标
 24 //==============================================================
 25
 26 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
 27 {
 28     //1.设计窗口
 29     WNDCLASSEX wnd = { 0 };
 30
 31     wnd.cbClsExtra = 0;
 32     wnd.cbSize = sizeof(WNDCLASSEX);    //结构体大小
 33     wnd.cbWndExtra = 0;
 34     wnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
 35     wnd.hCursor = NULL;
 36     wnd.hIcon = NULL;
 37     wnd.hInstance = hInstance;
 38     wnd.lpfnWndProc = WinProc;
 39     wnd.lpszClassName = _T("逐梦之旅");
 40     wnd.lpszMenuName = NULL;
 41     wnd.style = CS_HREDRAW | CS_VREDRAW;
 42
 43     //2.注册窗口
 44     if (!RegisterClassEx(&wnd))
 45     {
 46         return -1;
 47     }
 48
 49     //3.创建窗口
 50     HWND hwnd = CreateWindow(wnd.lpszClassName, WINDOW_TITLE, WS_OVERLAPPEDWINDOW, 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
 51
 52     //4.显示和更新
 53     ShowWindow(hwnd, SW_SHOW);
 54     UpdateWindow(hwnd);
 55
 56     //5.消息循环
 57     MSG msg = { 0 };
 58     while (msg.message != WM_QUIT)
 59     {
 60         if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
 61         {
 62             TranslateMessage(&msg);
 63             DispatchMessage(&msg);
 64         }
 65         else
 66         {
 67             //获取系统时间
 68             g_tNow = GetTickCount();
 69
 70             if (g_tNow - g_tPre > 50)
 71                 Game_Paint(hwnd);
 72         }
 73     }
 74
 75     //注销窗口
 76     Game_CleanUp(hwnd);
 77     UnregisterClass(wnd.lpszClassName, hInstance);
 78     return 0;
 79 }
 80
 81 LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 82 {
 83     switch (message)
 84     {
 85     case WM_CREATE:
 86         PlaySound(_T("仙剑三·原版景天.wav"), NULL, SND_ASYNC | SND_LOOP | SND_FILENAME);
 87         Game_Init(hwnd);
 88         break;
 89
 90     case WM_DESTROY:
 91         PostQuitMessage(0);
 92         break;
 93
 94     case WM_KEYDOWN:
 95         if (wParam == VK_ESCAPE)
 96             PostQuitMessage(0);
 97         break;
 98     }
 99     return DefWindowProc(hwnd, message, wParam, lParam);
100 }
101
102 //初始化
103 void Game_Init(HWND hwnd)
104 {
105     //1.获取DC
106     g_hdc = GetDC(hwnd);
107
108     //2.创建兼容DC
109     g_mdc = CreateCompatibleDC(g_hdc);
110     g_bufdc = CreateCompatibleDC(g_hdc);
111
112     //创建一个和窗口兼容的位图对象
113     HBITMAP hBitMap = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
114     SelectObject(g_mdc, hBitMap);
115
116     //3.加载位图
117     g_hSprite = (HBITMAP)LoadImage(NULL, _T("goright.bmp"), IMAGE_BITMAP, 480, 108, LR_LOADFROMFILE);
118     g_hBackGround = (HBITMAP)LoadImage(NULL, _T("bg.bmp"), IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE);
119
120     //初始化人的坐标
121     g_iNum = 0;    //编号
122     g_iX = 0;
123     g_iY = 350;
124     Game_Paint(hwnd);
125 }
126
127 void Game_Paint(HWND hwnd)
128 {
129     //判断图片的编号
130     if (g_iNum == 8)
131         g_iNum = 0;
132
133     //贴背景图
134     SelectObject(g_bufdc, g_hBackGround);
135     BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY);
136
137     //贴人物
138     SelectObject(g_bufdc, g_hSprite);
139     TransparentBlt(g_mdc, g_iX, g_iY, 60, 108, g_bufdc, g_iNum * 60, 0, 60, 108, RGB(255, 0, 0));
140
141     //把图片复制到HDC
142     BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);
143
144     //获取本次贴图时间
145     g_tPre = GetTickCount();
146
147     g_iNum++;
148     g_iX += 10;
149     if (g_iX >= WINDOW_WIDTH)
150     {
151         g_iX = -60;
152     }
153 }
154
155 void Game_CleanUp(HWND hwnd)
156 {
157     DeleteObject(g_hBackGround);
158     DeleteObject(g_hSprite);
159     DeleteObject(g_mdc);
160     DeleteObject(g_bufdc);
161
162     ReleaseDC(hwnd, g_hdc); //GetDC()只能被释放 如果删除不释放 就会一直占用着
163 }

转载于:https://www.cnblogs.com/ming-michelle/p/7576301.html

小游戏一:win32贴图——TransparentBlt相关推荐

  1. 微信小游戏保存自定义分享图到相册实例

    一.实例操作 自定义绘制纹理文本,借助画布以图片形式保存至玩家相册,常用于制作游戏分享图. 1. 创建画布 let cv = wx.createCanvas(); let ctx = cv.getCo ...

  2. 双人弹球小游戏 (基于Java图形化界面编程)

    用户界面如下 : 玩法:双方玩家可以分别控制A-D键和←-→键来进行各自球拍的位置,如果某方没有接住小球,则对方获胜,游戏结束. 代码如下: import javax.swing.*; import ...

  3. 【机器视觉案例】(6) AI视觉,距离测量,自制AI小游戏,附python完整代码

    各位同学好,今天和大家分享一下如何使用 opencv + mediapipe 创建一个AI视觉小游戏,先放图看效果. 游戏规则,用手按下屏幕上的圆形按钮,每按一次后松开,按钮就随机出现在屏幕上的一个位 ...

  4. 4399积分小游戏刷分工具帮助

    2019独角兽企业重金招聘Python工程师标准>>> 应广大网友的要求,及我们在网络上未找到任何4399小游戏刷分相关工具,所以IT娱乐网的工程师经过数周研究终于研究出4399小游 ...

  5. cocos creator开发微信小游戏(五)贪吃蛇大作战

    目录 小游戏介绍 小游戏cocos creator场景图 小游戏部分JS代码 开发中碰到的问题 工程及说明 小游戏介绍 贪吃蛇小游戏:贪吃蛇试玩(首次加载比较慢),类似贪吃蛇大作战的小游戏.当玩家的蛇 ...

  6. 【C语言】实现双人控制的战斗小游戏

    实现功能 旧文档 2019.11 1.双人分别控制小人移动 2.子弹碰撞 3.可改变出弹方向 4.血条实体化 前言 游戏源码链接:https://blog.csdn.net/weixin_455908 ...

  7. 开发者该如何抓住微信小游戏的风口?听Cocos创始人王哲详解(上篇)

    在微信小游戏真正爆发之前,你该做好这些基础知识储备. 微信小游戏在2017年12月28日正式上线.相对于传统的H5游戏,小游戏的优势十分明显,拥有微信庞大的用户量以及更好的兼容性,在天生适合微信社交生 ...

  8. python外星人入侵小游戏

    python外星人入侵小游戏 python外星人入侵小游戏 项目结构如图所示: (1)alien.py中的代码: (2)alien_invasion.py中的代码: (3)bullet.py中的代码: ...

  9. 世界杯主题系列-用Scratch制作足球比赛小游戏,源码分享啦

    目录 一:两个小游戏的预览图效果图: 二:简单版双人足球赛源码: 三:复杂多人控制版足球赛源码 先来动态gif效果图: 四年一度的世界杯正在卡塔尔火热进行中! 在绿茵场内,有胜利的呐喊,有失败的沮丧: ...

最新文章

  1. pytorch指定gpu
  2. python操作系统-python获取操作系统平台、版本及架构
  3. mac hdmi 不能调整音量_如何使用Mac的媒体键在DisplayPortHDMI或Thunderbolt监视器上调整扬声器音量...
  4. 变量 常量 作用域和命名规范
  5. mysql 存储过程创建以及调用
  6. SpringBoot之kafka对接topic
  7. APP,webapp 设计相关资料汇集区
  8. linux环境下tomcat启动成功,部分请求页面出现404
  9. 【生信进阶练习1000days】day11day12-GEO data mining
  10. 实战分析PHP大马隐藏后门——案例一
  11. Go语言 windows环境安装
  12. python租房_【Python】租房经历总结—–我是如何2天找到合适租房的(房东直租)简单粗暴...
  13. 2012服务器系统有什么版本的,Windows server 2012操作系统有哪几个版本
  14. 大数据开发超高频面试题!大厂面试必看!包含Hadoop、zookeeper、Hive、flume、kafka、Hbase、flink、spark、数仓等
  15. 用dw 删除重复html文件,Dreamweaver怎么撤销重做,DW怎么返回上一步,看完就明白了...
  16. 详细设计说明书部分样例
  17. MySQL数据库项目式教程思维导图
  18. 开源材料数据库Materials Project
  19. java忽略转移i字符_Java。 比较字符串时忽略重音
  20. brew cask安装软件提示:Error: Unknown command: cask

热门文章

  1. 重置服务器硬件管理口 IMM IPMI BMC 密码
  2. 我所认为最深沉的爱,莫过于分开以后,我将自己,活成了你的樣子
  3. Delphi----心得03
  4. 微信公众号投票思路,可以使用任何语言搞定!
  5. ubuntu下的定时器编写
  6. 微信小程序如何写一个计算器
  7. python零基础入门教程会计-python做会计
  8. isNotEmpty和isNotBlank区别
  9. vue项目实现屏幕自适应
  10. html5中skew,css3 skew()属性怎么用?