一、键盘

1.虚拟键码:Windows系统下所有的按键被视为虚拟键(包含鼠标在内),每一个虚拟键都有其对应的虚拟键码;

2.键盘消息

(1)VM_KEWDOWN:按下按键消息;

(2)VM_KEYUP       :松开按键消息;

(3)VM_CHAR         :字符消息,当按下的按键为定义于ASCII码中的可打印字符时,便发出此字符消息;

3.系统键

(1)VM_SYSKEYDOWN:按下系统键消息;

(2)VM_SYSKEYUP      :松开系统键消息;

二、键盘消息处理

1.LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

(1)wParam:表示按下按键的虚拟键码;

(2)lParam  :存储按键的相关状态信息;

三、利用键盘上、下、左、右控制人物

1.首先设置人物的起始贴图坐标和起始方向,用0、1、2、3表示上、下、左、右,起始设为0;

2.初始化函数中,除贴背景图外,根据方向选择要贴的人物,还有根据方向判断人物图的宽和高,以便进行透明处理和贴图

操作,此时若没有按键操作,WinMain函数将每隔一段时间进行贴图操作,从而实现了人物的原地跑动;

3.若此时按下向下的按键,消息处理函数接收按键消息,接着要判断当前人物所处的方向,根据不同的方向,适当修正,只要有

明显下移就可以,然后判断y的值不能比地图的高还大,要设临界值;

4.更改了贴图坐标后,把方向设为1(下是1),然后就去指向绘图函数,然后又是重复2的操作;

四、效果

五、代码如下


