void CartWheel3D::runStep(double dt) { _nTime += dt; DynamicArray<ContactPoint>* contactPoints = _world->getContactForces(); DynamicArray<Vector3d> humanPositions; for (HumanItr itr = _humans.begin(); itr != _humans.end(); itr++) { Human* human = (*itr).second; SimBiController* c = human->getController(); if (NULL != c) { c->performPreTasks(dt, contactPoints); // Save the current position humanPositions.push_back(human->getPosition()); BehaviourController* b = human->getBehaviour(); if (NULL != b) { if (b->shouldAbort()) { } } } } _world->advanceInTime(dt); bool isHumansWorking = false; bool isObjsWorking = false; contactPoints = _world->getContactForces(); for (HumanItr itr = _humans.begin(); itr != _humans.end(); itr++) { Human* human = (*itr).second; SimBiController* c = human->getController(); if (NULL != c) { c->performPostTasks(dt, contactPoints); // Save the current position humanPositions.push_back(human->getPosition()); BehaviourController* b = human->getBehaviour(); if (NULL != b) { if (b->shouldAbort()) { } } } if(_behaviorsManager->runStep(human->getName().c_str(), _nTime)) { // printf("nTime: %f\n", _nTime); isHumansWorking = true; } } for(int i=0; i<_objects.size(); i++) { if(_behaviorsManager->runStep(_objects[i].c_str(), _nTime)) { isObjsWorking = true; } } if(!isHumansWorking && !isObjsWorking) { _behaviorsManager->setBehaviorsDone(true); } }
void Zombie::update(const std::vector<std::string>& levelData, std::vector<Human*>& humans, std::vector<Zombie*>& zombies, float deltaTime) { Human* closestHuman = getNearestHuman(humans); if (closestHuman != nullptr) { _direction = glm::normalize(closestHuman->getPosition() - _position); _position += _direction * _speed * deltaTime; } collideWithLevel(levelData); }
void Zombie::update(const std::vector<std::string>& levelData, std::vector<Human*>& humans, std::vector<Zombie*>& zombies) { // Find the closest human Human* closestHuman = getNearestHuman(humans); // If we found a human, move towards him if (closestHuman != nullptr) { // Get the direction vector twoards the player glm::vec2 direction = glm::normalize(closestHuman->getPosition() - _position); _position += direction * _speed; } // Do collision collideWithLevel(levelData); }
void WorldModel::updatePositions() { for (int i = 0; i < (int) ambulanceTeams.size(); i++) { Human *human = ambulanceTeams[i]; if (human->getMotionlessObject() == NULL || human->getMotionlessObject()->getId() != human->getPosition()) { human->setMotionlessObject((MotionlessObject*) objects[human->getPosition()]); LOG(Main, 1) << "update position of " << human->getId() << " : " << human->getMotionlessObject()->getId() << endl; } } for (int i = 0; i < (int) humans.size(); i++) { Human *human = humans[i]; if (!human->isAmbulanceTeam()) { bool flag = false; for (int j = 0; j < (int) ambulanceTeams.size(); j++) if (ambulanceTeams[j]->getId() == human->getPosition()) { human->setMotionlessObject((MotionlessObject*) objects[ambulanceTeams[j]->getPosition()]); LOG(Main, 1) << "update position of (loaded in ambulance) " << human->getId() << " : " << human->getMotionlessObject()->getId() << endl; flag = true; break; } if (human->getMotionlessObject() == NULL || (human->getMotionlessObject()->getId() != human->getPosition() && !flag)) { human->setMotionlessObject((MotionlessObject*) objects[human->getPosition()]); LOG(Main, 1) << "update position of " << human->getId() << " : " << human->getMotionlessObject()->getId() << endl; } } if (human->getLastCycleUpdatedBySense() != world->getTime()) { human->setX(human->getMotionlessObject()->getX()); human->setY(human->getMotionlessObject()->getY()); } } if (self->isPlatoon()) { for (int i = 0; i < civilians.size(); i++) { if (((Platoon*) self)->getMotionlessObject()->motionlessIndex == civilians[i]->getMotionlessObject()->motionlessIndex && getTime() - civilians[i]->getLastCycleUpdated() > 1) civilians[i]->isAvailable = false; } } //set civilians to buildingBlocks if (self->isPoliceForce()) { for (int i = 0; i < buildingBlocks.size(); i++) buildingBlocks[i]->civilians.clear(); for (int i = 0; i < civilians.size(); i++) { if (civilians[i]->getMotionlessObject()->isBuilding()) { LOG(Main, 4) << "civ: " << civilians[i]->getId() << endl; LOG(Main, 4) << "((Building*)civilians[i]->getMotionlessObject())->blockNum = " << ((Building*) civilians[i]->getMotionlessObject())->blockNum << endl; buildingBlocks[((Building*) civilians[i]->getMotionlessObject())->blockNum]->civilians.push_back(civilians[i]); } } } if (self->isPlatoon()) ((Platoon*) self)->getMotionlessObject()->iHaveBeenHere = true; }