Visual C++游戏开发笔记二十一 游戏基础物理建模三 摩擦力系统模拟Word文档下载推荐.docx
《Visual C++游戏开发笔记二十一 游戏基础物理建模三 摩擦力系统模拟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Visual C++游戏开发笔记二十一 游戏基础物理建模三 摩擦力系统模拟Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
>
rect.bottom-70)
//判断是否触地,如果触碰到窗口边界,进行调整
12.
{
13.
rect.bottom
-
70;
14.
15.
//X轴方向的摩擦力处理
16.
vx
fx;
//
vx=fx+vx;
这里fx为负值,所以每调用一次MyPiant(),vx恒定减小一个fx
17.
if(vx
<
0)
//当vx值递减到小于0时,就将其设为0,即小球在X方向不再移动。
18.
0;
19.
20.
//Y轴方向摩擦力处理
21.
fy;
//vy=fy+vy;
这里fy同样为负值,所以每调用一次MyPiant(),vy恒定减小一个fy
22.
if(vy
//若速度减到小于等于0,置为零,即小球在Y方向不再移动。
23.
24.
25.
-vy;
这段代码里面小鸟由高出下落触及地面进行反弹,且存在落地时的摩擦力,使得小鸟在落地弹跳后速度减慢,最后呈现静止的状态,停在窗口边缘。
二.神级游戏作品《暗黑破坏神Ⅲ》的介绍
既然已经提到了这款革命性的作品,我们就来介绍一下,即将在2012年5月15日全球上市的神级作品——《暗黑破坏神Ⅲ》
(DIABLOⅢ)(浅墨习惯称作大菠萝3,呵呵)。
当然《暗黑破坏神Ⅲ》是由我们无所不能的C++来开发的~
浅墨在这里不打算花大篇幅介绍,就简明扼要地提一下吧。
先贴一张暗黑破坏神Ⅲ的封面美图:
暗黑Ⅲ用C++编程语言开发(C++由于其执行的高效性,一直是中大型游戏开发的统治性编程语言),采用暴雪自家定制的
3D图形引擎,物理引擎采用Havok,于PC和Mac两个平台发售,并暂时不会登陆XBOX360及PlayStation等家用机平台。
《暗黑破坏神3》对于DirectX11进行了特殊的优化和加速,官方推荐使用WindowsVista或者Windows
7来进行游戏以便获
得更好的体验效果。
正所谓“暴雪出品,必属精品”,昨天浅墨偶尔看了下暗黑3五种职业的技能介绍视频,看完后热血沸腾,暴雪真的是没有辜
负广大暗黑粉丝这么多年的等待,用心做出了这么一款任何溢美之词都无法形容其精美的天赐之作。
暗黑Ⅲ有诸多新的亮点,让暗黑系列的动作角色扮演游戏体验达到一个新的高度,浅墨在这里列一些出来:
★五种强大的职业可供选择,包括野蛮人、巫医、法师、武僧以及恶魔猎手
★全新3D图像引擎将带来无与伦比的视觉效果,Havok物理引擎技术
★Sanctuary世界变幻莫测的室内外场景
★极具互动性的游戏环境,危险的陷阱与障碍,可被破坏的元素
★随机产生的事件与场景,带来无止境的动态游戏体验
★种类繁多的具有独特攻击方式和习性的恶魔与怪物
★全新任务系统加上角色定制选项,带来终极动作RPG体验
★可通过BN进行多人联网合作或对战
这张图是其中四种职业的合照(原本五职业),目测少了“恶魔猎手”这一帅气的职业:
更多内容去请大家前去
3.详细注释的源代码欣赏
好了回到我们的主题摩擦力吧,为了演示的方便直观,我们选择将笔记二十源码的一些内容进行更改,在其基础上模拟实现出摩擦力系统的效果。
依旧是国际惯例,贴出详细注释的源代码:
1.#include
"
stdafx.h"
2.#include
stdio.h>
3.
5.//全局变量
6.HINSTANCE
hInst;
7.HBITMAP
bg,angrybird;
8.HDC
hdc,mdc,bufdc;
9.HWND
hWnd;
10.DWORD
tPre,tNow,tCheck;
11.RECT
rect;
12.int
14.int
16.//全局函数
17.ATOM
MyRegisterClass(HINSTANCE
hInstance);
18.BOOL
InitInstance(HINSTANCE,
int);
19.LRESULT
CALLBACK
WndProc(HWND,
UINT,
WPARAM,
LPARAM);
20.void
MyPaint(HDC
hdc);
22.//****WinMain函数,程序入口点函数**************************************
*
23.int
APIENTRY
WinMain(HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
26.
int
nCmdShow)
27.{
28.
MSG
msg;
29.
30.
MyRegisterClass(hInstance);
31.
32.
//初始化
33.
if
(!
InitInstance
(hInstance,
nCmdShow))
34.
35.
return
FALSE;
36.
}
37.
38.
//消息循环
39.
GetMessage(&
msg,NULL,NULL,NULL);
//初始化msg
40.
while(
msg.message!
=WM_QUIT
)
41.
42.
if(
PeekMessage(
&
msg,
NULL,
0,0
PM_REMOVE)
43.
44.
TranslateMessage(
msg
);
45.
DispatchMessage(
46.
47.
else
48.
49.
tNow
GetTickCount();
50.
if(tNow-tPre
50)
51.
MyPaint(hdc);
52.
53.
54.
55.
msg.wParam;
56.}
57.
58.//****设计一个窗口类,类似填空题,使用窗口结构体*********************
59.ATOM
hInstance)
60.{
61.
WNDCLASSEX
wcex;
62.
63.
wcex.cbSize
sizeof(WNDCLASSEX);
64.
wcex.style
CS_HREDRAW
|
CS_VREDRAW;
65.
wcex.lpfnWndProc
(WNDPROC)WndProc;
66.
wcex.cbClsExtra
67.
wcex.cbWndExtra
68.
wcex.hInstance
hInstance;
69.
wcex.hIcon
NULL;
70.
wcex.hCursor
71.
LoadCursor(NULL,
IDC_ARROW);
72.
wcex.hbrBackground
(HBRUSH)(COLOR_WINDOW+1);
73.
wcex.lpszMenuName
74.
wcex.lpszClassName
maple"
;
75.
wcex.hIconSm
76.
77.
RegisterClassEx(&
wcex);
78.}
79.
80.//****初始化函数*************************************
81.//
1.加载位图资源
82.//
2.取得内部窗口区域信息
83.BOOL
InitInstance(HINSTANCE
84.{
85.
HBITMAP
bmp;
86.
hInst
87.
88.
hWnd
CreateWindow("
浅墨的窗口"
WS_OVERLAPPEDWINDOW,
89.
CW_USEDEFAULT,
0,
NULL);
90.
91.
hWnd)
92.
93.
94.
95.
96.
MoveWindow(hWnd,10,10,750,420,true);
97.
ShowWindow(hWnd,
nCmdShow);
98.
UpdateWindow(hWnd);
99.
100.
hdc
GetDC(hWnd);
101.
mdc
CreateCompatibleDC(hdc);
102.
bufdc
103.
bmp
CreateCompatibleBitmap(hdc,750,400);
104.
105.
SelectObject(mdc,bmp);
106.
107.
bg
(HBITMAP)LoadImage(NULL,"
bg.bmp"
IMAGE_BITMAP,750,400,LR_LOADFROMFILE);
108.
angrybird
angrybird.bmp"
IMAGE_BITMAP,140,70,LR_LOADFROMFILE);
109.
110.
111.
GetClientRect(hWnd,&
rect);
112.
113.
114.
115.
TRUE;
116.}
117.
118.//****自定义绘图函数*********************************
119.//
1.窗口贴图
120.//
2.根据小球的运动状态计算速度与贴图坐标
121.void
hdc)
122.{
123.
SelectObject(bufdc,bg);
124.
BitBlt(mdc,0,0,750,400,bufdc,0,0,SRCCOPY);
125.
126.
SelectObject(bufdc,angrybird);
127.
BitBlt(mdc,x,y,70,70,bufdc,70,0,SRCAND);
128.
BitBlt(mdc,x,y,70,70,bufdc,0,0,SRCPAINT);
129.
130.
BitBlt(hdc,0,0,750,400,mdc,0,0,SRCCOPY);
131.
132.
x
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
//若速度减到小于等于0,置为零,即小球在X方向不再移动。
149.
150.
151.
152.
153.
154.
tPre
//记录此次时间
155.}
156.
157.//****消息处理函数***********************************
158.LRESULT
WndProc(HWND
hWnd,
UINT
message,
WPARAM
wParam,
LPARAM
lParam)
159.{
160.
switch
(message)
161.
162.
case
WM_KEYDOWN:
//按键消息
163.
if(wParam==VK_ESCAPE)
//按下【Esc】键
164.
PostQuitMessage(0);
165.
break;
166.
WM_DESTROY:
//窗口结束消息
167.
DeleteDC(mdc);
168.
DeleteDC(bufdc);
169.
DeleteObject(bg);
170.
DeleteObject(angrybird);
171.
ReleaseDC(hWnd,hdc);
172.
173.
174.
default:
//其他消息
175.
DefWindowProc(hWnd,
lParam);
176.
177.
178.}
下面是运行时的截图:
最后小鸟能量耗尽,停留在窗口边缘的地面上。
这里感谢gh402兄的建议,我们将之前小鸟的正面的平面效果图换成了带点3D效果的侧面图,使运行结果更加逼真了。
本节即到这里了,下面依旧是放出两个版本的源代码供大家下载学习)(当然,必须是零资源分下载^^):
本篇文章VS2010版的源码请点击这里下载:
【VS2010版】【VisualC++】Code_Note_21
本篇文章VC6.0版的源码请点击这里下载:
【VC6.0版】【VisualC++】Code_Note_21
感谢一直支持【VisualC++】游戏开发笔记系列专栏的朋友们,也恳请大家继续关注我的专栏。
目前在讲的GDI只是前奏。
DirectX11会在GDI梳理完后进行深入讲解,敬请期待~~
【VisualC++】游戏开发系列文章才刚刚展开一点而已,因为游戏世界实在是太博大精深了~
但我们不能着急,得慢慢打好基础。
做学问最忌好高骛远,不是吗?
浅墨希望看到大家的留言,希望与大家共同交流,希望得到睿智的评论(即使是批评)。
你们的支持是我写下去的动力~
精通游戏开发的路还很长很长,非常希望能和大家一起交流,共同学习,共同进步。
大家看过后觉得值得一看的话,可以顶一下这篇文章,你们的支持是我继续写下去的动力~
如果文章中有什么疏漏的地方,也请大家指正。
也希望大家可以多留言来和我探讨相关的问题。
最后,谢谢你们一直的支持~~~
——————————浅墨于2012年5月10日