Box2d 车辆 – 第 3 部分 – 自行车





5.00/5 (3投票s)
如何用一套代码创建三个平台的精彩自行车游戏?

引言
上一篇文章展示了如何在 Moscrif 中使用 box2d 物理引擎制作汽车。 在本文中,我将展示如何创建自行车。 本文的结果是跨自行车游戏的完全可运行的游戏草稿。 这种游戏的概念被用于许多著名的游戏,这些游戏在应用市场上拥有数百万的下载量。 为了最大限度地支持设备数量,我们使用 Moscrif SDK 为三个平台创建游戏,只需一份代码即可。
Box2d
box2d 物理引擎通常用于许多 2d 游戏。 物理世界由物体组成,这些物体通过关节连接在一起。 这些关节将物体连接在一起,并允许它们之间进行一定程度的运动。 在此示例中,使用了棱柱关节和旋转关节。
棱柱关节允许两个物体沿着指定轴平移。 它防止物体之间的相对旋转。
旋转关节允许两个物体围绕锚点相对旋转。 我们还使用鼠标关节,但它仅用于拒绝某些物体之间的碰撞检测。 某些关节(例如旋转关节和棱柱关节)支持限制(以限制关节运动)和马达(以强制关节运动)。
自行车
自行车由五个物体组成,通过关节连接在一起。 自行车最大的部分是车架。 所有其他部件都连接到车架上。 车架用于施加角冲量,这会导致自行车的旋转。 自行车的位置也由车架的中心决定。 车轮通过前后减震器连接到车架上。
图像: 自行车的部件

所有自行车的物体都是多边形动态物体。 动态物体被完全模拟,并与其他静态物体(地面和跳跃)发生碰撞。
示例: 创建所有自行车的物体
function create(scene, x, y)
{
// polygon shape of the body
var shape = [
{x:-30,y:-82},
{x:100,y:-42},
{x:50,y:82},
{x:38,y:80},
{x:-98,y:46},
{x:-92,y:-76}
]
this._frame = scene.addPolygonBody(this._images.frame, #dynamic, 1.0, 0.0, 0.0, shape);
this._frame.z = 2;
this._frame.setPosition(x, y);
// FRONT
this._frontDamper = scene.addPolygonBody(this._images.frontDamper, #dynamic, 1.0, 0.0, 0.0, this._images.frontDamper.width, this._images.frontDamper.height);
this._frontDamper.z = 3;
this._frontDamper.setPosition(x + 96, y + 35);
this._frontWheel = scene.addCircleBody(this._images.wheel, #dynamic, 1.2, 1.0, 0.0, this._images.wheel.width / 2);
this._frontWheel.z = 2;
this._frontWheel.setPosition(x + 113, y + 73);
// BACK
this._backDamper = scene.addPolygonBody(this._images.backDamper, #dynamic, 1.0, 0.0, 0.0, this._images.backDamper.width, this._images.backDamper.height);
this._backDamper.z = 3;
this._backDamper.setPosition(x - 80, y + 70);
this._backWheel = scene.addCircleBody(this._images.wheel, #dynamic, 1.2, 1.0, 0.0, this._images.wheel.width / 2);
this._backWheel.z = 2;
this._backWheel.setPosition(x - 120, y + 80);
悬挂系统
如今,几乎每辆越野自行车的前后轮都配备了悬挂系统。 它们使骑行更舒适、更安全。 为了使模拟更逼真,它也支持悬挂系统。
前减震器
前悬挂系统的主要部分是连接车架和前减震器的棱柱关节。 棱柱关节有一个马达,它试图用一些力向上移动车架。 但是,关节的上限受到限制。 这意味着车架只能向上移动到上限。 如果前轮撞到某个障碍物,前减震器会受到力的影响,该力试图将其向上移动。 这种力大于关节的最大力,这导致前减震器向上移动,而不是关节马达,从而更靠近车架。 最后,当前轮越过障碍物时,作用在前减震器上的力较小,并且关节可以再次将减震器移动到较低位置。
图像: 前减震器

后减震器
后减震器使用旋转关节。 旋转关节也支持限制和马达,但它们由角度定义,而不是由距离定义。 后减震器围绕车架上的一个点旋转。 限制限制了关节的旋转,而马达强制其旋转。
图像: 后减震器

示例: 将减震器连接到车架上
// JOINTS
// connect front damper onto frame
var jointDef = {
lowerTranslation : -0.2, //(damperHeight / 5) / scene.scale, /*meters*/
upperTranslation : 0.0, /*meters*/
enableLimit : true,
enableMotor : true,
motorSpeed : 2.0,
maxMotorForce : this._frame.getMass() * 9.8,
}
this._joints.push(scene.createPrismaticJoint(this._frontDamper, this._frame, x + 96, y + 35, -0.4, 1.0, 0.0, jointDef, false));
// connect back damper onto frame
jointDef = {
enableMotor : true, // enable motor
maxMotorTorque : 150, // maximum torque
motorSpeed : -0.9, // it is changed latery
lowerAngle : 0.2, //(damperHeight / 5) / scene.scale, /*meters*/
upperAngle : 0.45,
enableLimit : true,
}
this._joints.push(scene.createRevoluteJoint(this._backDamper, this._frame, x - 50, y + 55, jointDef, false));
车轮
自行车总是由后轮驱动。 两个车轮通过没有限制的旋转关节连接到减震器上。 后轮通过带有马达的旋转关节连接,以加速或减速自行车。
示例: 连接车轮
/ front wheel - without motor
this._joints.push(scene.createRevoluteJoint(this._frontDamper, this._frontWheel, x + 113, y + 73, null, false));
// back wheel - with motor
jointDef = {
enableMotor : true, // enable motor
maxMotorTorque : 1500000, // maximum torque
motorSpeed : -2.0, // it is changed latery*/
}
this._motorJoint = scene.createRevoluteJoint(this._backDamper, this._backWheel, x - 120, y + 80, jointDef, false);
角冲量
自行车也以规则的时间间隔施加角冲量。 施加角冲量允许创建翻转或在跳跃后稳定自行车。
示例: 施加角冲量
// apply angular impulse in regular intervals. The angular damping allows to create flip or stabilize bike after jump
this._angularImpulse = 0.0;
var process = new Timer(50, true);
process.onTick = function()
{
this super._frame.applyAngularImpulse(this super._angularImpulse);
}
process.start(50);
速度和旋转控制
自行车的速度和角冲量的尺寸由屏幕左右两侧的两个条控制。 条的高度为 300 像素,以便于用手指控制。 每次手指在屏幕上移动时,都会调用 pointerDragged 方法。
示例: 管理 pointer dragged 方法
function pointerDragged (x, y, pointer)
{
super.pointerDragged(x, y);
var maxSpeed = 33;
var maxPlayer = 1.4 * this._bike.getMass();
if (y < System.height / 2 - 150)
y = System.height / 2 - 150;
else if (y > System.height / 2 + 150)
y = System.height / 2 + 150;
if (x > 3*System.width / 4) {
this._bike.player = (System.height / 2.0 - y) / 150 * maxPlayer;
this._anglePaint.shader = this._createAngleShader(y);
} else if (x < System.width / 4){
this._bike.speed = -1*(System.height / 2.0 - y) / 150 * maxSpeed;
this._speedPaint.shader = this._createSpeedShader(y);
}
}
摘要
本文展示了如何使用 box2d 引擎创建逼真的自行车模拟。 结果是一个完全可运行的游戏草稿,可以免费下载。 为了使开发过程更有效,我们使用了 Moscrif SDK。