void ProjectileSystem::Update(float _dt) { MouseInputComponent* mouse; PositionComponent* position; EntityMap::iterator it; for (it = m_entityMap.begin(); it != m_entityMap.end(); ++it) { Entity* e = it->second; if (e->GetState() != Entity::ALIVE) continue; mouse = e->GetComponent<MouseInputComponent>(); if (mouse->m_controls.LeftButton == InputState::Pressed) { position = it->second->GetComponent<PositionComponent>(); Entity* e = m_world->CreateEntity(); EntityFactory::GetInstance()->CreateEntity(e, EntityFactory::BALL); e->GetComponent<VelocityComponent>()->m_velocity = VECTOR3(0, 40, 0); e->GetComponent<PositionComponent>()->SetPosition(VECTOR3(position->GetPosition().x, position->GetPosition().y + 2.0f, 0)); m_world->AddEntity(e); } } }
void AudioSystem::Update(float _dt) { for (auto entityPair : m_entityMap) { Entity* e = entityPair.second; if ((e->GetState() == Entity::DEAD)) continue; auto collision = e->GetComponent<CollisionComponent>(); std::vector<CollisionContact> collisions = collision->GetCollisions(); for (unsigned int i = 0; i < collisions.size(); ++i) { const char* audioPath = e->GetComponent<AudioComponent>()->m_audioPath.c_str(); m_audioManager->PlaySoundEffect(audioPath); } } }
void PhysicsSystem::Update(float _dt) { for (auto it = m_entityMap.begin(); it != m_entityMap.end(); ++it) { Entity* e = it->second; if (e->GetState() != Entity::ALIVE) continue; auto collision = e->GetComponent<CollisionComponent>(); auto stats = e->GetComponent<CollisionStatsComponent>(); auto position = e->GetComponent<PositionComponent>(); auto velocity = e->GetComponent<VelocityComponent>(); auto rotation = e->GetComponent<RotationComponent>(); b2Body* b2Body = collision->GetBody(); // Update position, velocity and rotation after the components if (position && rotation) { const b2Vec2 b2Pos = b2Vec2(position->GetPosition().x, position->GetPosition().y); if (collision->GetBody()->GetPosition().x != b2Pos.x || collision->GetBody()->GetPosition().y != b2Pos.y || collision->GetBody()->GetAngle() != rotation->GetRotation().z) collision->GetBody()->SetTransform(b2Pos, rotation->GetRotation().z); } else if (position) { const b2Vec2 b2Pos = b2Vec2(position->GetPosition().x, position->GetPosition().y); if (collision->GetBody()->GetPosition().x != b2Pos.x || collision->GetBody()->GetPosition().y != b2Pos.y) collision->GetBody()->SetTransform(b2Pos, collision->GetBody()->GetAngle()); } else if (rotation) { if (collision->GetBody()->GetAngle() != rotation->GetRotation().z) collision->GetBody()->SetTransform(collision->GetBody()->GetPosition(), rotation->GetRotation().z); } if (velocity) { const b2Vec2 b2Velocity = b2Vec2(velocity->m_velocity.x, velocity->m_velocity.y); if (collision->GetBody()->GetLinearVelocity().x != b2Velocity.x || collision->GetBody()->GetLinearVelocity().y != b2Velocity.y) collision->GetBody()->SetLinearVelocity(b2Velocity); } // Update velocity min/max and deacceleration if (velocity && stats) { if (b2Body->GetLinearVelocity().y <= 0.5f && b2Body->GetLinearVelocity().y >= -0.5f) b2Body->SetLinearVelocity(b2Vec2(b2Body->GetLinearVelocity().x, -3.0f)); float speed = b2Body->GetLinearVelocity().Length(); // Speed cant be 0 if (speed == 0) continue; // Set speed between min/max if (speed < stats->GetMinSpeed()) { b2Body->SetLinearVelocity(b2Vec2((b2Body->GetLinearVelocity().x / speed) * stats->GetMinSpeed(), (b2Body->GetLinearVelocity().y / speed) * stats->GetMinSpeed())); } if (speed > stats->GetMaxSpeed()) { b2Body->SetLinearVelocity(b2Vec2((b2Body->GetLinearVelocity().x / speed) * stats->GetMaxSpeed(), (b2Body->GetLinearVelocity().y / speed) * stats->GetMaxSpeed())); } // Deaccelerate if (speed > stats->GetMaxDampingSpeed()) { float newSpeed = speed - (stats->GetDampingAcceleration() * _dt); if (speed < stats->GetMaxDampingSpeed()) newSpeed = stats->GetMaxDampingSpeed(); b2Body->SetLinearVelocity(b2Vec2((b2Body->GetLinearVelocity().x / speed) * newSpeed, (b2Body->GetLinearVelocity().y / speed) * newSpeed)); } } } // Simulate worlds physics m_b2World->Step(_dt, VELOCITYITERATIONS, POSITIONITERATIONS); // Update position, velocity and rotation components for (auto it = m_entityMap.begin(); it != m_entityMap.end(); ++it) { Entity* e = it->second; if (e->GetState() != Entity::ALIVE) continue; auto collision = e->GetComponent<CollisionComponent>(); auto position = e->GetComponent<PositionComponent>(); auto velocity = e->GetComponent<VelocityComponent>(); auto rotation = e->GetComponent<RotationComponent>(); b2Body* b2Body = collision->GetBody(); collision->ResetCollisions(); if (position) { b2Vec2 b2Pos = b2Body->GetPosition(); position->SetPosition(VECTOR3(b2Pos.x, b2Pos.y, position->GetPosition().z)); } if (velocity) { b2Vec2 b2Velocity = b2Body->GetLinearVelocity(); velocity->m_velocity = VECTOR3(b2Velocity.x, b2Velocity.y, velocity->m_velocity.z); } if (rotation) { QUAT rot = rotation->GetRotation(); //rotation->SetRotation(QUAT(rot.x, rot.y, b2Body->GetAngle(), rot.w)); } } // Do collisions checks for (b2Contact* contact = m_b2World->GetContactList(); contact; contact = contact->GetNext()) { if (!contact->IsTouching()) continue; b2Fixture* fixtureA = contact->GetFixtureA(); b2Fixture* fixtureB = contact->GetFixtureB(); Entity* entityA = 0; Entity* entityB = 0; for (auto it = m_entityMap.begin(); it != m_entityMap.end(); ++it) { Entity* e = it->second; if (e->GetState() != Entity::ALIVE) continue; if (!entityA && e->GetComponent<CollisionComponent>()->HasBody(fixtureA->GetBody())) entityA = e; else if (!entityB && e->GetComponent<CollisionComponent>()->HasBody(fixtureB->GetBody())) entityB = e; if (entityA && entityB) break; } if (entityA && entityB) { CollisionContact collisionContact = CollisionContact(contact, fixtureA, fixtureB, entityB->GetId()); entityA->GetComponent<CollisionComponent>()->CollidingWith(collisionContact); collisionContact = CollisionContact(contact, fixtureB, fixtureA, entityA->GetId()); entityB->GetComponent<CollisionComponent>()->CollidingWith(collisionContact); } } }