在学cocos自带的物理引擎时,找了一些视频看,发现只有创建圆形和矩形body,没有多边形的。
我自己尝试了一下然后发现了以下的bug
在win10和win7,vs2013,vs2015下均会抛出异常
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
auto rootNode = CSLoader::createNode("MainScene.csb");
addChild(rootNode);
Sprite* spr = Sprite::create("CloseSelected.png");
spr->setAnchorPoint(Vec2(0.5, 0.5));
spr->setPosition(Vec2(480,320));
Vec2 points[4] = {Vec2(-20,-20),Vec2(20,-20), Vec2(20,20), Vec2(-20,20)};
spr->setPhysicsBody(PhysicsBody::createPolygon(points, 4));//这一句
this->addChild(spr);
return true;
}
在spr->setPhysicsBody(PhysicsBody::createPolygon(points, 4));这一句引发异常

而改为spr->setPhysicsBody(PhysicsBody::createBox(spr->getContentSize()));就没有问题
然后我步入这个函数
bool PhysicsShapePolygon::init(const Vec2* points, int count, const PhysicsMaterial& material/* = MaterialDefault*/, const Vec2& offset/* = Vec2(0, 0)*/)
{
do
{
_type = Type::POLYGEN;
auto vecs = new cpVect[count];
PhysicsHelper::points2cpvs(points, vecs, count);
auto shape = cpPolyShapeNew(s_sharedBody, count, vecs, PhysicsHelper::point2cpv(offset));//这一句
CC_SAFE_DELETE_ARRAY(vecs);
CC_BREAK_IF(shape == nullptr);
addShape(shape);
_area = calculateArea();
_mass = material.density == PHYSICS_INFINITY ? PHYSICS_INFINITY : material.density * _area;
_moment = calculateDefaultMoment();
setMaterial(material);
return true;
} while (false);
return false;
}
发现罪魁祸首是这个函数里的这一句 auto shape = cpPolyShapeNew(s_sharedBody, count, vecs, PhysicsHelper::point2cpv(offset));
cpPolyShapeNew这个函数就进不去了
最让我感到奇怪的是createBox也是用的一样的结构,也有cpPolyShapeNew这个函数,为什么没有抛异常而createPolygon就抛异常了?
bool PhysicsShapeBox::init(const Size& size, const PhysicsMaterial& material/* = MaterialDefault*/, const Vec2& offset /= Vec2(0, 0)/)
{
do
{
_type = Type::BOX;
auto wh = PhysicsHelper::size2cpv(size);
cpVect vec[4] =
{
{-wh.x/2.0f, -wh.y/2.0f}, {-wh.x/2.0f, wh.y/2.0f}, {wh.x/2.0f, wh.y/2.0f}, {wh.x/2.0f, -wh.y/2.0f}
};
auto shape = cpPolyShapeNew(s_sharedBody, 4, vec, PhysicsHelper::point2cpv(offset));//这一句
CC_BREAK_IF(shape == nullptr);
addShape(shape);
_area = calculateArea();
_mass = material.density == PHYSICS_INFINITY ? PHYSICS_INFINITY : material.density * _area;
_moment = calculateDefaultMoment();
setMaterial(material);
return true;
} while (false);
return false;
}
我实在理解不了,求解答啊