一、 计算机角色的简单动画

先是使用Windows本身定时器创建程序的代码:

#include "stdafx.h"
#include "MyGameFrame.h"
#include <stdio.h>        // 全局变量:
HINSTANCE hInst;
HWND      hWnd;
HDC       hdc, mdc;
HBITMAP   horse[8];       //图像位图
int       num;            //当前图像帧数// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitWindow(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR    lpCmdLine,int       nCmdShow)
{// 初始化全局字符串    MyRegisterClass(hInstance);// 执行应用程序初始化:     if (!InitWindow(hInstance, nCmdShow))//初始化窗口    {return FALSE;//如果不成功则返回FALSE,并退出程序    }MSG msg; //创建消息类对象 char filename[20] = "";int i;hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);//加载位图for (i = 0; i<8; i++) { sprintf_s(filename, "horse%d.bmp", i);horse[i] = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 405, 300, LR_LOADFROMFILE);}num = 0;//创建定时器SetTimer(hWnd, 1, 60, NULL);SelectObject(mdc, horse[num]);BitBlt(hdc, 0, 0, 405, 300, mdc, 0, 0, SRCCOPY);num++;PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);//赋初值    while (msg.message != WM_QUIT)         //进入游戏消息循环:    {if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){TranslateMessage(&msg); //获得游戏玩家输入的消息;    DispatchMessage(&msg);//分配玩家消息并响应用户消息。    }}return (int)msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex ={wcex.cbSize = sizeof(WNDCLASSEX),CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,WndProc,0,0,hInstance,LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYGAMEFRAME)),LoadCursor(NULL, IDC_ARROW),(HBRUSH)(COLOR_WINDOW + 1),NULL,_T("GameFrame"),LoadIcon(NULL,MAKEINTRESOURCE(IDI_SMALL))};return RegisterClassEx(&wcex);
}BOOL InitWindow(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中          hWnd = CreateWindow(_T("GameFrame"),_T("游戏框架"),WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,//普通样式,不能改变大小,不能最大化    CW_USEDEFAULT, CW_USEDEFAULT, 405, 300, nullptr, nullptr, hInstance, nullptr);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{  switch (msg)                        //判断消息    {case WM_CREATE://执行初始化代码                  return(0);break;case WM_TIMER:if (num == 8)num = 0;SelectObject(mdc, horse[num]);BitBlt(hdc, 0, 0, 405, 300, mdc, 0, 0, SRCCOPY);num++;break;case WM_DESTROY:DeleteDC(mdc);ReleaseDC(hWnd, hdc);for (int i = 0; i<8; i++)DeleteObject(horse[i]);KillTimer(hWnd, 1);PostQuitMessage(0);break;default:break;}return (DefWindowProc(hwnd, msg, wparam, lparam));
}       

动画效果如下

二、接下来是绘制计算机角色的循环动画

使用游戏运行时间产生事件消息的代码:

首先我们需要在全局变量上添加

//DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位。
DWORD     tNow,tPre;                         //当前时间与结束时间

删除

//创建定时器
SetTimer(hWnd, 1, 60, NULL);

将消息循环函数更改为

 while (msg.message != WM_QUIT)         //进入游戏消息循环:  {if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){TranslateMessage(&msg); //获得游戏玩家输入的消息;  DispatchMessage(&msg);//分配玩家消息并响应用户消息。  }else{tNow = GetTickCount();                          //取得目前时间if (tNow - tPre >= 40) {    //可在while循环外设置tpre初值if (num == 8)     num = 0;SelectObject(mdc, horse[num]);BitBlt(hdc, 0, 0, 405, 300, mdc, 0, 0, SRCCOPY);tPre = GetTickCount();                 //取得结束时间num++;}}}

删除WndProc()函数中的

Case  VM_TIMER相关处理内容

 case WM_TIMER:if (num == 8)num = 0;SelectObject(mdc, horse[num]);BitBlt(hdc, 0, 0, 405, 300, mdc, 0, 0, SRCCOPY);num++;break;

以及删除VM_DESTROY中

KillTimer(hWnd, 1);

运行结果同定时器处理结果。

三、接下来是绘制计算机角色的透明动画

#include "stdafx.h"
#include "MyGameFrame.h"
#include <stdio.h>          // 全局变量:
HINSTANCE hInst;
HWND      hWnd;
HDC       hdc, mdc;
HBITMAP   bmp;            //
HBITMAP   horse;          //图像位图
HBITMAP   bg;             //背景
int       num;            //当前图像帧数//DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位。
DWORD     tNow, tPre;    //当前时间与结束时间//为了防止游戏画面更新时出现透明贴图过程中产生的闪烁现象。制作透明动画必须在一个暂存的内存DC上完成每一张走动图的透明然后再贴到窗口上。
HDC      bufdc;// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitWindow(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR    lpCmdLine,int       nCmdShow)
{// 初始化全局字符串      MyRegisterClass(hInstance);// 执行应用程序初始化:       if (!InitWindow(hInstance, nCmdShow))//初始化窗口      {return FALSE;//如果不成功则返回FALSE,并退出程序      }MSG msg; //创建消息类对象   char filename[20] = "";hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc);//缓存DC//创建与指定的设备环境相关的设备兼容的位图bmp = CreateCompatibleBitmap(hdc, 960, 720);SelectObject(mdc, bmp);horse = (HBITMAP)LoadImage(NULL, "horse.bmp", IMAGE_BITMAP, 1624, 300, LR_LOADFROMFILE);bg = (HBITMAP)LoadImage(NULL, "bg.bmp", IMAGE_BITMAP, 960, 720, LR_LOADFROMFILE);int x, y;//绘制图画(一帧)num = 0;                         //显示图号x = -50;                         //贴图起始X坐标y = 150;                      //贴图起始Y 坐标SelectObject(bufdc, bg);BitBlt(mdc, 0, 0, 960, 720, bufdc, 0, 0, SRCCOPY);SelectObject(bufdc, horse);//透明处理BitBlt(mdc, x, y, 203, 150, bufdc, num * 203, 150, SRCAND);BitBlt(mdc, x, y, 203, 150, bufdc, num * 203, 0, SRCPAINT);BitBlt(hdc, 0, 0, 960, 720, mdc, 0, 0, SRCCOPY);//结束时间//GetTickCount()函数,该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔tPre = GetTickCount();num++;//动画移动x += 20;if (x >= 900)x = -50;PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);//赋初值      while (msg.message != WM_QUIT)         //进入游戏消息循环:  {if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){TranslateMessage(&msg); //获得游戏玩家输入的消息;  DispatchMessage(&msg);//分配玩家消息并响应用户消息。  }else{tNow = GetTickCount();//获取当前时间if (tNow - tPre >= 100)//程序每隔100个单位时间进行一次绘图操作  {if (num == 8)   num = 0;SelectObject(bufdc, bg);BitBlt(mdc, 0, 0, 960, 720, bufdc, 0, 0, SRCCOPY);SelectObject(bufdc, horse);//透明操作BitBlt(mdc, x, y, 203, 150, bufdc, num * 203, 150, SRCAND);BitBlt(mdc, x, y, 203, 150, bufdc, num * 203, 0, SRCPAINT);BitBlt(hdc, 0, 0, 960, 720, mdc, 0, 0, SRCCOPY);tPre = GetTickCount();//获取结束时间num++;//动画移动x += 20;if (x >= 900)x = -50;}}}return (int)msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex ={wcex.cbSize = sizeof(WNDCLASSEX),CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,WndProc,0,0,hInstance,LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYGAMEFRAME)),LoadCursor(NULL, IDC_ARROW),(HBRUSH)(COLOR_WINDOW + 1),NULL,_T("GameFrame"),LoadIcon(NULL,MAKEINTRESOURCE(IDI_SMALL))};return RegisterClassEx(&wcex);
}BOOL InitWindow(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中            hWnd = CreateWindow(_T("GameFrame"),_T("游戏框架"),WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,//普通样式,不能改变大小,不能最大化      CW_USEDEFAULT, CW_USEDEFAULT, 960, 720, nullptr, nullptr, hInstance, nullptr);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{switch (msg)                        //判断消息      {case WM_CREATE://执行初始化代码                    return(0);break;case WM_DESTROY:DeleteDC(mdc);ReleaseDC(hWnd, hdc);DeleteObject(horse);PostQuitMessage(0);break;default:break;}return (DefWindowProc(hwnd, msg, wparam, lparam));
} 

最后结果如下:

利用C++创建一个游戏(4)计算机角色动画(代码+注释)相关推荐

  1. 利用C++创建一个游戏(9)愤怒的小鸟(代码+注释)

    #include "stdafx.h" #include "MyGameFrame.h" #include <stdio.h>//小鸟结构体 str ...

  2. 利用C++创建一个游戏(3)游戏地图绘制(代码+注释)

    首先注意的是我们要将地图素材放置项目文件夹中. #include "stdafx.h" #include "MyGameFrame.h" //源cpp文件引申出 ...

  3. Cocoa利用TexturePacker创建的纹理图集实现角色的帧动画

    Cocoa利用TexturePacker创建的纹理图集实现角色的帧动画 by 大熊猫侯佩 什么是TexturePacker TexturePacker是一个非常棒的纹理集制作工具,广泛应用在2D游戏的 ...

  4. Linux Namespace系列(09):利用Namespace创建一个简单可用的容器

    本文将演示如何利用namespace创建一个完整的容器,并在里面运行busybox.如果对namespace不是很熟悉,请先参考前面几遍介绍不同类型namespace的文章. busybox是一个Li ...

  5. 利用thinkphp创建一个简单的站点

    本文我们将利用thinkphp创建一个简单的站点,这里所使用的thinkphp版本是5.0.24,这里是它的中文文档.如果有需要可以参考它的中文文档. thinkphp框架是一个典型的MVC框架,该框 ...

  6. 如何从零开始创建一个游戏团队?

    ##前言 不同规模,不同做法. 做小型独立游戏:1-3个人随便做,没什么必需非必需: 如果正式做:首先做好立项书,然后找合伙人(也可以没有),注册公司,找资金(自己出钱或者找投资),找场地,按需招人, ...

  7. 利用GLFW创建一个窗口

    利用GLFW创建一个窗口 创建窗口前的准备工作 GLFW初始化 设置界面属性 界面相关属性 缓冲区相关属性 上下文相关属性 各个属性的默认值和取值范围 创建窗口 显示窗口 完整代码 窗口事件交互 完整 ...

  8. 用SVG和Vanilla JS框架创建一个“星形变心形”的动画效果

    在我写的这篇文章中, 讲述了如何用Vanilla JavaScript使动画顺滑的从一种状态过渡到另一种.最好先看下那篇文章,因为在这篇文章中我们要用到一些那篇文章中讲过的内容.例如例子的演示.各种时 ...

  9. php简单的购物车,利用PHP实现一个简单购物车的demo示例代码

    利用PHP实现一个简单购物车的demo示例代码 数据结构跟关于PHP写购物车大体差不多,这里站长主要就购物车的主要业务逻辑进行一下说明: 1.用户未登陆时只能浏览商品,不能将其加入购物车 2.当未登陆 ...

最新文章

  1. gevent queue应用1
  2. python print 不能立即打印输出 解决方法
  3. 目睹鸿蒙开创四大至高位面,吞噬星空 绝非鸿蒙系列,完结前最后的分析【申精】...
  4. 今天晴朗,但是由于晚上睡眠不是很好就头昏眼花
  5. c语言用hash方式数组去重,js数组去重的hash方法
  6. 曾国藩:诚敬静谨恒!
  7. JS笔记-前端实现验证码功能
  8. ((CTRL-CHAR,code 8)) : only regular white space is allowed between tokens
  9. 帷幕的帷是什么意思_公务员最低服务年限是什么意思,被录用后辞职,还能考公务员吗...
  10. Ace Admin 学习笔记
  11. Javascript四种调用模式中的this指向
  12. 【FlexSim2019】自学笔记:一个实例看何为A连接?何为S连接?其意义的深入探讨
  13. react调试工具Reactdevelopertools
  14. 医用耗材管理系统设计思路分享来自北京博奥智源
  15. Maven打包时指定配置文件
  16. 如何删除“我的电脑”、“此电脑”中坚果云图标--三种方法(2020年的可行方案)
  17. 用Python告诉你深圳房租有多高?
  18. Linux普通用户su root权限的开启和禁止
  19. 全屏播放PPT时,播放音乐
  20. 弹性裸金属服务器EBM

热门文章

  1. STM32H750之SPI踩坑笔记
  2. 新手入门——详解时间序列预测(用Python)
  3. 取近似值 java
  4. Unity接入Android广告: 三、Android端接入小米广告SDK
  5. nas安装emby_威联通QNAP系统入门进阶 篇二:宅家新姿势—威联通NAS安装套件版Emby搭建家庭影音服务器...
  6. mega11进化树分析
  7. speedoffice(Excel)中表格怎样从竖向变成横向
  8. 服务器和数据库哪一个更重要
  9. SpringBoot实现Excel读取
  10. skydive前端代码框架分析