Esempio n. 1
0
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);
    } 
}
Esempio n. 2
0
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);

}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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;
}