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

先是使用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. JAVA springboot微服务b2b2c电子商务系统(十三)断路器聚合监控(Hystrix Turbine)
  2. 17 Java面试之css
  3. 【Java源码分析】ArrayList源码分析
  4. 详解JavaScript数组(一)
  5. maven3常用命令、java项目搭建、web项目搭建
  6. 3 帮助命令、用户管理、压缩
  7. 微信小程序复制到剪切板及换行问题
  8. WM有约(五):部署应用程序
  9. MATLAB图像处理之图像的像素矩阵
  10. 获取分辨率函数是什么_信号的时间域分辨率和频率域分辨率
  11. 视觉SLAM十四讲中的修改代码总结
  12. 从零开始学习CANoe(四)—— 设计panel
  13. matlab 分子动力学,两体的分子动力学模型-MATLAB源程序
  14. springboot+vue疫情管理大作业
  15. 10027Longest Ordered Subsequence Extention
  16. 《浮生六记》年表整理
  17. 办公室装修的五要四不要
  18. python立体爱心_css绘制各种各样的形状图形
  19. css3彩色3D文字上下漂浮动画js特效
  20. STM32外设配置—什么时候需要开启AFIO时钟?

热门文章

  1. 电源管理芯片:nxp电源管理芯片的参考与设计
  2. Dubbo源码解析-Dubbo服务消费者_Dubbo协议(一)
  3. 【180720】微软Windows扫雷游戏代码
  4. Java 中的取近似值的方法
  5. QEMU 模拟器(一)
  6. Python闭包Closure
  7. python time 模块函数
  8. ES篇:ElasticSearch教程——创建索引、类型、文档
  9. maven常见面试题
  10. 数据结构(严蔚敏)的一些排序算法源代码