示例#1
0
void Player::buildPlayerBox2DBody(b2World* world) {
    CCPoint position = CCPointZero;
    
    //body definition
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.fixedRotation = true;
    
    b2Vec2 worldPosition = ViewPort::getInstance()->screenToWorldCoordinate(position);
    bodyDef.position.Set(worldPosition.x, worldPosition.y);
    
    //shape definition for main fixture
    b2PolygonShape dynamicBox = _profile->spriteBox2DShape();
    
    //fixture definition
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox;
    fixtureDef.density = 1;
    fixtureDef.friction = 0.0f; // So the player will be able to slide next to obstacles
    fixtureDef.restitution = 0.0f; // So the player will not bounce again from the ground
    fixtureDef.filter.groupIndex = -1; //negative so the different players will not collide
    
    //create dynamic body
    b2Body *body = world->CreateBody(&bodyDef);
    
    //add main fixture
    body->CreateFixture(&fixtureDef);
    
    setB2Body(body);
    setPTMRatio(ViewPort::getInstance()->getPTMRatio());
    setPosition(position);
}
void Box2DTestLayer::addNewSpriteAtPosition(Point p)
{
    CCLOG("Add sprite %0.2f x %02.f",p.x,p.y);
    
    // Define the dynamic body.
    //Set up a 1m squared box in the physics world
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);

    b2Body *body = world->CreateBody(&bodyDef);
    
    // Define another box shape for our dynamic body.
    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box
    
    // Define the dynamic body fixture.
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox;    
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    body->CreateFixture(&fixtureDef);    
    
    auto parent = this->getChildByTag(kTagParentNode);
    
    //We have a 64x64 sprite sheet with 4 different 32x32 images.  The following code is
    //just kdRandomly picking one of the images
    int idx = (CCRANDOM_0_1() > .5 ? 0:1);
    int idy = (CCRANDOM_0_1() > .5 ? 0:1);
    auto sprite = PhysicsSprite::createWithTexture(_spriteTexture,Rect(32 * idx,32 * idy,32,32));
    parent->addChild(sprite);
    sprite->setB2Body(body);
    sprite->setPTMRatio(PTM_RATIO);
    sprite->setPosition( Point( p.x, p.y) );
}
void ColliderDetector::setActive(bool active)
{
    if (m_bActive == active)
    {
        return;
    }

    m_bActive = active;

    if (m_pB2Body)
    {
        if (active)
        {
            setB2Body(m_pB2Body);
        }
        else
        {
            for(auto object : *m_pColliderBodyList)
            {
                ColliderBody *colliderBody = (ColliderBody *)object;
                b2Fixture *fixture = colliderBody->getB2Fixture();

                m_pB2Body->DestroyFixture(fixture);
                colliderBody->setB2Fixture(nullptr);
            }
        }
    }
    else if (m_pCPBody)
    {
        if (m_bActive)
        {
            for(auto object : *m_pColliderBodyList)
            {
                ColliderBody *colliderBody = (ColliderBody *)object;
                cpShape *shape = colliderBody->getShape();
                if(shape->space == nullptr)
                {
                    cpSpaceAddShape(m_pCPBody->space, shape);
                }
            }
        }
        else
        {
            for(auto object : *m_pColliderBodyList)
            {
                ColliderBody *colliderBody = (ColliderBody *)object;
                cpShape *shape = colliderBody->getShape();
                if (shape->space != nullptr)
                {
                    cpSpaceRemoveShape(m_pCPBody->space, shape);
                }
            }
        }
    }
}
示例#4
0
		inline virtual void registerWithWorld(std::shared_ptr<gecom::WorldProxy> world) {
			B2PhysicsComponent::registerWithWorld(world);

			b2BodyDef def;
			def.type = b2_dynamicBody;
			def.fixedRotation = true;
			def.position.Set(getParent()->getPosition().x(), getParent()->getPosition().y());
			def.linearDamping = 0.6f;

            setB2Body(world->createBody(def, shared_from_this()));

			auto bbb = std::make_shared<b2PolygonShape>();
			bbb->SetAsBox(m_half_width, m_half_height);

			auto fix = std::make_shared<b2FixtureDef>();
			fix->shape = bbb.get();
			fix->density = 130;
			fix->friction = 0.99f;

			world->createFixture(getBodyID(), fix, bbb);
		}
示例#5
0
StarPhysicsNode::StarPhysicsNode(const char* f, CCPoint p, AroundMeLayer* layer)
        : PhysicsNode(layer) {
    m_image = QString(f);
    b2BodyDef bd;
    bd.type = b2_dynamicBody;
    bd.position.Set(p.x / PTM_RATIO, p.y / PTM_RATIO);
    bd.userData = this;
    b2Body *body = m_world->CreateBody(&bd);
    b2Vec2 vertices[3];

    {
        b2PolygonShape triangle;
        vertices[0] = b2Vec2(-3.0f, 0.78f);
        vertices[1] = b2Vec2(-1.98f, -0.84f);
        vertices[2] = b2Vec2(-1.2f, 1.56f);
        triangle.Set(vertices, 3);
        b2FixtureDef fixtureDef;
        fixtureDef.shape = &triangle;
        fixtureDef.density = 1.0f;
        fixtureDef.restitution = 0.5;
        fixtureDef.friction = 0.3f;
        fixtureDef.filter.categoryBits = CHEERIOS;
        body->CreateFixture(&fixtureDef);
    }
    {
        b2PolygonShape triangle;
        vertices[0] = b2Vec2(-1.2f, 1.56f);
        vertices[1] = b2Vec2(1.2f, 1.56f);
        vertices[2] = b2Vec2(0.0f, 3.0f);
        triangle.Set(vertices, 3);
        b2FixtureDef fixtureDef;
        fixtureDef.shape = &triangle;
        fixtureDef.density = 1.0f;
        fixtureDef.restitution = 0.5;
        fixtureDef.friction = 0.3f;
        fixtureDef.filter.categoryBits = CHEERIOS;
        body->CreateFixture(&fixtureDef);
    }
    {
        b2PolygonShape triangle;
        vertices[0] = b2Vec2(1.2f, 1.56f);
        vertices[1] = b2Vec2(1.98f, -0.84f);
        vertices[2] = b2Vec2(3.0f, 0.78f);
        triangle.Set(vertices, 3);
        b2FixtureDef fixtureDef;
        fixtureDef.shape = &triangle;
        fixtureDef.density = 1.0f;
        fixtureDef.restitution = 0.5;
        fixtureDef.friction = 0.3f;
        fixtureDef.filter.categoryBits = CHEERIOS;
        body->CreateFixture(&fixtureDef);
    }
    {
        b2PolygonShape triangle;
        vertices[0] = b2Vec2(1.98f, -0.84f);
        vertices[1] = b2Vec2(0.0f, -2.22f);
        vertices[2] = b2Vec2(1.8f, -3.0f);
        triangle.Set(vertices, 3);
        b2FixtureDef fixtureDef;
        fixtureDef.shape = &triangle;
        fixtureDef.density = 1.0f;
        fixtureDef.restitution = 0.5;
        fixtureDef.friction = 0.3f;
        fixtureDef.filter.categoryBits = CHEERIOS;
        body->CreateFixture(&fixtureDef);
    }
    {
        b2PolygonShape triangle;
        vertices[0] = b2Vec2(0.0f, -2.22f);
        vertices[1] = b2Vec2(-1.98f, -0.84f);
        vertices[2] = b2Vec2(-1.8f, -3.0f);
        triangle.Set(vertices, 3);
        b2FixtureDef fixtureDef;
        fixtureDef.shape = &triangle;
        fixtureDef.density = 1.0f;
        fixtureDef.restitution = 0.5;
        fixtureDef.friction = 0.3f;
        fixtureDef.filter.categoryBits = CHEERIOS;
        body->CreateFixture(&fixtureDef);
    }
    {
        b2Vec2 vertices[5];
        b2PolygonShape pentagon;
        vertices[0] = b2Vec2(-1.98f, -0.84f);
        vertices[1] = b2Vec2(0.0f, -2.22f);
        vertices[2] = b2Vec2(1.98f, -0.84f);
        vertices[3] = b2Vec2(1.2f, 1.56f);
        vertices[4] = b2Vec2(-1.2f, 1.56f);
        pentagon.Set(vertices, 5);
        b2FixtureDef fixtureDef;
        fixtureDef.shape = &pentagon;
        fixtureDef.density = 1.0f;
        fixtureDef.restitution = 0.5;
        fixtureDef.friction = 0.3f;
        fixtureDef.filter.categoryBits = CHEERIOS;
        body->CreateFixture(&fixtureDef);
    }

    setContentSize(CCSize(WORLD_TO_SCREEN(3*2), WORLD_TO_SCREEN(3*2)));
    setScale(WORLD_TO_SCREEN(3) / 100);
    setPosition(ccp(p.x, p.y));
    setB2Body(body);

    m_sprite = CCSprite::create(f);
    addChild(m_sprite);
}