mirror of https://github.com/axmolengine/axmol.git
issue #2771: add physics pump demo and fix bugs
This commit is contained in:
parent
66d1bbd89f
commit
cae9a3e54f
|
@ -57,7 +57,6 @@ namespace
|
||||||
{
|
{
|
||||||
static const float MASS_DEFAULT = 1.0;
|
static const float MASS_DEFAULT = 1.0;
|
||||||
static const float MOMENT_DEFAULT = 200;
|
static const float MOMENT_DEFAULT = 200;
|
||||||
static float GROUP_INDEX = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicsBody::PhysicsBody()
|
PhysicsBody::PhysicsBody()
|
||||||
|
@ -81,6 +80,7 @@ PhysicsBody::PhysicsBody()
|
||||||
, _categoryBitmask(UINT_MAX)
|
, _categoryBitmask(UINT_MAX)
|
||||||
, _collisionBitmask(UINT_MAX)
|
, _collisionBitmask(UINT_MAX)
|
||||||
, _contactTestBitmask(0)
|
, _contactTestBitmask(0)
|
||||||
|
, _group(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,7 +273,6 @@ bool PhysicsBody::init()
|
||||||
_shapes->retain();
|
_shapes->retain();
|
||||||
|
|
||||||
_info->body = cpBodyNew(PhysicsHelper::float2cpfloat(_mass), PhysicsHelper::float2cpfloat(_moment));
|
_info->body = cpBodyNew(PhysicsHelper::float2cpfloat(_mass), PhysicsHelper::float2cpfloat(_moment));
|
||||||
_info->group = ++GROUP_INDEX;
|
|
||||||
|
|
||||||
CC_BREAK_IF(_info->body == nullptr);
|
CC_BREAK_IF(_info->body == nullptr);
|
||||||
|
|
||||||
|
@ -321,10 +320,10 @@ void PhysicsBody::setGravityEnable(bool enable)
|
||||||
{
|
{
|
||||||
if (enable)
|
if (enable)
|
||||||
{
|
{
|
||||||
applyForce(_world->getGravity());
|
applyForce(_world->getGravity() * _mass);
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
applyForce(-_world->getGravity());
|
applyForce(-_world->getGravity() * _mass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -351,9 +350,9 @@ float PhysicsBody::getRotation() const
|
||||||
return -PhysicsHelper::cpfloat2float(cpBodyGetAngle(_info->body) / 3.14f * 180.0f);
|
return -PhysicsHelper::cpfloat2float(cpBodyGetAngle(_info->body) / 3.14f * 180.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsBody::addShape(PhysicsShape* shape)
|
PhysicsShape* PhysicsBody::addShape(PhysicsShape* shape)
|
||||||
{
|
{
|
||||||
if (shape == nullptr) return;
|
if (shape == nullptr) return nullptr;
|
||||||
|
|
||||||
// add shape to body
|
// add shape to body
|
||||||
if (_shapes->getIndexOfObject(shape) == UINT_MAX)
|
if (_shapes->getIndexOfObject(shape) == UINT_MAX)
|
||||||
|
@ -372,9 +371,16 @@ void PhysicsBody::addShape(PhysicsShape* shape)
|
||||||
}
|
}
|
||||||
|
|
||||||
_shapes->addObject(shape);
|
_shapes->addObject(shape);
|
||||||
|
|
||||||
|
if (_group != CP_NO_GROUP && shape->getGroup() == CP_NO_GROUP)
|
||||||
|
{
|
||||||
|
shape->setGroup(_group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return shape;
|
||||||
|
}
|
||||||
|
|
||||||
void PhysicsBody::applyForce(Point force)
|
void PhysicsBody::applyForce(Point force)
|
||||||
{
|
{
|
||||||
applyForce(force, Point::ZERO);
|
applyForce(force, Point::ZERO);
|
||||||
|
@ -676,6 +682,54 @@ void PhysicsBody::update(float delta)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicsBody::setCategoryBitmask(int bitmask)
|
||||||
|
{
|
||||||
|
_categoryBitmask = bitmask;
|
||||||
|
|
||||||
|
for (auto shape : *_shapes)
|
||||||
|
{
|
||||||
|
((PhysicsShape*)shape)->setCategoryBitmask(bitmask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhysicsBody::setContactTestBitmask(int bitmask)
|
||||||
|
{
|
||||||
|
_contactTestBitmask = bitmask;
|
||||||
|
|
||||||
|
for (auto shape : *_shapes)
|
||||||
|
{
|
||||||
|
((PhysicsShape*)shape)->setContactTestBitmask(bitmask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhysicsBody::setCollisionBitmask(int bitmask)
|
||||||
|
{
|
||||||
|
_collisionBitmask = bitmask;
|
||||||
|
|
||||||
|
for (auto shape : *_shapes)
|
||||||
|
{
|
||||||
|
((PhysicsShape*)shape)->setCollisionBitmask(bitmask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhysicsBody::setGroup(int group)
|
||||||
|
{
|
||||||
|
for (auto shape : *_shapes)
|
||||||
|
{
|
||||||
|
((PhysicsShape*)shape)->setGroup(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Point PhysicsBody::world2Local(const Point& point)
|
||||||
|
{
|
||||||
|
return PhysicsHelper::cpv2point(cpBodyWorld2Local(_info->body, PhysicsHelper::point2cpv(point)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Point PhysicsBody::local2World(const Point& point)
|
||||||
|
{
|
||||||
|
return PhysicsHelper::cpv2point(cpBodyLocal2World(_info->body, PhysicsHelper::point2cpv(point)));
|
||||||
|
}
|
||||||
|
|
||||||
//Clonable* PhysicsBody::clone() const
|
//Clonable* PhysicsBody::clone() const
|
||||||
//{
|
//{
|
||||||
// PhysicsBody* body = new PhysicsBody();
|
// PhysicsBody* body = new PhysicsBody();
|
||||||
|
|
|
@ -87,7 +87,7 @@ public:
|
||||||
*/
|
*/
|
||||||
static PhysicsBody* createEdgeChain(Point* points, int count, PhysicsMaterial material = PHYSICSBODY_MATERIAL_DEFAULT, float border = 1);
|
static PhysicsBody* createEdgeChain(Point* points, int count, PhysicsMaterial material = PHYSICSBODY_MATERIAL_DEFAULT, float border = 1);
|
||||||
|
|
||||||
virtual void addShape(PhysicsShape* shape);
|
virtual PhysicsShape* addShape(PhysicsShape* shape);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Applies a immediate force to body.
|
* @brief Applies a immediate force to body.
|
||||||
|
@ -154,13 +154,16 @@ public:
|
||||||
*/
|
*/
|
||||||
inline Node* getOwner() const { return _owner; }
|
inline Node* getOwner() const { return _owner; }
|
||||||
|
|
||||||
inline void setCategoryBitmask(int bitmask) { _categoryBitmask = bitmask; }
|
void setCategoryBitmask(int bitmask);
|
||||||
|
void setContactTestBitmask(int bitmask);
|
||||||
|
void setCollisionBitmask(int bitmask);
|
||||||
inline int getCategoryBitmask() const { return _categoryBitmask; }
|
inline int getCategoryBitmask() const { return _categoryBitmask; }
|
||||||
inline void setContactTestBitmask(int bitmask) { _contactTestBitmask = bitmask; }
|
|
||||||
inline int getContactTestBitmask() const { return _contactTestBitmask; }
|
inline int getContactTestBitmask() const { return _contactTestBitmask; }
|
||||||
inline void setCollisionBitmask(int bitmask) { _collisionBitmask = bitmask; }
|
|
||||||
inline int getCollisionBitmask() const { return _collisionBitmask; }
|
inline int getCollisionBitmask() const { return _collisionBitmask; }
|
||||||
|
|
||||||
|
void setGroup(int group);
|
||||||
|
inline int getGroup() { return _group; }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @brief get the body position.
|
* @brief get the body position.
|
||||||
*/
|
*/
|
||||||
|
@ -246,6 +249,8 @@ public:
|
||||||
inline int getTag() { return _tag; }
|
inline int getTag() { return _tag; }
|
||||||
inline void setTag(int tag) { _tag = tag; }
|
inline void setTag(int tag) { _tag = tag; }
|
||||||
|
|
||||||
|
Point world2Local(const Point& point);
|
||||||
|
Point local2World(const Point& point);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -283,6 +288,7 @@ protected:
|
||||||
int _categoryBitmask;
|
int _categoryBitmask;
|
||||||
int _collisionBitmask;
|
int _collisionBitmask;
|
||||||
int _contactTestBitmask;
|
int _contactTestBitmask;
|
||||||
|
int _group;
|
||||||
|
|
||||||
friend class PhysicsWorld;
|
friend class PhysicsWorld;
|
||||||
friend class PhysicsShape;
|
friend class PhysicsShape;
|
||||||
|
|
|
@ -144,6 +144,16 @@ PhysicsJointLimit::~PhysicsJointLimit()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PhysicsJointDistance::PhysicsJointDistance()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PhysicsJointDistance::~PhysicsJointDistance()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
||||||
PhysicsBodyInfo* PhysicsJoint::bodyInfo(PhysicsBody* body) const
|
PhysicsBodyInfo* PhysicsJoint::bodyInfo(PhysicsBody* body) const
|
||||||
{
|
{
|
||||||
|
@ -343,6 +353,39 @@ void PhysicsJointLimit::setMax(float max)
|
||||||
cpSlideJointSetMax(_info->joints.front(), PhysicsHelper::float2cpfloat(max));
|
cpSlideJointSetMax(_info->joints.front(), PhysicsHelper::float2cpfloat(max));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PhysicsJointDistance* PhysicsJointDistance::create(PhysicsBody* a, PhysicsBody* b, const Point& anchr1, const Point& anchr2)
|
||||||
|
{
|
||||||
|
PhysicsJointDistance* joint = new PhysicsJointDistance();
|
||||||
|
|
||||||
|
if (joint && joint->init(a, b, anchr1, anchr2))
|
||||||
|
{
|
||||||
|
return joint;
|
||||||
|
}
|
||||||
|
|
||||||
|
CC_SAFE_DELETE(joint);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PhysicsJointDistance::init(PhysicsBody* a, PhysicsBody* b, const Point& anchr1, const Point& anchr2)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
CC_BREAK_IF(!PhysicsJoint::init(a, b));
|
||||||
|
|
||||||
|
cpConstraint* joint = cpPinJointNew(bodyInfo(a)->body,
|
||||||
|
bodyInfo(b)->body,
|
||||||
|
PhysicsHelper::point2cpv(anchr1), PhysicsHelper::point2cpv(anchr2));
|
||||||
|
|
||||||
|
CC_BREAK_IF(joint == nullptr);
|
||||||
|
|
||||||
|
_info->add(joint);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#elif (CC_PHYSICS_ENGINE == CC_PHYSICS_BOX2D)
|
#elif (CC_PHYSICS_ENGINE == CC_PHYSICS_BOX2D)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -165,6 +165,20 @@ protected:
|
||||||
virtual ~PhysicsJointPin();
|
virtual ~PhysicsJointPin();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class PhysicsJointDistance : public PhysicsJoint
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
static PhysicsJointDistance* create(PhysicsBody* a, PhysicsBody* b, const Point& anchr1, const Point& anchr2);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool init(PhysicsBody* a, PhysicsBody* b, const Point& anchr1, const Point& anchr2);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
PhysicsJointDistance();
|
||||||
|
virtual ~PhysicsJointDistance();
|
||||||
|
};
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
||||||
#endif // __CCPHYSICS_JOINT_H__
|
#endif // __CCPHYSICS_JOINT_H__
|
||||||
|
|
|
@ -50,6 +50,10 @@ PhysicsShape::PhysicsShape()
|
||||||
, _mass(0)
|
, _mass(0)
|
||||||
, _moment(0)
|
, _moment(0)
|
||||||
, _tag(0)
|
, _tag(0)
|
||||||
|
, _categoryBitmask(UINT_MAX)
|
||||||
|
, _collisionBitmask(UINT_MAX)
|
||||||
|
, _contactTestBitmask(0)
|
||||||
|
, _group(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -777,6 +781,17 @@ int PhysicsShapeEdgeChain::getPointsCount()
|
||||||
return _info->shapes.size() + 1;
|
return _info->shapes.size() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicsShape::setGroup(int group)
|
||||||
|
{
|
||||||
|
if (group < 0)
|
||||||
|
{
|
||||||
|
for (auto shape : _info->shapes)
|
||||||
|
{
|
||||||
|
cpShapeSetGroup(shape, (cpGroup)group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#elif (CC_PHYSICS_ENGINE == CC_PHYSICS_BOX2D)
|
#elif (CC_PHYSICS_ENGINE == CC_PHYSICS_BOX2D)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -102,6 +102,16 @@ public:
|
||||||
static Point* recenterPoints(Point* points, int count, Point center = Point::ZERO);
|
static Point* recenterPoints(Point* points, int count, Point center = Point::ZERO);
|
||||||
static Point getPolyonCenter(Point* points, int count);
|
static Point getPolyonCenter(Point* points, int count);
|
||||||
|
|
||||||
|
inline void setCategoryBitmask(int bitmask) { _categoryBitmask = bitmask; }
|
||||||
|
inline int getCategoryBitmask() const { return _categoryBitmask; }
|
||||||
|
inline void setContactTestBitmask(int bitmask) { _contactTestBitmask = bitmask; }
|
||||||
|
inline int getContactTestBitmask() const { return _contactTestBitmask; }
|
||||||
|
inline void setCollisionBitmask(int bitmask) { _collisionBitmask = bitmask; }
|
||||||
|
inline int getCollisionBitmask() const { return _collisionBitmask; }
|
||||||
|
|
||||||
|
void setGroup(int group);
|
||||||
|
inline int getGroup() { return _group; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool init(Type type);
|
bool init(Type type);
|
||||||
|
|
||||||
|
@ -125,6 +135,10 @@ protected:
|
||||||
float _moment;
|
float _moment;
|
||||||
PhysicsMaterial _material;
|
PhysicsMaterial _material;
|
||||||
int _tag;
|
int _tag;
|
||||||
|
int _categoryBitmask;
|
||||||
|
int _collisionBitmask;
|
||||||
|
int _contactTestBitmask;
|
||||||
|
int _group;
|
||||||
|
|
||||||
friend class PhysicsWorld;
|
friend class PhysicsWorld;
|
||||||
friend class PhysicsBody;
|
friend class PhysicsBody;
|
||||||
|
|
|
@ -181,9 +181,9 @@ bool PhysicsWorld::init()
|
||||||
{
|
{
|
||||||
_info = new PhysicsWorldInfo();
|
_info = new PhysicsWorldInfo();
|
||||||
CC_BREAK_IF(_info == nullptr);
|
CC_BREAK_IF(_info == nullptr);
|
||||||
_bodys = Array::create();
|
_bodies = Array::create();
|
||||||
CC_BREAK_IF(_bodys == nullptr);
|
CC_BREAK_IF(_bodies == nullptr);
|
||||||
_bodys->retain();
|
_bodies->retain();
|
||||||
|
|
||||||
cpSpaceSetGravity(_info->space, PhysicsHelper::point2cpv(_gravity));
|
cpSpaceSetGravity(_info->space, PhysicsHelper::point2cpv(_gravity));
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ void PhysicsWorld::removeAllJoints()
|
||||||
_joints.clear();
|
_joints.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsWorld::addShape(PhysicsShape* shape)
|
PhysicsShape* PhysicsWorld::addShape(PhysicsShape* shape)
|
||||||
{
|
{
|
||||||
for (auto cps : shape->_info->shapes)
|
for (auto cps : shape->_info->shapes)
|
||||||
{
|
{
|
||||||
|
@ -270,9 +270,11 @@ void PhysicsWorld::addShape(PhysicsShape* shape)
|
||||||
cpSpaceAddShape(_info->space, cps);
|
cpSpaceAddShape(_info->space, cps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsWorld::addBody(PhysicsBody* body)
|
PhysicsBody* PhysicsWorld::addBody(PhysicsBody* body)
|
||||||
{
|
{
|
||||||
CCASSERT(body != nullptr, "the body can not be nullptr");
|
CCASSERT(body != nullptr, "the body can not be nullptr");
|
||||||
|
|
||||||
|
@ -304,7 +306,9 @@ void PhysicsWorld::addBody(PhysicsBody* body)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_bodys->addObject(body);
|
_bodies->addObject(body);
|
||||||
|
|
||||||
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsWorld::removeBody(PhysicsBody* body)
|
void PhysicsWorld::removeBody(PhysicsBody* body)
|
||||||
|
@ -341,12 +345,12 @@ void PhysicsWorld::removeBody(PhysicsBody* body)
|
||||||
}
|
}
|
||||||
|
|
||||||
body->_world = nullptr;
|
body->_world = nullptr;
|
||||||
_bodys->removeObject(body);
|
_bodies->removeObject(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsWorld::removeBodyByTag(int tag)
|
void PhysicsWorld::removeBodyByTag(int tag)
|
||||||
{
|
{
|
||||||
for (Object* obj : *_bodys)
|
for (Object* obj : *_bodies)
|
||||||
{
|
{
|
||||||
PhysicsBody* body = dynamic_cast<PhysicsBody*>(obj);
|
PhysicsBody* body = dynamic_cast<PhysicsBody*>(obj);
|
||||||
if (body->getTag() == tag)
|
if (body->getTag() == tag)
|
||||||
|
@ -357,9 +361,9 @@ void PhysicsWorld::removeBodyByTag(int tag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsWorld::removeAllBodys()
|
void PhysicsWorld::removeAllBodies()
|
||||||
{
|
{
|
||||||
for (Object* obj : *_bodys)
|
for (Object* obj : *_bodies)
|
||||||
{
|
{
|
||||||
PhysicsBody* body = dynamic_cast<PhysicsBody*>(obj);
|
PhysicsBody* body = dynamic_cast<PhysicsBody*>(obj);
|
||||||
|
|
||||||
|
@ -390,8 +394,8 @@ void PhysicsWorld::removeAllBodys()
|
||||||
body->_world = nullptr;
|
body->_world = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
_bodys->removeAllObjects();
|
_bodies->removeAllObjects();
|
||||||
CC_SAFE_RELEASE(_bodys);
|
CC_SAFE_RELEASE(_bodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsWorld::removeShape(PhysicsShape* shape)
|
void PhysicsWorld::removeShape(PhysicsShape* shape)
|
||||||
|
@ -407,7 +411,7 @@ void PhysicsWorld::removeShape(PhysicsShape* shape)
|
||||||
|
|
||||||
void PhysicsWorld::update(float delta)
|
void PhysicsWorld::update(float delta)
|
||||||
{
|
{
|
||||||
for (auto body : *_bodys)
|
for (auto body : *_bodies)
|
||||||
{
|
{
|
||||||
body->update(delta);
|
body->update(delta);
|
||||||
}
|
}
|
||||||
|
@ -428,11 +432,11 @@ void PhysicsWorld::update(float delta)
|
||||||
|
|
||||||
void PhysicsWorld::debugDraw()
|
void PhysicsWorld::debugDraw()
|
||||||
{
|
{
|
||||||
if (_debugDraw && _bodys != nullptr)
|
if (_debugDraw && _bodies != nullptr)
|
||||||
{
|
{
|
||||||
_drawNode= DrawNode::create();
|
_drawNode= DrawNode::create();
|
||||||
|
|
||||||
for (Object* obj : *_bodys)
|
for (Object* obj : *_bodies)
|
||||||
{
|
{
|
||||||
PhysicsBody* body = dynamic_cast<PhysicsBody*>(obj);
|
PhysicsBody* body = dynamic_cast<PhysicsBody*>(obj);
|
||||||
|
|
||||||
|
@ -442,6 +446,11 @@ void PhysicsWorld::debugDraw()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto joint : _joints)
|
||||||
|
{
|
||||||
|
drawWithJoint(_drawNode, joint);
|
||||||
|
}
|
||||||
|
|
||||||
if (_scene)
|
if (_scene)
|
||||||
{
|
{
|
||||||
_scene->addChild(_drawNode);
|
_scene->addChild(_drawNode);
|
||||||
|
@ -454,6 +463,58 @@ void PhysicsWorld::setScene(Scene *scene)
|
||||||
_scene = scene;
|
_scene = scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicsWorld::drawWithJoint(DrawNode* node, PhysicsJoint* joint)
|
||||||
|
{
|
||||||
|
for (auto it = joint->_info->joints.begin(); it != joint->_info->joints.end(); ++it)
|
||||||
|
{
|
||||||
|
cpConstraint *constraint = *it;
|
||||||
|
|
||||||
|
|
||||||
|
cpBody *body_a = constraint->a;
|
||||||
|
cpBody *body_b = constraint->b;
|
||||||
|
|
||||||
|
const cpConstraintClass *klass = constraint->klass_private;
|
||||||
|
if(klass == cpPinJointGetClass()){
|
||||||
|
cpPinJoint *joint = (cpPinJoint *)constraint;
|
||||||
|
|
||||||
|
cpVect a = cpvadd(body_a->p, cpvrotate(joint->anchr1, body_a->rot));
|
||||||
|
cpVect b = cpvadd(body_b->p, cpvrotate(joint->anchr2, body_b->rot));
|
||||||
|
|
||||||
|
node->drawSegment(PhysicsHelper::cpv2point(a), PhysicsHelper::cpv2point(b), 1, Color4F(0.0f, 0.0f, 1.0f, 1.0f));
|
||||||
|
node->drawDot(PhysicsHelper::cpv2point(a), 2, Color4F(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
|
node->drawDot(PhysicsHelper::cpv2point(b), 2, Color4F(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
|
} else if(klass == cpSlideJointGetClass()){
|
||||||
|
cpSlideJoint *joint = (cpSlideJoint *)constraint;
|
||||||
|
|
||||||
|
cpVect a = cpvadd(body_a->p, cpvrotate(joint->anchr1, body_a->rot));
|
||||||
|
cpVect b = cpvadd(body_b->p, cpvrotate(joint->anchr2, body_b->rot));
|
||||||
|
|
||||||
|
node->drawSegment(PhysicsHelper::cpv2point(a), PhysicsHelper::cpv2point(b), 1, Color4F(0.0f, 0.0f, 1.0f, 1.0f));
|
||||||
|
node->drawDot(PhysicsHelper::cpv2point(a), 2, Color4F(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
|
node->drawDot(PhysicsHelper::cpv2point(b), 2, Color4F(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
|
} else if(klass == cpPivotJointGetClass()){
|
||||||
|
cpPivotJoint *joint = (cpPivotJoint *)constraint;
|
||||||
|
|
||||||
|
cpVect a = cpvadd(body_a->p, cpvrotate(joint->anchr1, body_a->rot));
|
||||||
|
cpVect b = cpvadd(body_b->p, cpvrotate(joint->anchr2, body_b->rot));
|
||||||
|
|
||||||
|
node->drawDot(PhysicsHelper::cpv2point(a), 2, Color4F(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
|
node->drawDot(PhysicsHelper::cpv2point(b), 2, Color4F(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
|
} else if(klass == cpGrooveJointGetClass()){
|
||||||
|
cpGrooveJoint *joint = (cpGrooveJoint *)constraint;
|
||||||
|
|
||||||
|
cpVect a = cpvadd(body_a->p, cpvrotate(joint->grv_a, body_a->rot));
|
||||||
|
cpVect b = cpvadd(body_a->p, cpvrotate(joint->grv_b, body_a->rot));
|
||||||
|
cpVect c = cpvadd(body_b->p, cpvrotate(joint->anchr2, body_b->rot));
|
||||||
|
|
||||||
|
node->drawSegment(PhysicsHelper::cpv2point(a), PhysicsHelper::cpv2point(b), 1, Color4F(0.0f, 0.0f, 1.0f, 1.0f));
|
||||||
|
node->drawDot(PhysicsHelper::cpv2point(c), 2, Color4F(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
|
} else if(klass == cpDampedSpringGetClass()){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PhysicsWorld::drawWithShape(DrawNode* node, PhysicsShape* shape)
|
void PhysicsWorld::drawWithShape(DrawNode* node, PhysicsShape* shape)
|
||||||
{
|
{
|
||||||
for (auto it = shape->_info->shapes.begin(); it != shape->_info->shapes.end(); ++it)
|
for (auto it = shape->_info->shapes.begin(); it != shape->_info->shapes.end(); ++it)
|
||||||
|
@ -510,8 +571,10 @@ void PhysicsWorld::drawWithShape(DrawNode* node, PhysicsShape* shape)
|
||||||
int PhysicsWorld::collisionBeginCallback(PhysicsContact& contact)
|
int PhysicsWorld::collisionBeginCallback(PhysicsContact& contact)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
PhysicsBody* bodyA = contact.getShapeA()->getBody();
|
PhysicsShape* shapeA = contact.getShapeA();
|
||||||
PhysicsBody* bodyB = contact.getShapeB()->getBody();
|
PhysicsShape* shapeB = contact.getShapeB();
|
||||||
|
PhysicsBody* bodyA = shapeA->getBody();
|
||||||
|
PhysicsBody* bodyB = shapeB->getBody();
|
||||||
std::vector<PhysicsJoint*> jointsA = bodyA->getJoints();
|
std::vector<PhysicsJoint*> jointsA = bodyA->getJoints();
|
||||||
|
|
||||||
// check the joint is collision enable or not
|
// check the joint is collision enable or not
|
||||||
|
@ -534,18 +597,25 @@ int PhysicsWorld::collisionBeginCallback(PhysicsContact& contact)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// bitmask check
|
// bitmask check
|
||||||
if ((bodyA->getCategoryBitmask() & bodyB->getContactTestBitmask()) == 0
|
if ((shapeA->getCategoryBitmask() & shapeB->getContactTestBitmask()) == 0
|
||||||
|| (bodyB->getContactTestBitmask() & bodyA->getCategoryBitmask()) == 0)
|
|| (shapeB->getContactTestBitmask() & shapeA->getCategoryBitmask()) == 0)
|
||||||
{
|
{
|
||||||
contact.setNotify(false);
|
contact.setNotify(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((bodyA->getCategoryBitmask() & bodyB->getCollisionBitmask()) == 0
|
if (shapeA->getGroup() != 0 && shapeA->getGroup() == shapeB->getGroup())
|
||||||
|| (bodyB->getCategoryBitmask() & bodyA->getCollisionBitmask()) == 0)
|
{
|
||||||
|
ret = shapeA->getGroup() > 0;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
if ((shapeA->getCategoryBitmask() & shapeB->getCollisionBitmask()) == 0
|
||||||
|
|| (shapeB->getCategoryBitmask() & shapeA->getCollisionBitmask()) == 0)
|
||||||
{
|
{
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (contact.getNotify() && _listener && _listener->onContactBegin)
|
if (contact.getNotify() && _listener && _listener->onContactBegin)
|
||||||
{
|
{
|
||||||
|
@ -614,9 +684,9 @@ void PhysicsWorld::collisionSeparateCallback(PhysicsContact& contact)
|
||||||
|
|
||||||
void PhysicsWorld::setGravity(Point gravity)
|
void PhysicsWorld::setGravity(Point gravity)
|
||||||
{
|
{
|
||||||
if (_bodys != nullptr)
|
if (_bodies != nullptr)
|
||||||
{
|
{
|
||||||
for (auto child : *_bodys)
|
for (auto child : *_bodies)
|
||||||
{
|
{
|
||||||
PhysicsBody* body = dynamic_cast<PhysicsBody*>(child);
|
PhysicsBody* body = dynamic_cast<PhysicsBody*>(child);
|
||||||
|
|
||||||
|
@ -694,9 +764,22 @@ PhysicsShape* PhysicsWorld::getShapeAtPoint(Point point)
|
||||||
return shape == nullptr ? nullptr : PhysicsShapeInfo::map.find(shape)->second->shape;
|
return shape == nullptr ? nullptr : PhysicsShapeInfo::map.find(shape)->second->shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
Array* PhysicsWorld::getAllBody() const
|
Array* PhysicsWorld::getAllBodies() const
|
||||||
{
|
{
|
||||||
return _bodys;
|
return _bodies;
|
||||||
|
}
|
||||||
|
|
||||||
|
PhysicsBody* PhysicsWorld::getBodyByTag(int tag)
|
||||||
|
{
|
||||||
|
for (auto body : *_bodies)
|
||||||
|
{
|
||||||
|
if (((PhysicsBody*)body)->getTag() == tag)
|
||||||
|
{
|
||||||
|
return (PhysicsBody*)body;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif (CC_PHYSICS_ENGINE == CC_PHYSICS_BOX2D)
|
#elif (CC_PHYSICS_ENGINE == CC_PHYSICS_BOX2D)
|
||||||
|
@ -720,7 +803,7 @@ PhysicsWorld::PhysicsWorld()
|
||||||
, _speed(1.0f)
|
, _speed(1.0f)
|
||||||
, _info(nullptr)
|
, _info(nullptr)
|
||||||
, _listener(nullptr)
|
, _listener(nullptr)
|
||||||
, _bodys(nullptr)
|
, _bodies(nullptr)
|
||||||
, _scene(nullptr)
|
, _scene(nullptr)
|
||||||
, _debugDraw(false)
|
, _debugDraw(false)
|
||||||
, _drawNode(nullptr)
|
, _drawNode(nullptr)
|
||||||
|
@ -730,7 +813,7 @@ PhysicsWorld::PhysicsWorld()
|
||||||
|
|
||||||
PhysicsWorld::~PhysicsWorld()
|
PhysicsWorld::~PhysicsWorld()
|
||||||
{
|
{
|
||||||
removeAllBodys();
|
removeAllBodies();
|
||||||
removeAllJoints();
|
removeAllJoints();
|
||||||
CC_SAFE_DELETE(_info);
|
CC_SAFE_DELETE(_info);
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,8 @@ public:
|
||||||
void rectQuery(PhysicsRectQueryCallback& callback, Rect rect, void* data);
|
void rectQuery(PhysicsRectQueryCallback& callback, Rect rect, void* data);
|
||||||
Array* getShapesAtPoint(Point point);
|
Array* getShapesAtPoint(Point point);
|
||||||
PhysicsShape* getShapeAtPoint(Point point);
|
PhysicsShape* getShapeAtPoint(Point point);
|
||||||
Array* getAllBody() const;
|
Array* getAllBodies() const;
|
||||||
|
PhysicsBody* getBodyByTag(int tag);
|
||||||
|
|
||||||
/** Register a listener to receive contact callbacks*/
|
/** Register a listener to receive contact callbacks*/
|
||||||
inline void registerContactListener(PhysicsContactListener* delegate) { _listener = delegate; }
|
inline void registerContactListener(PhysicsContactListener* delegate) { _listener = delegate; }
|
||||||
|
@ -116,7 +117,7 @@ public:
|
||||||
|
|
||||||
virtual void removeBody(PhysicsBody* body);
|
virtual void removeBody(PhysicsBody* body);
|
||||||
virtual void removeBodyByTag(int tag);
|
virtual void removeBodyByTag(int tag);
|
||||||
virtual void removeAllBodys();
|
virtual void removeAllBodies();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static PhysicsWorld* create();
|
static PhysicsWorld* create();
|
||||||
|
@ -124,13 +125,14 @@ protected:
|
||||||
|
|
||||||
void setScene(Scene* scene);
|
void setScene(Scene* scene);
|
||||||
|
|
||||||
virtual void addBody(PhysicsBody* body);
|
virtual PhysicsBody* addBody(PhysicsBody* body);
|
||||||
virtual void addShape(PhysicsShape* shape);
|
virtual PhysicsShape* addShape(PhysicsShape* shape);
|
||||||
virtual void removeShape(PhysicsShape* shape);
|
virtual void removeShape(PhysicsShape* shape);
|
||||||
virtual void update(float delta);
|
virtual void update(float delta);
|
||||||
|
|
||||||
virtual void debugDraw();
|
virtual void debugDraw();
|
||||||
virtual void drawWithShape(DrawNode* node, PhysicsShape* shape);
|
virtual void drawWithShape(DrawNode* node, PhysicsShape* shape);
|
||||||
|
virtual void drawWithJoint(DrawNode* node, PhysicsJoint* joint);
|
||||||
|
|
||||||
|
|
||||||
virtual int collisionBeginCallback(PhysicsContact& contact);
|
virtual int collisionBeginCallback(PhysicsContact& contact);
|
||||||
|
@ -145,7 +147,7 @@ protected:
|
||||||
PhysicsContactListener* _listener;
|
PhysicsContactListener* _listener;
|
||||||
|
|
||||||
|
|
||||||
Array* _bodys;
|
Array* _bodies;
|
||||||
std::list<PhysicsJoint*> _joints;
|
std::list<PhysicsJoint*> _joints;
|
||||||
Scene* _scene;
|
Scene* _scene;
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,6 @@ NS_CC_BEGIN
|
||||||
|
|
||||||
PhysicsBodyInfo::PhysicsBodyInfo()
|
PhysicsBodyInfo::PhysicsBodyInfo()
|
||||||
: body(nullptr)
|
: body(nullptr)
|
||||||
, group(CP_NO_GROUP)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "../CCPhysicsSetting.h"
|
|
||||||
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
|
||||||
|
|
||||||
#ifndef __CCPHYSICS_BODY_INFO_H__
|
#ifndef __CCPHYSICS_BODY_INFO_H__
|
||||||
#define __CCPHYSICS_BODY_INFO_H__
|
#define __CCPHYSICS_BODY_INFO_H__
|
||||||
|
|
||||||
|
#include "../CCPhysicsSetting.h"
|
||||||
|
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
||||||
#include "chipmunk.h"
|
#include "chipmunk.h"
|
||||||
#include "CCPlatformMacros.h"
|
#include "CCPlatformMacros.h"
|
||||||
#include "CCObject.h"
|
#include "CCObject.h"
|
||||||
|
@ -37,7 +37,6 @@ class PhysicsBodyInfo : public Clonable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cpBody* body;
|
cpBody* body;
|
||||||
cpGroup group;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PhysicsBodyInfo();
|
PhysicsBodyInfo();
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "../CCPhysicsSetting.h"
|
|
||||||
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
|
||||||
|
|
||||||
#ifndef __CCPHYSICS_CONTACT_INFO_H__
|
#ifndef __CCPHYSICS_CONTACT_INFO_H__
|
||||||
#define __CCPHYSICS_CONTACT_INFO_H__
|
#define __CCPHYSICS_CONTACT_INFO_H__
|
||||||
|
|
||||||
|
#include "../CCPhysicsSetting.h"
|
||||||
|
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
||||||
#include "chipmunk.h"
|
#include "chipmunk.h"
|
||||||
#include "CCPlatformMacros.h"
|
#include "CCPlatformMacros.h"
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
|
@ -22,12 +22,12 @@
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "../CCPhysicsSetting.h"
|
|
||||||
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
|
||||||
|
|
||||||
#ifndef __CCPHYSICS_HELPER_H__
|
#ifndef __CCPHYSICS_HELPER_H__
|
||||||
#define __CCPHYSICS_HELPER_H__
|
#define __CCPHYSICS_HELPER_H__
|
||||||
|
|
||||||
|
#include "../CCPhysicsSetting.h"
|
||||||
|
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
||||||
|
|
||||||
#include "chipmunk.h"
|
#include "chipmunk.h"
|
||||||
#include "CCPlatformMacros.h"
|
#include "CCPlatformMacros.h"
|
||||||
#include "CCGeometry.h"
|
#include "CCGeometry.h"
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "../CCPhysicsSetting.h"
|
|
||||||
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
|
||||||
|
|
||||||
#ifndef __CCPHYSICS_JOINT_INFO_H__
|
#ifndef __CCPHYSICS_JOINT_INFO_H__
|
||||||
#define __CCPHYSICS_JOINT_INFO_H__
|
#define __CCPHYSICS_JOINT_INFO_H__
|
||||||
|
|
||||||
|
#include "../CCPhysicsSetting.h"
|
||||||
|
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
||||||
#include "chipmunk.h"
|
#include "chipmunk.h"
|
||||||
#include "CCPlatformMacros.h"
|
#include "CCPlatformMacros.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
|
@ -22,12 +22,12 @@
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "../CCPhysicsSetting.h"
|
|
||||||
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
|
||||||
|
|
||||||
#ifndef __CCPHYSICS_SHAPE_INFO_H__
|
#ifndef __CCPHYSICS_SHAPE_INFO_H__
|
||||||
#define __CCPHYSICS_SHAPE_INFO_H__
|
#define __CCPHYSICS_SHAPE_INFO_H__
|
||||||
|
|
||||||
|
#include "../CCPhysicsSetting.h"
|
||||||
|
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include "chipmunk.h"
|
#include "chipmunk.h"
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "../CCPhysicsSetting.h"
|
|
||||||
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
|
||||||
|
|
||||||
#ifndef __CCPHYSICS_WORLD_INFO_H__
|
#ifndef __CCPHYSICS_WORLD_INFO_H__
|
||||||
#define __CCPHYSICS_WORLD_INFO_H__
|
#define __CCPHYSICS_WORLD_INFO_H__
|
||||||
|
|
||||||
|
#include "../CCPhysicsSetting.h"
|
||||||
|
#if (CC_PHYSICS_ENGINE == CC_PHYSICS_CHIPMUNK)
|
||||||
#include "chipmunk.h"
|
#include "chipmunk.h"
|
||||||
#include "CCPlatformMacros.h"
|
#include "CCPlatformMacros.h"
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
|
@ -11,6 +11,8 @@ namespace
|
||||||
CL(PhysicsDemoClickAdd),
|
CL(PhysicsDemoClickAdd),
|
||||||
CL(PhysicsDemoRayCast),
|
CL(PhysicsDemoRayCast),
|
||||||
CL(PhysicsDemoJoints),
|
CL(PhysicsDemoJoints),
|
||||||
|
CL(PhysicsDemoActions),
|
||||||
|
CL(PhysicsDemoPump),
|
||||||
};
|
};
|
||||||
|
|
||||||
static int sceneIdx=-1;
|
static int sceneIdx=-1;
|
||||||
|
@ -52,7 +54,7 @@ namespace
|
||||||
}
|
}
|
||||||
|
|
||||||
static const Color4F STATIC_COLOR(1.0f, 0.0f, 0.0f, 1.0f);
|
static const Color4F STATIC_COLOR(1.0f, 0.0f, 0.0f, 1.0f);
|
||||||
static const int DRAG_BODYS_TAG = 100;
|
static const int DRAG_BODYS_TAG = 0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -314,7 +316,7 @@ namespace
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Sprite* PhysicsDemo::makeBall(float x, float y, float radius, PhysicsMaterial material)
|
Sprite* PhysicsDemo::makeBall(Point point, float radius, PhysicsMaterial material)
|
||||||
{
|
{
|
||||||
Sprite* ball = nullptr;
|
Sprite* ball = nullptr;
|
||||||
if (_ball != nullptr)
|
if (_ball != nullptr)
|
||||||
|
@ -329,12 +331,12 @@ Sprite* PhysicsDemo::makeBall(float x, float y, float radius, PhysicsMaterial ma
|
||||||
|
|
||||||
auto body = PhysicsBody::createCircle(radius, material);
|
auto body = PhysicsBody::createCircle(radius, material);
|
||||||
ball->setPhysicsBody(body);
|
ball->setPhysicsBody(body);
|
||||||
ball->setPosition(Point(x, y));
|
ball->setPosition(Point(point.x, point.y));
|
||||||
|
|
||||||
return ball;
|
return ball;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sprite* PhysicsDemo::makeBox(float x, float y, Size size, PhysicsMaterial material)
|
Sprite* PhysicsDemo::makeBox(Point point, Size size, PhysicsMaterial material)
|
||||||
{
|
{
|
||||||
auto box = CCRANDOM_0_1() > 0.5f ? Sprite::create("Images/YellowSquare.png") : Sprite::create("Images/CyanSquare.png");
|
auto box = CCRANDOM_0_1() > 0.5f ? Sprite::create("Images/YellowSquare.png") : Sprite::create("Images/CyanSquare.png");
|
||||||
|
|
||||||
|
@ -343,12 +345,12 @@ Sprite* PhysicsDemo::makeBox(float x, float y, Size size, PhysicsMaterial materi
|
||||||
|
|
||||||
auto body = PhysicsBody::createBox(size);
|
auto body = PhysicsBody::createBox(size);
|
||||||
box->setPhysicsBody(body);
|
box->setPhysicsBody(body);
|
||||||
box->setPosition(Point(x, y));
|
box->setPosition(Point(point.x, point.y));
|
||||||
|
|
||||||
return box;
|
return box;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sprite* PhysicsDemo::makeTriangle(float x, float y, Size size, PhysicsMaterial material)
|
Sprite* PhysicsDemo::makeTriangle(Point point, Size size, PhysicsMaterial material)
|
||||||
{
|
{
|
||||||
auto triangle = CCRANDOM_0_1() > 0.5f ? Sprite::create("Images/YellowTriangle.png") : Sprite::create("Images/CyanTriangle.png");
|
auto triangle = CCRANDOM_0_1() > 0.5f ? Sprite::create("Images/YellowTriangle.png") : Sprite::create("Images/CyanTriangle.png");
|
||||||
|
|
||||||
|
@ -365,7 +367,7 @@ Sprite* PhysicsDemo::makeTriangle(float x, float y, Size size, PhysicsMaterial m
|
||||||
|
|
||||||
auto body = PhysicsBody::createPolygon(vers, 3);
|
auto body = PhysicsBody::createPolygon(vers, 3);
|
||||||
triangle->setPhysicsBody(body);
|
triangle->setPhysicsBody(body);
|
||||||
triangle->setPosition(Point(x, y));
|
triangle->setPosition(Point(point.x, point.y));
|
||||||
|
|
||||||
return triangle;
|
return triangle;
|
||||||
}
|
}
|
||||||
|
@ -380,7 +382,7 @@ bool PhysicsDemo::onTouchBegan(Touch* touch, Event* event)
|
||||||
{
|
{
|
||||||
shape = dynamic_cast<PhysicsShape*>(obj);
|
shape = dynamic_cast<PhysicsShape*>(obj);
|
||||||
|
|
||||||
if (shape->getTag() == DRAG_BODYS_TAG)
|
if ((shape->getTag() & DRAG_BODYS_TAG) != 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -395,7 +397,7 @@ bool PhysicsDemo::onTouchBegan(Touch* touch, Event* event)
|
||||||
mouse->setPosition(location);
|
mouse->setPosition(location);
|
||||||
this->addChild(mouse);
|
this->addChild(mouse);
|
||||||
PhysicsJointPin* joint = PhysicsJointPin::create(mouse->getPhysicsBody(), shape->getBody(), location);
|
PhysicsJointPin* joint = PhysicsJointPin::create(mouse->getPhysicsBody(), shape->getBody(), location);
|
||||||
joint->setMaxForce(5000.0f);
|
joint->setMaxForce(5000.0f * shape->getBody()->getMass());
|
||||||
_scene->getPhysicsWorld()->addJoint(joint);
|
_scene->getPhysicsWorld()->addJoint(joint);
|
||||||
_mouses.insert(std::make_pair(touch->getID(), mouse));
|
_mouses.insert(std::make_pair(touch->getID(), mouse));
|
||||||
|
|
||||||
|
@ -445,9 +447,9 @@ void PhysicsDemoLogoSmash::onEnter()
|
||||||
float x_jitter = 0.05*frand();
|
float x_jitter = 0.05*frand();
|
||||||
float y_jitter = 0.05*frand();
|
float y_jitter = 0.05*frand();
|
||||||
|
|
||||||
Node* ball = makeBall(2*(x - logo_width/2 + x_jitter) + VisibleRect::getVisibleRect().size.width/2,
|
Node* ball = makeBall(Point(2*(x - logo_width/2 + x_jitter) + VisibleRect::getVisibleRect().size.width/2,
|
||||||
2*(logo_height-y + y_jitter) + VisibleRect::getVisibleRect().size.height/2 - logo_height/2,
|
2*(logo_height-y + y_jitter) + VisibleRect::getVisibleRect().size.height/2 - logo_height/2),
|
||||||
0.95f, PhysicsMaterial(1.0f, 0.0f, 0.0f));
|
0.95f, PhysicsMaterial(0.01f, 0.0f, 0.0f));
|
||||||
|
|
||||||
ball->getPhysicsBody()->setMass(1.0);
|
ball->getPhysicsBody()->setMass(1.0);
|
||||||
ball->getPhysicsBody()->setMoment(PHYSICS_INFINITY);
|
ball->getPhysicsBody()->setMoment(PHYSICS_INFINITY);
|
||||||
|
@ -459,7 +461,7 @@ void PhysicsDemoLogoSmash::onEnter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
auto bullet = makeBall(400, 0, 10, PhysicsMaterial(PHYSICS_INFINITY, 0, 0));
|
auto bullet = makeBall(Point(400, 0), 10, PhysicsMaterial(PHYSICS_INFINITY, 0, 0));
|
||||||
bullet->getPhysicsBody()->setVelocity(Point(400, 0));
|
bullet->getPhysicsBody()->setVelocity(Point(400, 0));
|
||||||
|
|
||||||
bullet->setPosition(Point(-1000, VisibleRect::getVisibleRect().size.height/2));
|
bullet->setPosition(Point(-1000, VisibleRect::getVisibleRect().size.height/2));
|
||||||
|
@ -727,13 +729,13 @@ void PhysicsDemoRayCast::onTouchesEnded(const std::vector<Touch*>& touches, Even
|
||||||
|
|
||||||
if (r < 1.0f/3.0f)
|
if (r < 1.0f/3.0f)
|
||||||
{
|
{
|
||||||
addChild(makeBall(location.x, location.y, 5 + CCRANDOM_0_1()*10));
|
addChild(makeBall(location, 5 + CCRANDOM_0_1()*10));
|
||||||
}else if(r < 2.0f/3.0f)
|
}else if(r < 2.0f/3.0f)
|
||||||
{
|
{
|
||||||
addChild(makeBox(location.x, location.y, Size(10 + CCRANDOM_0_1()*15, 10 + CCRANDOM_0_1()*15)));
|
addChild(makeBox(location, Size(10 + CCRANDOM_0_1()*15, 10 + CCRANDOM_0_1()*15)));
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
addChild(makeTriangle(location.x, location.y, Size(10 + CCRANDOM_0_1()*20, 10 + CCRANDOM_0_1()*20)));
|
addChild(makeTriangle(location, Size(10 + CCRANDOM_0_1()*20, 10 + CCRANDOM_0_1()*20)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -743,12 +745,6 @@ std::string PhysicsDemoRayCast::title()
|
||||||
return "Ray Cast";
|
return "Ray Cast";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PhysicsDemoJoints::PhysicsDemoJoints()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void PhysicsDemoJoints::onEnter()
|
void PhysicsDemoJoints::onEnter()
|
||||||
{
|
{
|
||||||
PhysicsDemo::onEnter();
|
PhysicsDemo::onEnter();
|
||||||
|
@ -780,9 +776,9 @@ void PhysicsDemoJoints::onEnter()
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
auto sp1 = makeBall(offset.x - 30, offset.y, 10);
|
auto sp1 = makeBall(offset - Point(30, 0), 10);
|
||||||
sp1->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
sp1->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
||||||
auto sp2 = makeBall(offset.x + 30, offset.y, 10);
|
auto sp2 = makeBall(offset + Point(30, 0), 10);
|
||||||
sp2->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
sp2->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
||||||
|
|
||||||
PhysicsJointPin* joint = PhysicsJointPin::create(sp1->getPhysicsBody(), sp2->getPhysicsBody(), offset);
|
PhysicsJointPin* joint = PhysicsJointPin::create(sp1->getPhysicsBody(), sp2->getPhysicsBody(), offset);
|
||||||
|
@ -795,9 +791,9 @@ void PhysicsDemoJoints::onEnter()
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
|
|
||||||
auto sp1 = makeBall(offset.x - 30, offset.y, 10);
|
auto sp1 = makeBall(offset - Point(30, 0), 10);
|
||||||
sp1->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
sp1->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
||||||
auto sp2 = makeBox(offset.x + 30, offset.y, Size(30, 10));
|
auto sp2 = makeBox(offset + Point(30, 0), Size(30, 10));
|
||||||
sp2->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
sp2->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
||||||
|
|
||||||
PhysicsJointFixed* joint = PhysicsJointFixed::create(sp1->getPhysicsBody(), sp2->getPhysicsBody(), offset);
|
PhysicsJointFixed* joint = PhysicsJointFixed::create(sp1->getPhysicsBody(), sp2->getPhysicsBody(), offset);
|
||||||
|
@ -818,3 +814,192 @@ std::string PhysicsDemoJoints::title()
|
||||||
{
|
{
|
||||||
return "Joints";
|
return "Joints";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicsDemoActions::onEnter()
|
||||||
|
{
|
||||||
|
PhysicsDemo::onEnter();
|
||||||
|
|
||||||
|
setTouchEnabled(true);
|
||||||
|
setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
|
||||||
|
|
||||||
|
auto node = Node::create();
|
||||||
|
node->setPhysicsBody(PhysicsBody::createEdgeBox(VisibleRect::getVisibleRect().size));
|
||||||
|
node->setPosition(VisibleRect::center());
|
||||||
|
this->addChild(node);
|
||||||
|
|
||||||
|
Sprite* sp1 = addGrossiniAtPosition(VisibleRect::center());
|
||||||
|
Sprite* sp2 = addGrossiniAtPosition(VisibleRect::left() + Point(50, 0));
|
||||||
|
Sprite* sp3 = addGrossiniAtPosition(VisibleRect::right() - Point(20, 0));
|
||||||
|
Sprite* sp4 = addGrossiniAtPosition(VisibleRect::leftTop() + Point(50, -50));
|
||||||
|
sp4->getPhysicsBody()->setGravityEnable(false);
|
||||||
|
|
||||||
|
|
||||||
|
auto actionTo = JumpTo::create(2, Point(100,100), 50, 4);
|
||||||
|
auto actionBy = JumpBy::create(2, Point(300,0), 50, 4);
|
||||||
|
auto actionUp = JumpBy::create(2, Point(0,50), 80, 4);
|
||||||
|
auto actionByBack = actionBy->reverse();
|
||||||
|
|
||||||
|
sp1->runAction(RepeatForever::create(actionUp));
|
||||||
|
sp2->runAction(RepeatForever::create(Sequence::create(actionBy, actionByBack, NULL)));
|
||||||
|
sp3->runAction(actionTo);
|
||||||
|
sp4->runAction(RepeatForever::create(Sequence::create(actionBy->clone(), actionByBack->clone(), NULL)));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string PhysicsDemoActions::title()
|
||||||
|
{
|
||||||
|
return "Actions";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhysicsDemoPump::onEnter()
|
||||||
|
{
|
||||||
|
PhysicsDemo::onEnter();
|
||||||
|
|
||||||
|
_distance = 0.0f;
|
||||||
|
_rotationV = 0.0f;
|
||||||
|
setTouchEnabled(true);
|
||||||
|
setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
|
||||||
|
scheduleUpdate();
|
||||||
|
|
||||||
|
auto node = Node::create();
|
||||||
|
auto body = PhysicsBody::create();
|
||||||
|
body->setDynamic(false);
|
||||||
|
|
||||||
|
PhysicsMaterial staticMaterial(PHYSICS_INFINITY, 0, 0.5f);
|
||||||
|
body->addShape(PhysicsShapeEdgeSegment::create(VisibleRect::leftTop() + Point(50, 0), VisibleRect::leftTop() + Point(50, -130), staticMaterial, 2.0f));
|
||||||
|
body->addShape(PhysicsShapeEdgeSegment::create(VisibleRect::leftTop() + Point(190, 0), VisibleRect::leftTop() + Point(100, -50), staticMaterial, 2.0f));
|
||||||
|
body->addShape(PhysicsShapeEdgeSegment::create(VisibleRect::leftTop() + Point(100, -50), VisibleRect::leftTop() + Point(100, -90), staticMaterial, 2.0f));
|
||||||
|
body->addShape(PhysicsShapeEdgeSegment::create(VisibleRect::leftTop() + Point(50, -130), VisibleRect::leftTop() + Point(100, -145), staticMaterial, 2.0f));
|
||||||
|
body->addShape(PhysicsShapeEdgeSegment::create(VisibleRect::leftTop() + Point(100, -145), VisibleRect::leftBottom() + Point(100, 80), staticMaterial, 2.0f));
|
||||||
|
body->addShape(PhysicsShapeEdgeSegment::create(VisibleRect::leftTop() + Point(150, -80), VisibleRect::leftBottom() + Point(150, 80), staticMaterial, 2.0f));
|
||||||
|
body->addShape(PhysicsShapeEdgeSegment::create(VisibleRect::leftTop() + Point(150, -80), VisibleRect::rightTop() + Point(-100, -150), staticMaterial, 2.0f));
|
||||||
|
|
||||||
|
body->setCategoryBitmask(0x01);
|
||||||
|
|
||||||
|
// balls
|
||||||
|
for (int i = 0; i < 6; ++i)
|
||||||
|
{
|
||||||
|
auto ball = makeBall(VisibleRect::leftTop() + Point(75 + CCRANDOM_0_1() * 90, 0), 22, PhysicsMaterial(0.5f, 0.0f, 0.1f));
|
||||||
|
ball->getPhysicsBody()->setTag(DRAG_BODYS_TAG);
|
||||||
|
addChild(ball);
|
||||||
|
}
|
||||||
|
|
||||||
|
node->setPhysicsBody(body);
|
||||||
|
this->addChild(node);
|
||||||
|
|
||||||
|
Point vec[4] =
|
||||||
|
{
|
||||||
|
VisibleRect::leftTop() + Point(102, -146),
|
||||||
|
VisibleRect::leftTop() + Point(148, -159),
|
||||||
|
VisibleRect::leftBottom() + Point(148, 20),
|
||||||
|
VisibleRect::leftBottom() + Point(102, 20)
|
||||||
|
};
|
||||||
|
|
||||||
|
auto _world = _scene->getPhysicsWorld();
|
||||||
|
|
||||||
|
// small gear
|
||||||
|
auto sgear = Node::create();
|
||||||
|
auto sgearB = PhysicsBody::createCircle(50);
|
||||||
|
sgear->setPhysicsBody(sgearB);
|
||||||
|
sgear->setPosition(VisibleRect::leftBottom() + Point(125, 0));
|
||||||
|
this->addChild(sgear);
|
||||||
|
sgearB->setCategoryBitmask(0x04);
|
||||||
|
sgearB->setCollisionBitmask(0x04);
|
||||||
|
sgearB->setTag(1);
|
||||||
|
_world->addJoint(PhysicsJointPin::create(body, sgearB, sgearB->getPosition()));
|
||||||
|
|
||||||
|
|
||||||
|
// big gear
|
||||||
|
auto bgear = Node::create();
|
||||||
|
auto bgearB = PhysicsBody::createCircle(100);
|
||||||
|
bgear->setPhysicsBody(bgearB);
|
||||||
|
bgear->setPosition(VisibleRect::leftBottom() + Point(275, 0));
|
||||||
|
this->addChild(bgear);
|
||||||
|
bgearB->setCategoryBitmask(0x04);
|
||||||
|
_world->addJoint(PhysicsJointPin::create(body, bgearB, bgearB->getPosition()));
|
||||||
|
|
||||||
|
|
||||||
|
// pump
|
||||||
|
auto pump = Node::create();
|
||||||
|
pump->setPosition(PhysicsShape::getPolyonCenter(vec, 4));
|
||||||
|
auto pumpB = PhysicsBody::createPolygon(PhysicsShape::recenterPoints(vec, 4), 4);
|
||||||
|
pump->setPhysicsBody(pumpB);
|
||||||
|
this->addChild(pump);
|
||||||
|
pumpB->setCategoryBitmask(0x02);
|
||||||
|
pumpB->setGravityEnable(false);
|
||||||
|
_world->addJoint(PhysicsJointDistance::create(pumpB, sgearB, Point(0, 0), Point(0, -50)));
|
||||||
|
|
||||||
|
// plugger
|
||||||
|
Point seg[] = {VisibleRect::leftTop() + Point(75, -120), VisibleRect::leftBottom() + Point(75, -100)};
|
||||||
|
Point segCenter = (seg[1] + seg[0])/2;
|
||||||
|
seg[1] -= segCenter;
|
||||||
|
seg[0] -= segCenter;
|
||||||
|
auto plugger = Node::create();
|
||||||
|
auto pluggerB = PhysicsBody::createEdgeSegment(seg[0], seg[1], PhysicsMaterial(0.01f, 0.0f, 0.5f), 20);
|
||||||
|
pluggerB->setDynamic(true);
|
||||||
|
pluggerB->setMass(30);
|
||||||
|
pluggerB->setMoment(100000);
|
||||||
|
plugger->setPhysicsBody(pluggerB);
|
||||||
|
plugger->setPosition(segCenter);
|
||||||
|
this->addChild(plugger);
|
||||||
|
pluggerB->setCategoryBitmask(0x02);
|
||||||
|
sgearB->setCollisionBitmask(0x04 | 0x01);
|
||||||
|
_world->addJoint(PhysicsJointPin::create(body, pluggerB, VisibleRect::leftBottom() + Point(75, -90)));
|
||||||
|
_world->addJoint(PhysicsJointDistance::create(pluggerB, sgearB, pluggerB->world2Local(VisibleRect::leftBottom() + Point(75, 0)), Point(50, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhysicsDemoPump::update(float delta)
|
||||||
|
{
|
||||||
|
for (auto obj : *_scene->getPhysicsWorld()->getAllBodies())
|
||||||
|
{
|
||||||
|
PhysicsBody* body = dynamic_cast<PhysicsBody*>(obj);
|
||||||
|
if (body->getTag() == DRAG_BODYS_TAG && body->getPosition().y < 0.0f)
|
||||||
|
{
|
||||||
|
body->getOwner()->setPosition(VisibleRect::leftTop() + Point(75 + CCRANDOM_0_1() * 90, 0));
|
||||||
|
body->setVelocity(Point(0, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PhysicsBody* gear = _scene->getPhysicsWorld()->getBodyByTag(1);
|
||||||
|
|
||||||
|
if (gear != nullptr)
|
||||||
|
{
|
||||||
|
if (_distance != 0.0f)
|
||||||
|
{
|
||||||
|
_rotationV += _distance/2500.0f;
|
||||||
|
|
||||||
|
if (_rotationV > 30) _rotationV = 30.0f;
|
||||||
|
if (_rotationV < -30) _rotationV = -30.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
gear->setAngularVelocity(_rotationV);
|
||||||
|
_rotationV *= 0.995;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PhysicsDemoPump::onTouchBegan(Touch* touch, Event* event)
|
||||||
|
{
|
||||||
|
PhysicsDemo::onTouchBegan(touch, event);
|
||||||
|
|
||||||
|
_distance = touch->getLocation().x - VisibleRect::center().x;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhysicsDemoPump::onTouchMoved(Touch* touch, Event* event)
|
||||||
|
{
|
||||||
|
PhysicsDemo::onTouchMoved(touch, event);
|
||||||
|
|
||||||
|
_distance = touch->getLocation().x - VisibleRect::center().x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PhysicsDemoPump::onTouchEnded(Touch* touch, Event* event)
|
||||||
|
{
|
||||||
|
PhysicsDemo::onTouchEnded(touch, event);
|
||||||
|
|
||||||
|
_distance = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string PhysicsDemoPump::title()
|
||||||
|
{
|
||||||
|
return "Pump";
|
||||||
|
}
|
|
@ -39,9 +39,9 @@ public:
|
||||||
void toggleDebugCallback(Object* sender);
|
void toggleDebugCallback(Object* sender);
|
||||||
|
|
||||||
Sprite* addGrossiniAtPosition(Point p, float scale = 1.0);
|
Sprite* addGrossiniAtPosition(Point p, float scale = 1.0);
|
||||||
Sprite* makeBall(float x, float y, float radius, PhysicsMaterial material = PHYSICSBODY_MATERIAL_DEFAULT);
|
Sprite* makeBall(Point point, float radius, PhysicsMaterial material = PHYSICSBODY_MATERIAL_DEFAULT);
|
||||||
Sprite* makeBox(float x, float y, Size size, PhysicsMaterial material = PHYSICSBODY_MATERIAL_DEFAULT);
|
Sprite* makeBox(Point point, Size size, PhysicsMaterial material = PHYSICSBODY_MATERIAL_DEFAULT);
|
||||||
Sprite* makeTriangle(float x, float y, Size size, PhysicsMaterial material = PHYSICSBODY_MATERIAL_DEFAULT);
|
Sprite* makeTriangle(Point point, Size size, PhysicsMaterial material = PHYSICSBODY_MATERIAL_DEFAULT);
|
||||||
|
|
||||||
bool onTouchBegan(Touch* touch, Event* event) override;
|
bool onTouchBegan(Touch* touch, Event* event) override;
|
||||||
void onTouchMoved(Touch* touch, Event* event) override;
|
void onTouchMoved(Touch* touch, Event* event) override;
|
||||||
|
@ -107,14 +107,31 @@ private:
|
||||||
class PhysicsDemoJoints : public PhysicsDemo
|
class PhysicsDemoJoints : public PhysicsDemo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PhysicsDemoJoints();
|
void onEnter() override;
|
||||||
|
std::string title() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PhysicsDemoActions : public PhysicsDemo
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
void onEnter() override;
|
void onEnter() override;
|
||||||
std::string title() override;
|
std::string title() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PhysicsDemoPump : public PhysicsDemo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void onEnter() override;
|
||||||
|
std::string title() override;
|
||||||
|
void update(float delta) override;
|
||||||
|
|
||||||
|
bool onTouchBegan(Touch* touch, Event* event) override;
|
||||||
|
void onTouchMoved(Touch* touch, Event* event) override;
|
||||||
|
void onTouchEnded(Touch* touch, Event* event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PhysicsShape* _touchesShape;
|
float _distance;
|
||||||
|
float _rotationV;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue