Ejemplo n.º 1
0
Bullet::Bullet() : Object() {
	shape = b2PolygonShape();
	type = ObjectData::object_type::BULLET;
	direction = Cell::Direction::NONE;
	speed = 20.0f;
	damage = 10;
}
Ejemplo n.º 2
0
void Box2DPhysicsComponent::createCollisionBody( b2World* physics, GameObject* object, b2BodyType type, bool sensorOnly )
{
    // Create instances
    mBodyDef = b2BodyDef();
    mPolygonShape = b2PolygonShape();
    mFixtureDef = b2FixtureDef();

    // Set type
    mBodyDef.type = type;

    // Set position and create the body
    mBodyDef.position.Set( object->getPosition().x / SCALE, object->getPosition().y / SCALE );
    mBody = physics->CreateBody( &mBodyDef );

    /*
    *   SHAPE
    *
    *   Dynamic bodies get a standard polygon box shape.
    *
    *   Static and kinematic bodies get a a rectangular shape made of
    *   egde chains (one per side; so four total) to fix the ghost vertices
    *   problem. This is done by defining previous and next vertices that
    *   Box2D can use in its calculation.
    *
    *   More info:
    *       http://www.box2d.org/manual.html#_Toc258082970
    *       http://www.iforce2d.net/b2dtut/ghost-vertices
    *
    */
    if ( type != b2_dynamicBody )
    {
        // Top
        b2Vec2 vs[2];
        vs[0].Set( (-object->getSize().x / 2.f) / SCALE, -object->getSize().y / 2.f / SCALE );
        vs[1].Set( (object->getSize().x / 2.f) / SCALE, -object->getSize().y / 2.f / SCALE );
        mChainShape[0].CreateChain( vs, 2 );
        mChainShape[0].SetPrevVertex( b2Vec2( (-object->getSize().x - object->getSize().x / 2.f) / SCALE, object->getSize().y / 2.f / SCALE ) );
        mChainShape[0].SetNextVertex( b2Vec2( (object->getSize().x + object->getSize().x / 2.f) / SCALE, object->getSize().y / 2.f / SCALE ) );
        mBody->CreateFixture( &mChainShape[0], 0.f );

        // Bottom
        vs[0].Set( (-object->getSize().x / 2.f) / SCALE, object->getSize().y / 2.f / SCALE );
        vs[1].Set( (object->getSize().x / 2.f) / SCALE, object->getSize().y / 2.f / SCALE );
        mChainShape[1].CreateChain( vs, 2 );
        mChainShape[1].SetPrevVertex( b2Vec2( (-object->getSize().x - object->getSize().x / 2.f) / SCALE, object->getSize().y / 2.f / SCALE ) );
        mChainShape[1].SetNextVertex( b2Vec2( (object->getSize().x + object->getSize().x / 2.f) / SCALE, object->getSize().y / 2.f / SCALE ) );
        mBody->CreateFixture( &mChainShape[1], 0.f );

        // Left
        vs[0].Set( (-object->getSize().x / 2.f) / SCALE, -object->getSize().y / 2.f / SCALE );
        vs[1].Set( (-object->getSize().x / 2.f) / SCALE, object->getSize().y / 2.f / SCALE );
        mChainShape[2].CreateChain( vs, 2 );
        mChainShape[2].SetPrevVertex( b2Vec2( -object->getSize().x / 2.f / SCALE, (-object->getSize().y - object->getSize().y / 2.f) / SCALE ) );
        mChainShape[2].SetNextVertex( b2Vec2( -object->getSize().x / 2.f / SCALE, (object->getSize().y + object->getSize().y / 2.f) / SCALE ) );
        mBody->CreateFixture( &mChainShape[2], 0.f );

        // Right
        vs[0].Set( (object->getSize().x / 2.f) / SCALE, -object->getSize().y / 2.f / SCALE );
        vs[1].Set( (object->getSize().x / 2.f) / SCALE, object->getSize().y / 2.f / SCALE );
        mChainShape[3].CreateChain( vs, 2 );
        mChainShape[3].SetPrevVertex( b2Vec2( object->getSize().x / 2.f / SCALE, (-object->getSize().y - object->getSize().y / 2.f) / SCALE ) );
        mChainShape[3].SetNextVertex( b2Vec2( object->getSize().x / 2.f / SCALE, (object->getSize().y + object->getSize().y / 2.f) / SCALE ) );
        mBody->CreateFixture( &mChainShape[3], 0.f );
    }
    else
    {
        mPolygonShape.SetAsBox( (object->getSize().x / 2.f) / SCALE, (object->getSize().y / 2.f) / SCALE );
        mFixtureDef.shape = &mPolygonShape;
        mFixtureDef.density = 1.f;
        mFixtureDef.friction = 1.0f;

        if( sensorOnly )
        {
            mFixtureDef.isSensor = true;
        }

        mBody->CreateFixture( &mFixtureDef );
    }
}