Bullet::Bullet() : Object() { shape = b2PolygonShape(); type = ObjectData::object_type::BULLET; direction = Cell::Direction::NONE; speed = 20.0f; damage = 10; }
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 ); } }