原来的时候自己想要弄一个多边形的图片,但是 如何才能确定多边形的每个顶点呢 . .所以用到了这个软件。
顺便因为自己好久没有写代码,所以 从body的创建,到绑定sprite ,到 mousejoint,到碰撞检测(contactListener)。
重新写了一边,为此,自己还动用ps 画了两幅多边形的图片 . 哈哈
当然还是 模仿网上的那个例子。 .
(译)如何使用box2d来做碰撞检测(且仅用来做碰撞检测)
但是上面例子里的图片不好 ,所以 我就就自己弄了一个 .哈哈
第一步:我创建 body 创建 sprite ,这时候 创建body 时fixture的形状采用的是 Polygon 形状,但是刚开始的时候采用的方法是:
carshape.SetAsBox(car.textureRect.size.width/PTM_RATIO/2, car.textureRect.size.height/PTM_RATIO/2);
第二步:打开一个叫做vertexhelper的软件 这个软件下载地址:vertexhelper 点击zip下载之后解压是一个项目(mac系统下)。 然后用xcode生产一个app 这样通过这个软件就能得到坐标,界面以及设置如下
因为我提前把这两个图片用texturepacker 打包成纹理图册,所以放到一张图片里了。
通过右下方的代码 ,注意看是两段代码。这两段代码 代表着两个图像的顶点坐标
//row 1, col 1 int num = 6; b2Vec2 verts[] = { b2Vec2(-30.4f / PTM_RATIO, 14.6f / PTM_RATIO), b2Vec2(-30.6f / PTM_RATIO, -3.6f / PTM_RATIO), b2Vec2(-23.7f / PTM_RATIO, -14.6f / PTM_RATIO), b2Vec2(-14.7f / PTM_RATIO, -14.6f / PTM_RATIO), b2Vec2(-6.5f / PTM_RATIO, -3.8f / PTM_RATIO), b2Vec2(-6.5f / PTM_RATIO, 14.4f / PTM_RATIO) };
//row 2, col 1 int num = 7; b2Vec2 verts[] = { b2Vec2(-28.7f / PTM_RATIO, 10.9f / PTM_RATIO), b2Vec2(-28.9f / PTM_RATIO, -5.4f / PTM_RATIO), b2Vec2(-23.5f / PTM_RATIO, -10.6f / PTM_RATIO), b2Vec2(-0.6f / PTM_RATIO, -10.7f / PTM_RATIO), b2Vec2(4.4f / PTM_RATIO, -6.6f / PTM_RATIO), b2Vec2(3.5f / PTM_RATIO, 2.5f / PTM_RATIO), b2Vec2(-5.2f / PTM_RATIO, 10.5f / PTM_RATIO) };
上 面两段代码就是生成的两段代码。
第三步:通过获得的两段代码设置body 的shape
carshape.Set(verts, num);
原来用正方形的时候 看到的框是 正方形的框 ,当改变成上面代码的时候 ,就变成了和图片一样的形状,但是
我不知道是不是我机器的原因 ,vetexhelper好像得到的x坐标是根据 纹理图片的中心x坐标算的,这样
得到的图片和body 的边框不重合,最后我寻找解决方法未果,通过QQ截图的方式 可以看到这两个偏移的x的像素大小。
这样 可以手动改变获得的代码 ,例如我的那个偏移19 个像素,所以我加19得到下面代码:
num = 6; b2Vec2 verts1[] = { b2Vec2(-11.6f / PTM_RATIO, 14.6f / PTM_RATIO), b2Vec2(-11.8f / PTM_RATIO, -3.1f / PTM_RATIO), b2Vec2(-4.9f / PTM_RATIO, -14.2f / PTM_RATIO), b2Vec2(3.8f / PTM_RATIO, -14.6f / PTM_RATIO), b2Vec2(11.9f / PTM_RATIO, -4.3f / PTM_RATIO), b2Vec2(12.6f / PTM_RATIO, 14.2f / PTM_RATIO) };
这样得到的效果是:
ok
这样就好了 .包括碰撞检测 ,也很成功。