cocos2d-x经验分享-spine边界框(碰撞框)

来源:互联网 发布:沥青库存数据 编辑:程序博客网 时间:2024/05/17 00:06
因为资金.美术.等种种问题
游戏开发要暂时放下来了
至少进度要慢下来了
cocos2d-x的工作我估计是找不到了
因为不熟悉安卓.也不熟悉IOS
lua也不会写
不过.在去找JAVA WEB工作之前
我想分享下.我这2个月开发的一些经验

这些经验.很多都是自己摸索出来的.

至少.我要分享的经验.应该会帮助到一些人

这些经验.都是网上不太容易找到答案的内容

之前写的不是特别清楚

这里重新说明一下

在spine中.设置边界框之后.使用getboundingbox的话.是不会获取到你设置的那个边界框.而是一个巨大无比的矩形.如果你用它来做碰撞....

虽然该方法已经被重写了.但是并没有获取spine中.你自己设置的那个边界框

注:需要修改spine官方的runtime.我的版本是2.3 在2.1上也试过.都没问题


选中的这个就是重写了getboundingbox的类了.


SkeletonRenderer重写了getBoundingBox
但是.他获取的并不是碰撞框!
这点一定要注意
我不BB了 上代码来的

Rect SkeletonRenderer::getBoundingBox () const {    float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;    float scaleX = getScaleX(), scaleY = getScaleY();    for (int i = 0; i < _skeleton->slotsCount; ++i) {        spSlot* slot = _skeleton->slots<i>;        if (!slot->attachment) continue;        int verticesCount;        if (slot->attachment->type == SP_ATTACHMENT_REGION) {            spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;            spRegionAttachment_computeWorldVertices(attachment, slot->bone, _worldVertices);            verticesCount = 8;        } else if (slot->attachment->type == SP_ATTACHMENT_MESH) {            spMeshAttachment* mesh = (spMeshAttachment*)slot->attachment;            spMeshAttachment_computeWorldVertices(mesh, slot, _worldVertices);            verticesCount = mesh->verticesCount;        } else if (slot->attachment->type == SP_ATTACHMENT_SKINNED_MESH) {            spSkinnedMeshAttachment* mesh = (spSkinnedMeshAttachment*)slot->attachment;            spSkinnedMeshAttachment_computeWorldVertices(mesh, slot, _worldVertices);            verticesCount = mesh->uvsCount;        } else            continue;        for (int ii = 0; ii < verticesCount; ii += 2) {            float x = _worldVertices[ii] * scaleX, y = _worldVertices[ii + 1] * scaleY;            minX = min(minX, x);            minY = min(minY, y);            maxX = max(maxX, x);            maxY = max(maxY, y);        }    }    Vec2 position = getPosition();    return Rect(position.x + minX, position.y + minY, maxX - minX, maxY - minY);}
SP_ATTACHMENT_REGION  SP_ATTACHMENT_MESH  SP_ATTACHMENT_SKINNED_MESH
而真正获取spine设置的边界框
是这个!
SP_ATTACHMENT_BOUNDING_BOX
下面是我修改的代码.通过名字查找边界框(代码自己理解下)


Rect SkeletonRenderer::getBoundingBox2(const std::string& name) const {    float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;    float scaleX = getScaleX(), scaleY = getScaleY();    for (int i = 0; i < _skeleton->slotsCount; ++i) {        spSlot* slot = _skeleton->slots<i>;        if (!slot->attachment) continue;        int verticesCount;        if (slot->attachment->type == SP_ATTACHMENT_BOUNDING_BOX)//判断type为spine边界框        {            if (slot->attachment->name == name)//确认边界框名称            {                spBoundingBoxAttachment* spa = (spBoundingBoxAttachment*)slot->attachment;                spBoundingBoxAttachment_computeWorldVertices(spa, slot->bone, _worldVertices);                verticesCount = spa->verticesCount;                for (int ii = 0; ii < verticesCount; ii += 2) {                    float x = _worldVertices[ii] * scaleX, y = _worldVertices[ii + 1] * scaleY;                    minX = min(minX, x);                    minY = min(minY, y);                    maxX = max(maxX, x);                    maxY = max(maxY, y);                }              }        }     }    Vec2 position = getPosition();    return Rect(position.x + minX, position.y + minY, maxX - minX, maxY - minY);}


思路来自某博客.在哪看的忘了 

0 0
原创粉丝点击