下次X轴坐标=在X轴上的速度分量+当前X轴坐标

  下次Y轴坐标=在Y轴上的速度分量+当前Y轴坐标

  2.加速运动

  加速运动就是具有加速度的运动,它的速度会随着时间而改变。

  公式我们可以表示如下:

  V=Vo+at

  这是高中物理运动学里最基本的公式了~其中,V为当前速度,V0为初速度,a为加速度,t为物体从速度为V0时记起的时间

  那么同样将此速度分解,我们得到:

  Vx=Vxo+axt

  Vy=Vyo+ayt

  我们设时间间隔t=1

  则我们可以推算出加入加速度之后,物体下一刻所在的位置:

  Sx=Sxo+Vx*1

  Sy=Syo+Vy*1

  将这两个公式运用到我们的代码里面就可以实现加速运动的模拟了。

  这些知识都是非常基础的,实现方式都非常的简单,但是还有颇多细节,希望好学的你能多思考,多挖掘。

  二、在一个完整的demo中将知识融会贯通

  了解了基本运动学的原理之后,下面我们就来一起看下这节笔记里面的demo,在实例中将本节知识融会贯通。

  这节的demo是一个匀速运动,碰到窗口边缘时就进行反弹的“愤怒的小鸟”,非常的可爱。

  浅墨感觉学完这节后大家就可以自己实现win7里的那个”多彩气泡“的屏幕保护程序,有兴趣的朋友可以试着写写看,调用一些Windows API函数就来了。

  好了,我们依旧贴出详细注释的源代码~

#div_code img{border:0px;}<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt [cpp] view plaincopyprint?

  #include " stdafx.h "

  #include

   // 全局变量声明

  HINSTANCE hInst;

  HBITMAP bg,bird;

  HDC hdc,mdc,bufdc;

  HWND hWnd;

  DWORD tPre,tNow,tCheck;

  RECT rect; // 定义一个RECT结构体,用于储存内部窗口区域的坐标

   int x = 50 ,y = 50 ,vx = 15 ,vy = 15 ; // x与y是小鸟在窗口中的贴图坐标,vx与vy为小鸟在x与y轴运动的速度分量

   // 全局函数声明

  ATOM MyRegisterClass(HINSTANCE hInstance);

  BOOL InitInstance(HINSTANCE, int );

  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  void MyPaint(HDC hdc);

   //**** WinMain函数,程序入口点函数 **************************************

   int APIENTRY WinMain(HINSTANCE hInstance,

  HINSTANCE hPrevInstance,

  LPSTR lpCmdLine,

   int nCmdShow)

  {

  MSG msg;

  MyRegisterClass(hInstance);

   // 初始化

   if (!InitInstance (hInstance, nCmdShow))

  {

  return FALSE ;

  }

   // 消息循环

  GetMessage( & msg, NULL , NULL , NULL ); // 初始化msg

   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 , 600 , 450 , true );

  ShowWindow(hWnd, nCmdShow);

  UpdateWindow(hWnd);

  hdc = GetDC(hWnd);

  mdc = CreateCompatibleDC(hdc);

  bufdc = CreateCompatibleDC(hdc);

  bmp = CreateCompatibleBitmap(hdc, 640 , 480 );

  SelectObject(mdc,bmp);

  bg = (HBITMAP)LoadImage( NULL , " bg.bmp " ,IMAGE_BITMAP, 640 , 480 ,LR_LOADFROMFILE);

  bird = (HBITMAP)LoadImage( NULL , " angrybird.bmp " ,IMAGE_BITMAP, 120 , 60 ,LR_LOADFROMFILE);

  GetClientRect(hWnd, & rect); // 取得内部窗口区域的大小

  MyPaint(hdc);

  return TRUE ;

  }

   //**** 自定义绘图函数 *********************************

   // 1 .进行窗口贴图

   // 2 .计算小鸟贴图坐标并判断小鸟是否碰到窗口边沿

  void MyPaint(HDC hdc)

  {

  SelectObject(bufdc,bg);

  BitBlt(mdc, 0 , 0 , 640 , 480 ,bufdc, 0 , 0 ,SRCCOPY);

  SelectObject(bufdc,bird);

  BitBlt(mdc,x,y, 60 , 60 ,bufdc, 60 , 0 ,SRCAND);

  BitBlt(mdc,x,y, 60 , 60 ,bufdc, 0 , 0 ,SRCPAINT);

  BitBlt(hdc, 0 , 0 , 640 , 480 ,mdc, 0 , 0 ,SRCCOPY);

   // 计算X轴贴图坐标与速度

  x += vx;

   if (x <= 0 )

  {

  x = 0 ;

  vx = - vx;

  }

   else if (x >= rect.right - 60 )

  {

  x = rect.right - 60 ;

  vx = - vx;

  }

   // 计算Y轴贴图坐标与速度

  y += vy;

   if (y <= 0 )

  {

  y = 0 ;

  vy = - vy;

  }

   else if (y >= rect.bottom - 60 )

  {

  y = rect.bottom - 60 ;

  vy = - vy;

  }

  tPre = GetTickCount(); // 记录此次绘图时间

  }

   **** 消息处理函数 ***********************************

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

  {

  switch (message)

  {

   case WM_KEYDOWN: // 按键消息

   if (wParam == VK_ESCAPE) // 按下【Esc】键

  PostQuitMessage( 0 );

  break;

   case WM_DESTROY: // 窗口结束消息

  DeleteDC(mdc);

  DeleteDC(bufdc);

  DeleteObject(bg);

  DeleteObject(bird);

  ReleaseDC(hWnd,hdc);

  PostQuitMessage( 0 );

  break;

  default: // 其他消息

  return DefWindowProc(hWnd, message, wParam, lParam);

  }

转载于:http://blog.itpub.net/27212986/viewspace-739026/

一个完整的demo中将知识融会贯通相关推荐

  1. 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    本系列文章由zhmxy555编写,转载请注明出处. 文章链接  http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云    邮箱:  ...

  2. 【Visual C 】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  3. [原]【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    本系列文章由zhmxy555编写,转载请注明出处. 文章链接  http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云    邮箱:  ...

  4. 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    本系列文章由zhmxy555编写,转载请注明出处. 文章链接  http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云    邮箱:  ...

  5. react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)

    react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...

  6. 【如何快速的开发一个完整的iOS直播app】(采集篇)

    前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,首先需要采集主播的视频和音频,然后传入流媒体服务器,本篇主要讲解如何采 ...

  7. WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用

    在完成了对于WCF事务编程(<上篇>.<中篇>.<下篇>)的介绍后,本篇文章将提供一个完整的分布式事务的WCF服务应用,通过本例,读者不仅仅会了解到如何编程实现事务 ...

  8. 转给你身边的工程师!从零开始搭建一个完整AGV控制系统

    导语 大家好,我是智能仓储物流技术研习社的社长,老K.在我们仓储物流自动化行业中,AGV被应用的越来越多,这个词被提及的场合也越来越多.一个完整的AGV究竟是怎么实现移动.导航.搬运的呢?今天分享一个 ...

  9. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  10. 组成计算机系统的是__,一个完整的计算机系统的组成部分的确切提法应该是______...

    答案 查看答案 解析: [解析题]计算机中,在相同分辨率的情况下,一幅24位真彩色图像所占用的存储空间是一幅16色的图像所占用的存储空间的_________倍. [解析题]你认为最能反映计算机主要功能 ...

