一个完整的demo中将知识融会贯通
下次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函数就来了。
好了,我们依旧贴出详细注释的源代码~
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> [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中将知识融会贯通相关推荐
- 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
本系列文章由zhmxy555编写,转载请注明出处. 文章链接 http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云 邮箱: ...
- 【Visual C 】游戏开发笔记十六 讲解一个完整的回合制游戏demo
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- [原]【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
本系列文章由zhmxy555编写,转载请注明出处. 文章链接 http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云 邮箱: ...
- 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
本系列文章由zhmxy555编写,转载请注明出处. 文章链接 http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云 邮箱: ...
- react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)
react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...
- 【如何快速的开发一个完整的iOS直播app】(采集篇)
前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,首先需要采集主播的视频和音频,然后传入流媒体服务器,本篇主要讲解如何采 ...
- WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用
在完成了对于WCF事务编程(<上篇>.<中篇>.<下篇>)的介绍后,本篇文章将提供一个完整的分布式事务的WCF服务应用,通过本例,读者不仅仅会了解到如何编程实现事务 ...
- 转给你身边的工程师!从零开始搭建一个完整AGV控制系统
导语 大家好,我是智能仓储物流技术研习社的社长,老K.在我们仓储物流自动化行业中,AGV被应用的越来越多,这个词被提及的场合也越来越多.一个完整的AGV究竟是怎么实现移动.导航.搬运的呢?今天分享一个 ...
- Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站
Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...
- 组成计算机系统的是__,一个完整的计算机系统的组成部分的确切提法应该是______...
答案 查看答案 解析: [解析题]计算机中,在相同分辨率的情况下,一幅24位真彩色图像所占用的存储空间是一幅16色的图像所占用的存储空间的_________倍. [解析题]你认为最能反映计算机主要功能 ...
最新文章
- 聊天机器人之文本分词
- 机房收费系统重构(五)—登陆窗口完整版
- .Net Framework 4.5 zip压缩原生支持
- mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...
- android drawable 比例,Android中的Drawable基础与自定义Drawable
- 使用java实现冒泡排序和选择排序
- ASP.NET页生命周期介绍:阶段,事件及其他
- mysql 5.7.19 rpm下载_centos6.8 mysql5.7 rpm安装与完全卸载
- C++标准转换运算符:const_cast
- linux mysql utf-8编码_笔记:linux下mysql设置utf-8编码方法
- PHP视频网站源码 带APP源代码 支持FFMPEG
- 第四届“传智杯”全国大学生IT技能大赛(练习赛)【完结】
- 多张图片合成一张jpg工具_如何将两张图片合成一张图片?
- excel随机数_办公软件操作技巧052:如何在excel中填充随机数
- xargs -i参数详解
- 搭建各类游戏如何选择合适的服务器
- 一文搞懂 Web Worker(原理到实践)
- mysql的安装与初始化
- 复分析阿尔福斯下载中文_《复分析(原书第3版)》([美]阿尔福斯(Ahlfors,L.V.))【摘要 书评 试读】- 京东图书...
- C++11 线程同步原语
热门文章
- 微信公众平台如何设置欢迎信息
- Python:Python进阶:Python字符串驻留技术
- SGU-495 Kids and Prizes 概率DP
- could not read ok from ADB Server * failed to start daemon error: cannot connect to daemon
- ie使用blob下载txt文件无效
- Springboot基于Aop日志拦截接口
- 计算机考研边工作边二战,二战考研边工作边考研,你需要注意三件事
- 一个小公司老板日常管理的21个方面
- 美国《商业周刊》:从“IT 100强”解析未来趋势
- python编写一个简单的程序验证码_Python编写一个验证码图片数据标注GUI程序附源码...