fix PhysicsBody bitmask bug.

This commit is contained in:
boyu0 2014-08-08 16:38:20 +08:00
parent ddde741d86
commit ee3a8da13c
3 changed files with 61 additions and 28 deletions

View File

@ -69,10 +69,6 @@ PhysicsBody::PhysicsBody()
, _linearDamping(0.0f) , _linearDamping(0.0f)
, _angularDamping(0.0f) , _angularDamping(0.0f)
, _tag(0) , _tag(0)
, _categoryBitmask(UINT_MAX)
, _collisionBitmask(0)
, _contactTestBitmask(UINT_MAX)
, _group(0)
, _positionResetTag(false) , _positionResetTag(false)
, _rotationResetTag(false) , _rotationResetTag(false)
, _rotationOffset(0) , _rotationOffset(0)
@ -422,11 +418,6 @@ PhysicsShape* PhysicsBody::addShape(PhysicsShape* shape, bool addMassAndMoment/*
} }
_shapes.pushBack(shape); _shapes.pushBack(shape);
if (_group != CP_NO_GROUP && shape->getGroup() == CP_NO_GROUP)
{
shape->setGroup(_group);
}
} }
return shape; return shape;
@ -829,34 +820,64 @@ void PhysicsBody::update(float delta)
void PhysicsBody::setCategoryBitmask(int bitmask) void PhysicsBody::setCategoryBitmask(int bitmask)
{ {
_categoryBitmask = bitmask;
for (auto& shape : _shapes) for (auto& shape : _shapes)
{ {
shape->setCategoryBitmask(bitmask); shape->setCategoryBitmask(bitmask);
} }
} }
int PhysicsBody::getCategoryBitmask() const
{
if (!_shapes.empty())
{
return _shapes.front()->getCategoryBitmask();
}
else
{
return UINT_MAX;
}
}
void PhysicsBody::setContactTestBitmask(int bitmask) void PhysicsBody::setContactTestBitmask(int bitmask)
{ {
_contactTestBitmask = bitmask;
for (auto& shape : _shapes) for (auto& shape : _shapes)
{ {
shape->setContactTestBitmask(bitmask); shape->setContactTestBitmask(bitmask);
} }
} }
int PhysicsBody::getContactTestBitmask() const
{
if (!_shapes.empty())
{
return _shapes.front()->getContactTestBitmask();
}
else
{
return 0x00000000;
}
}
void PhysicsBody::setCollisionBitmask(int bitmask) void PhysicsBody::setCollisionBitmask(int bitmask)
{ {
_collisionBitmask = bitmask;
for (auto& shape : _shapes) for (auto& shape : _shapes)
{ {
shape->setCollisionBitmask(bitmask); shape->setCollisionBitmask(bitmask);
} }
} }
int PhysicsBody::getCollisionBitmask() const
{
if (!_shapes.empty())
{
return _shapes.front()->getCollisionBitmask();
}
else
{
return UINT_MAX;
}
}
void PhysicsBody::setGroup(int group) void PhysicsBody::setGroup(int group)
{ {
for (auto& shape : _shapes) for (auto& shape : _shapes)
@ -865,6 +886,18 @@ void PhysicsBody::setGroup(int group)
} }
} }
int PhysicsBody::getGroup() const
{
if (!_shapes.empty())
{
return _shapes.front()->getGroup();
}
else
{
return 0;
}
}
void PhysicsBody::setPositionOffset(const Vec2& position) void PhysicsBody::setPositionOffset(const Vec2& position)
{ {
if (!_positionOffset.equals(position)) if (!_positionOffset.equals(position))

View File

@ -171,12 +171,12 @@ public:
* The default value is 0xFFFFFFFF (all bits set). * The default value is 0xFFFFFFFF (all bits set).
*/ */
void setCollisionBitmask(int bitmask); void setCollisionBitmask(int bitmask);
/** get the category bit mask */ /** Return bitmask of first shape, if there is no shape in body, return default value.(0xFFFFFFFF) */
inline int getCategoryBitmask() const { return _categoryBitmask; } int getCategoryBitmask() const;
/** get the contact test bit mask */ /** Return bitmask of first shape, if there is no shape in body, return default value.(0x00000000) */
inline int getContactTestBitmask() const { return _contactTestBitmask; } int getContactTestBitmask() const;
/** get the collision bit mask */ /** Return bitmask of first shape, if there is no shape in body, return default value.(0xFFFFFFFF) */
inline int getCollisionBitmask() const { return _collisionBitmask; } int getCollisionBitmask() const;
/** /**
* set the group of body * set the group of body
@ -184,8 +184,8 @@ public:
* it have high priority than bit masks * it have high priority than bit masks
*/ */
void setGroup(int group); void setGroup(int group);
/** get the group of body */ /** Return bitmask of first shape, if there is no shape in body, return default value.(0) */
inline int getGroup() const { return _group; } int getGroup() const;
/** get the body position. */ /** get the body position. */
Vec2 getPosition() const; Vec2 getPosition() const;
@ -339,11 +339,6 @@ protected:
float _angularDamping; float _angularDamping;
int _tag; int _tag;
int _categoryBitmask;
int _collisionBitmask;
int _contactTestBitmask;
int _group;
bool _positionResetTag; /// To avoid reset the body position when body invoke Node::setPosition(). bool _positionResetTag; /// To avoid reset the body position when body invoke Node::setPosition().
bool _rotationResetTag; /// To avoid reset the body rotation when body invoke Node::setRotation(). bool _rotationResetTag; /// To avoid reset the body rotation when body invoke Node::setRotation().
Vec2 _positionOffset; Vec2 _positionOffset;

View File

@ -140,6 +140,11 @@ public:
inline void setCollisionBitmask(int bitmask) { _collisionBitmask = bitmask; } inline void setCollisionBitmask(int bitmask) { _collisionBitmask = bitmask; }
inline int getCollisionBitmask() const { return _collisionBitmask; } inline int getCollisionBitmask() const { return _collisionBitmask; }
/**
* set the group of body
* Collision groups let you specify an integral group index. You can have all fixtures with the same group index always collide (positive index) or never collide (negative index)
* it have high priority than bit masks
*/
void setGroup(int group); void setGroup(int group);
inline int getGroup() { return _group; } inline int getGroup() { return _group; }