65.9K
CodeProject 正在变化。 阅读更多。
Home

Box 2D 车辆 - 第 2 部分(box2d 多边形形状)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (7投票s)

2012 年 10 月 1 日

CPOL

2分钟阅读

viewsIcon

36853

downloadIcon

109

在上一部分(Box2D车辆 - 第一部分),我向您展示了如何使用Moscrif SDK创建一个基本的Box2D汽车。以下文章将展示一些高级技术并升级游戏。

引言

最新、最基本版本存在一些不足。其中最大的不足是汽车的物理体形状与绘制在其上的位图形状不一致。汽车的底盘被创建为矩形体,但实际上底盘不是矩形。本文将展示如何将汽车的形状适配到其真实形状。

图片:汽车的物理形状与汽车位图。

多边形体

除了圆形和矩形体之外,Box2D还提供多边形体,允许创建所有形状的物体。在原生Box2D中,多边形形状由一些复杂的结构创建,但Moscrif简化了这个过程。在Moscrif中,多边形体通过addPolygonBody方法创建。addPolygonBody方法用于创建多边形体以及矩形体。区别在于最后两个参数。如果最后两个(第六和第七)参数是整数,Box2D会创建一个矩形体(宽度是第六个参数,高度是第七个)。否则,如果第七个参数未指定,该方法将创建一个多边形体。所有顶点都以其x和y位置在一个数组中设置。位置是从形状中心以像素为单位计算的。顶点必须按逆时针顺序排列。

示例:创建一个三角形

var triangle = [
    {x : 0, y : 50},
    {x : -50, y : -50},
    {x : 50, y : -50},
]
triangle = scene.addPolygonBody(this._images.wheel, #dynamic, 1.2, 1.0, 0.0, triangle);

添加多边形体允许创建凸多边形。凸多边形是指所有内角都小于或等于180度的多边形,并且任意两个顶点之间的线段都位于多边形内部或边界上。当然,也有一个简单的方法来创建非凸形状。最简单的凸形状是三角形。三角形用于构造凹形。从三角形构造凹形(非凸形)也经常用于其他框架或SDK中,包括Direct3d。所有凹形体都可以通过两个或多个三角形创建。

图片:一个凹五边形可以通过两个凸三角形创建,如图所示。

以下代码展示了如何在Moscrif中实现。五边形由两个通过焊接连接在一起的三角形组成。

示例:创建五边形体

// create first triangle
var partA = [
    {x : -50, y : 50},
    {x : -50, y : -50},
    {x : 50, y : -50},
]
var bodyA = scene.addPolygonBody(null, #dynamic, 1.2, 1.0, 0.0, partA);
bodyA.setPosition(System.width / 2, System.height / 2);
 
// create second triangle
var partB = [
    {x : 50, y : 50},
    {x : 0, y : 0},
    {x : 50, y : -50},
]
var bodyB = scene.addPolygonBody(null, #dynamic, 1.2, 1.0, 0.0, partB);
bodyB.setPosition(System.width / 2, System.height / 2);
 
// connect triangles together
this._weldJoint = scene.createWeldJoint(bodyA, bodyB, System.width / 2, System.height / 2, false);

现在清楚了如何创建多边形体。所以让我们将汽车的形状更改为它的真实形状。为了简化此示例,底盘由一个凸体创建。

图片:汽车形状

汽车的底盘形状在一个包含八个顶点的数组中定义。

var shape = [
    {x:122,y:7},
    {x:11,y:51},
    {x:-45,y:50},
    {x:-137,y:-4},
    {x:-150,y:-40},
    {x:-69,y:-54},
    {x:140,y:-50},
    {x :150,y:-21}
];
 
this._body = scene.addPolygonBody(this._images.body, #dynamic, 0.1, 0.0, 
   0.0, shape);//this._images.body.width, this._images.body.height);
this._body.z = 2;
this._body.scale = this._scale;
this._body.setPosition(x, y);

物体中顶点的最小数量是三,最大数量是b2_maxPolygonVertices常数值。b2_maxPolygonVertices的值通常是8(Box2D中的限制)。

摘要

本文展示了如何在Moscrif中创建多边形体,同时也为所有Box2D开发者提供了许多有用的信息。

© . All rights reserved.