#include "stdafx.h"
#include <stdio.h>HINSTANCE hInst;
HBITMAP girl[4],bg;
HDC     hdc,mdc,bufdc;
HWND    hWnd;
DWORD   tPre,tNow;
int     num,dir,x,y;//num:连续图中的小图编号;dir:人物移动的方向;x,y为人物贴图坐标ATOM              MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                MyPaint(HDC hdc);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nCmdShow)
{MSG msg;MyRegisterClass(hInstance);if (!InitInstance (hInstance, nCmdShow)) {return FALSE;}while( msg.message!=WM_QUIT ){if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) ){TranslateMessage( &msg );DispatchMessage( &msg );}else{tNow = GetTickCount();if(tNow-tPre >= 40)MyPaint(hdc);}}return msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style          = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.cbClsExtra     = 0;wcex.cbWndExtra        = 0;wcex.hInstance     = hInstance;wcex.hIcon         = NULL;wcex.hCursor        = NULL;wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName  = NULL;wcex.lpszClassName  = "canvas";wcex.hIconSm      = NULL;return RegisterClassEx(&wcex);
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{HBITMAP bmp;hInst = hInstance;hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}MoveWindow(hWnd,10,10,640,500,true);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc);bmp = CreateCompatibleBitmap(hdc,640,480);SelectObject(mdc,bmp);x = 300;y = 250;//人物的起始贴图位置(300,250)dir = 0;//起始面向上num = 0;girl[0] = (HBITMAP)LoadImage(NULL,"girl0.bmp",IMAGE_BITMAP,440,148,LR_LOADFROMFILE);girl[1] = (HBITMAP)LoadImage(NULL,"girl1.bmp",IMAGE_BITMAP,424,154,LR_LOADFROMFILE);girl[2] = (HBITMAP)LoadImage(NULL,"girl2.bmp",IMAGE_BITMAP,480,148,LR_LOADFROMFILE);girl[3] = (HBITMAP)LoadImage(NULL,"girl3.bmp",IMAGE_BITMAP,480,148,LR_LOADFROMFILE);bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);MyPaint(hdc);return TRUE;
}void MyPaint(HDC hdc)
{int w,h;SelectObject(bufdc,bg);BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);SelectObject(bufdc,girl[dir]);switch(dir){case 0:w = 55;h = 74;break;case 1:w = 53;h = 77;break;case 2:w = 60;h = 74;break;case 3:w = 60;h = 74;break;}BitBlt(mdc,x,y,w,h,bufdc,num*w,h,SRCAND);BitBlt(mdc,x,y,w,h,bufdc,num*w,0,SRCPAINT);BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);tPre = GetTickCount();         num++;if(num == 8)num = 0;}//Esc键结束程序
//方向键重设贴图坐标
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_KEYDOWN:                switch (wParam) {case VK_ESCAPE:           PostQuitMessage( 0 );break;case VK_UP:               switch(dir){case 0:   y -= 10;break;case 1:x -= 1;y -= 8;break;case 2: x += 2;y -= 10;break;case 3:x += 2;y -= 10;break;}if(y < 0)y = 0;dir = 0;break;case VK_DOWN:          switch(dir){case 0:x += 1;y += 8;break;case 1:y += 10;break;case 2:x += 3;y += 6;break;case 3:x += 3;y += 6;break;}if(y > 375)y = 375;dir = 1;break;case VK_LEFT:             switch(dir){case 0:x -= 12;break;case 1:x -= 13;y += 4;break;case 2:x -= 10;break;case 3:x -= 10;break;}if(x < 0)x = 0;dir = 2;break;case VK_RIGHT:               switch(dir){case 0:x += 8;break;case 1:x += 7;y += 4;break;case 2:x += 10;break;case 3:x += 10;break;}if(x > 575)  //640-60x = 575;dir = 3;break;}break;case WM_DESTROY:                  int i;DeleteDC(mdc);DeleteDC(bufdc);for(i=0;i<4;i++)DeleteObject(girl[i]);DeleteObject(bg);ReleaseDC(hWnd,hdc);PostQuitMessage(0);break;default:                          return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

Visual C++游戏编程基础之键盘消息相关推荐

  1. Visual C++游戏编程基础之利用鼠标消息实现贴图

    一.鼠标键入消息 1.WM_LBUTTONDBLCLK       双击鼠标左键: 2.WM_LBUTTONDOWN         单击鼠标左键: 3.WM_LBUTTONUP            ...

  2. Visual C++游戏编程基础之透明半透明效果

    一.基本思路 1.半透明的原理 一张位图由许多像素组成,而每一像素包含R.G.B三原色,三原色的值决定了像素的色彩,要实现半透明效果,需要把前景图    和背景图彼此对应的像素颜色按某一比例进行调配, ...

  3. Visual C++游戏编程基础之多背景循环动画

    一.基本思路 1.现在有三张背景图:天空和草地.山峦.房屋: 2.天空在最远处,其次是草地和山峦(因为山峦在草地上),最后是房屋: 3.背景的循环速度是天空最慢.然后是山峦.最后是草地和房屋: 4.恐 ...

  4. Visual C++游戏编程基础之摩擦力、加速度、重力

    一.基本思路 1.假设小球在空中只受到重力作用,一开始给它一个水平的速度,就像是平抛运动一样: 2.当小球碰到地面时,受到摩擦力作用,分为x方向和y方向: 3.在摩擦力作用下,1.减少水平方向的速度, ...

  5. Visual C++游戏编程基础之景物贴图

    一.基本思路 1.首实现斜角贴图,需要显示菱形图块,使用矩形图块贴图,但是要将它的周围进行透明处理,只显示菱形部分 2.计算图块索引值的公式: 列编号 = 索引值 / 每一列的图块个数: 行编号 =  ...

  6. Visual C++游戏编程基础之追逐移动

    一.基本思路 1.追逐移动的实现与飞机追随鼠标光标原理类似: 2.现在小鸟作为追逐者,设定其贴图坐标为(nowX-25,nowY-16),其中(nowX,nowY)是飞机的贴图坐标: 3.通过判断小鸟 ...

  7. 游戏编程基础(五)背景地图滚动显示

    在游戏过程中,背景地图需要跟着人物的移动而动态的滚动变换.C++游戏编程基础中介绍了2D游戏中常用的3种动态背景表现手法.其原理和实现技巧分析如下: 方法一:单一背景滚动         原理是:利用 ...

  8. VC++游戏编程基础无法找到“d3d9.h”问题

    经反复查阅是缺少Direct X SDK导致的,我用的是VC++6.0,支持Direct X SDK 9.0b及之前的版本,最新版DX SDK(JUNE)VC6驾驭不了...下面是我解决问题的思路(只 ...

  9. Building JavaScript Games for Phones Tablets and Desktop(2)-游戏编程基础

    2019独角兽企业重金招聘Python工程师标准>>> 这章覆盖了游戏编程的基本原理.首先,你会了解到游戏的基本框架,就是一个游戏世界和一个游戏循环.你将会通过不同的例子学到如何用J ...

最新文章

  1. SLAM后端优化中卡尔曼滤波的直观通俗解释
  2. java面试-死锁产生、定位、修复
  3. python 字符串数组互转
  4. 首航节能:光热行业刚起步 子公司处于亏损状态
  5. MySql 内存表使用
  6. python合并两个属性_合并两个部分包含文件列表及其属性的最有效方法
  7. android studio日历小程序,android studio无法加载日历界面
  8. 布尔盲注怎么用,一看你就明白了。布尔盲注原理+步骤+实战教程
  9. QT中foreach的使用
  10. 【Swing/文本组件】定义自动换行的文本域
  11. ef mysql 读写分离_基于 EntityFramework 的数据库主从读写分离服务插件
  12. bzoj 3351 [ioi2009]Regions
  13. SnackbarUtils:一行代码搞定Snackbar
  14. WEB API异常处理
  15. 华为P30将在3月26日发布
  16. cs231n assignment3
  17. acs cisco 查看log_Cisco ASA 5510 防火墙 配置笔记
  18. U3D Distortion
  19. 数据科学与大数据技术和计算机科学与技术哪个好
  20. 移动端手指事件和手机事件:

热门文章

  1. JS 的 Promise详解
  2. 仿芒果TV微信小程序源码
  3. PostgreSQL 数据安全之数据加密
  4. 浅谈ISP-噪声模型1
  5. 一文告诉你什么是内容可视化?
  6. 高斯判别算法GDA(吴恩达机器学习c#实践,生成高斯模板显示同心圆马氏距离,一)
  7. 粘连 Footer 的 5 种方法 | CSS-Tricks
  8. MyBatisPlus代码生成器的使用(超详细)
  9. vue项目用ip不能访问,用localhost可以访问
  10. EPSON墨盒及打印机型号对照