最新文章

  1. 聊天机器人之文本分词
  2. 机房收费系统重构(五)—登陆窗口完整版
  3. .Net Framework 4.5 zip压缩原生支持
  4. mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...
  5. android drawable 比例,Android中的Drawable基础与自定义Drawable
  6. 使用java实现冒泡排序和选择排序
  7. ASP.NET页生命周期介绍:阶段,事件及其他
  8. mysql 5.7.19 rpm下载_centos6.8 mysql5.7 rpm安装与完全卸载
  9. C++标准转换运算符:const_cast
  10. linux mysql utf-8编码_笔记:linux下mysql设置utf-8编码方法
  11. PHP视频网站源码 带APP源代码 支持FFMPEG
  12. 第四届“传智杯”全国大学生IT技能大赛(练习赛)【完结】
  13. 多张图片合成一张jpg工具_如何将两张图片合成一张图片?
  14. excel随机数_办公软件操作技巧052:如何在excel中填充随机数
  15. xargs -i参数详解
  16. 搭建各类游戏如何选择合适的服务器
  17. 一文搞懂 Web Worker(原理到实践)
  18. mysql的安装与初始化
  19. 复分析阿尔福斯下载中文_《复分析(原书第3版)》([美]阿尔福斯(Ahlfors,L.V.))【摘要 书评 试读】- 京东图书...
  20. C++11 线程同步原语

热门文章

  1. 微信公众平台如何设置欢迎信息
  2. Python:Python进阶:Python字符串驻留技术
  3. SGU-495 Kids and Prizes 概率DP
  4. could not read ok from ADB Server * failed to start daemon error: cannot connect to daemon
  5. ie使用blob下载txt文件无效
  6. Springboot基于Aop日志拦截接口
  7. 计算机考研边工作边二战,二战考研边工作边考研,你需要注意三件事
  8. 一个小公司老板日常管理的21个方面
  9. 美国《商业周刊》:从“IT 100强”解析未来趋势
  10. python编写一个简单的程序验证码_Python编写一个验证码图片数据标注GUI程序附源码...