void Physics::step(void) { dynamicWorld->stepSimulation(1.f/60.f); graphics->animate(); int numManifolds = dynamicWorld->getDispatcher()->getNumManifolds(); for (int i = 0; i < numManifolds; i++) { btPersistentManifold* contactManifold = dynamicWorld->getDispatcher()->getManifoldByIndexInternal(i); btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0()); btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1()); btBroadphaseProxy* obA_proxy = obA->getBroadphaseHandle(); btBroadphaseProxy* obB_proxy = obB->getBroadphaseHandle(); if (obA_proxy->m_collisionFilterGroup & obB_proxy->m_collisionFilterMask) { if (obA_proxy->m_collisionFilterGroup == COL_PENGUIN && obB_proxy->m_collisionFilterGroup == COL_KILLBOX) { PhysicsBody* object = reinterpret_cast<PhysicsBody*>(obA->getUserPointer()); resetObject(object); } else if (obA_proxy->m_collisionFilterGroup == COL_PENGUIN && obB_proxy->m_collisionFilterGroup == COL_GOAL) { nextStage(); graphics->playSound(2); } else if (obA_proxy->m_collisionFilterGroup == COL_PENGUIN && obB_proxy->m_collisionFilterGroup == COL_CHECKPOINT) { btVector3 checkpoint2 = obB->getWorldTransform().getOrigin(); btBoxShape* shape = reinterpret_cast<btBoxShape*>(obB->getCollisionShape()); checkpoint2 += btVector3(0, shape->getHalfExtentsWithoutMargin().y(), 0); checkpoint2 += btVector3(0, 25, 0); PhysicsBody* object = reinterpret_cast<PhysicsBody*>(obA->getUserPointer()); btRigidBody* body = object->getBody(); btVector3 translate = body->getCenterOfMassPosition(); if (checkpoint2 != checkpoint && translate.y() >= checkpoint2.y()) { graphics->playSound(1); checkpoint = checkpoint2; } } } } }
void Physics::removeStage(void) { int x = 1; while (gameBodies.size() > x) { PhysicsBody* obj = gameBodies.at(x); dynamicWorld->removeRigidBody(obj->getBody()); gameBodies.remove(obj); delete obj; graphics->removeObject(x); } }
PhysicsBody * Player::CreatePlayerBody(WorldManager * wm, float x, float y) { PhysicsBody* playerBody = new PhysicsBody(wm, BODY_DYNAM, x, y, 0); b2FixtureDef playerFixDef; b2PolygonShape boxShape; boxShape.SetAsBox(PLAYER_W / 2.0, PLAYER_H / 2.0); playerFixDef.shape = &boxShape; playerFixDef.density = 1020; playerFixDef.restitution = 0; playerFixDef.filter.groupIndex = -1; playerBody->setFixedRotation(true); playerBody->getBody()->CreateFixture(&playerFixDef); playerBody->setW(PLAYER_W); playerBody->setH(PLAYER_H); playerBody->setBmp(); playerFixDef.density = 1; playerFixDef.friction = 0; boxShape.SetAsBox(PLAYER_W / 20.0, PLAYER_H / 2.0, b2Vec2(-PLAYER_W / 2, 0), 0); playerBody->getBody()->CreateFixture(&playerFixDef); boxShape.SetAsBox(PLAYER_W / 20.0, PLAYER_H / 2.0, b2Vec2(PLAYER_W / 2, 0), 0); playerBody->getBody()->CreateFixture(&playerFixDef); return playerBody; }