学习 Box2D 个人笔记(十一)vertexhelper

原来的时候自己想要弄一个多边形的图片,但是 如何才能确定多边形的每个顶点呢 . .所以用到了这个软件。

顺便因为自己好久没有写代码,所以 从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 这样通过这个软件就能得到坐标,界面以及设置如下

学习 Box2D 个人笔记(十一)vertexhelper_第1张图片

因为我提前把这两个图片用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);

这样 就可以改变图像,我们可以通过开启debugdraw来看到效果(xcode-cocos2dv2.0box2d默认开启)

原来用正方形的时候 看到的框是 正方形的框 ,当改变成上面代码的时候 ,就变成了和图片一样的形状,但是

我不知道是不是我机器的原因 ,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

这样就好了 .包括碰撞检测 ,也很成功。

你可能感兴趣的:(学习 Box2D 个人笔记(十一)vertexhelper)