游戏开发中使用物理引擎box2d
本文基于JBox2d+canvas,后续提供NDK+openglEs版本;
本文的主要目的是给大家介绍如何使用创建一个物理世界,本文为基本入门教程.
一、主函数:
主函数包括了Box2D的基本流程简单来说,一个Box2D程序的基本流程是由以下三个基本步骤构成的:01
function
step(){
02
?
?03
????
//计算多少秒之后的世界
04
????
var
dt = 1/60;
05
?
?06
????
//迭代次数,影响物体碰撞的计算精度,太高会导致速度过慢
07
????
var
iterations = 10;
08
?
?09
????
//计算dt秒之后世界中物体的位置
10
????
World.step(dt,iterations);
11
?
?12
????
//绘制世界
13
????
drawWorld();
14
?
?15
}
五、绘制世界:一般情况下我们只利用box2d提供物理模拟,具体世界的绘制工作自己实现。具体绘制方式opengl,canvas,etc。01
//绘制世界
02
function
drawWorld(){
03
?
?04
????
//绘制之前将上一帧的内容清除
05
????
context.clearRect(0, 0, canvasWidth, canvasHeight);
06
????
//遍历世界中的物体
07
????
for
(
var
b = World.m_bodyList; b; b = b.m_next) {
08
????????
//遍历物体中的形状
09
????????
for
(
var
s = b.GetShapeList(); s !=
null
; s = s.GetNext())
10
????????
{
11
????????????
this
.drawShape(s);?
//绘制一个形状
12
????????
}
13
????
}
14
?
?15
}
16
?
?17
//绘制一个形状
18
function
drawShape(shape){
19
?
?20
????
context.strokeStyle =
'#000'
;??????
//线形
21
????
context.beginPath();
22
????
switch
(shape.m_type) {
23
????????
case
b2Shape.e_circleShape:{???
//如果是圆形,画圆
24
????????????
var
circle = shape;
25
????????????
var
r = circle.m_radius;
26
????????????
var
pos = circle.m_position;
27
????????????
var
pos2 = circle.m_R.col1.clone().scale(r).add(pos);
28
????????????
context.arc(pos.x, pos.y, r, 0, Math.PI * 2,
false
);
29
????????????
context.moveTo(pos.x, pos.y);
30
????????????
context.lineTo(pos2.x, pos2.y);
31
????????????
break
;
32
????????
}
33
????????
case
b2Shape.e_polyShape:{?????
//如果是多边形,画多边形
34
????????????
var
poly = shape;
35
????????????
var
tV = b2Math.AddVV(poly.m_position,
36
?????????????????
b2Math.b2MulMV(poly.m_R, poly.m_vertices[0]));
37
????????????
context.moveTo(tV.x, tV.y);
38
????????????
for
(
var
i = 0; i < poly.m_vertexCount; i++) {
39
????????????????
var
v = b2Math.AddVV(poly.m_position,
40
????????????????
b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
41
????????????????
context.lineTo(v.x, v.y);
42
????????????
}
43
????????????
context.lineTo(tV.x, tV.y);
44
????????????
break
;
45
????????
}
46
????
}
47
????
context.stroke();??
//绘制
48
?
?49
}