예제 #1
0
const StateModifications Actor::act(const std::vector<Tile*> &tileCollisions, const std::vector<Body*> &bodyCollisions) {
	StateModifications stateModifications = StateModifications();
	if (m_active) {
		stateModifications = run(tileCollisions, bodyCollisions);
	}

	return stateModifications;
}
예제 #2
0
StateModifications
Simulation::perform_next_event(State* state,
        std::vector<double> const& accumulated_rates,
        IRNG* rng) const {
    double r = rng->uniform(0, state->total_event_rate);
    auto i = std::lower_bound(accumulated_rates.cbegin(),
            accumulated_rates.cend(), r);

    if (i == accumulated_rates.cend()) {
        // XXX This should probably throw an exception...
        return StateModifications();
    } else {
        state->event_count++;
        return event_generators_[std::distance(
                accumulated_rates.cbegin(), i)]->perform_event(state, *i - r);
    }
}
예제 #3
0
const StateModifications GameObject::act(const std::vector<GameObject*> &collisions) {
	return StateModifications();
}
예제 #4
0
const StateModifications AIPlayer::driveRaceCar(RaceCar &raceCar, const std::vector<Tile*> &tileCollisions, const std::vector<Body*> &bodyCollisions) {
	StateModifications stateModifications = StateModifications();
	raceCar.setForce(Zeni::Vector2f(0.0f, 0.0f));
	raceCar.setWheelRotation(0);
	raceCar.setBraking(false);
	raceCar.accelerate(1.0);

	/*if (Input::isKeyDown(SDLK_DOWN)) {
		accelerate(-1.0);
		if (isMovingInDirection(getRotation())) {
			setBraking(true);
		}
	}*/
	int waypoint = raceCar.getPassedWaypoints().size()%m_navigationMaps.size();
	Level::waypoint = waypoint; // TODO: Remove or move/hide debug functionality
	double suggestedDirection = m_navigationMaps[waypoint].getSuggestedDirectionAtPosition(raceCar.getCenter()+raceCar.getVelocity()*m_lookAheadTime, m_directionSmoothing);
	double angleDifference = Utils::getAngleDifference(suggestedDirection, raceCar.getRotation());
	if (angleDifference < -raceCar.m_maximumWheelRotation) {
		angleDifference = -raceCar.m_maximumWheelRotation;
	}
	if (angleDifference > raceCar.m_maximumWheelRotation) {
		angleDifference = raceCar.m_maximumWheelRotation;
	}
	raceCar.setWheelRotation(angleDifference);

	for (int i=0; i < bodyCollisions.size(); i++) {
		RaceCar * car = dynamic_cast<RaceCar*>(bodyCollisions[i]);
		if (car != nullptr) {
			m_fireRocket = false;
			m_layMine = false;
		}
	}

	if (m_offensive && m_fireRocket == true) {
		m_rocketTimer = Time::getGameTime();
		Body * rocket = raceCar.fireRocket();
		if (rocket != nullptr) {
			stateModifications.bodyAdditions.push_back(rocket);
		}
		m_fireRocket = false;
	}

	if (m_offensive && m_layMine == true) {
		m_mineTimer = Time::getGameTime();
		Body * mine = raceCar.layMine();
		if (mine != nullptr) {
			stateModifications.bodyAdditions.push_back(mine);
		}
		m_layMine = false;
	}

	/*if (Input::isKeyDown(SDLK_q)) {
		for (std::vector<Tile*>::const_iterator it = tileCollisions.begin(); it != tileCollisions.end(); it++) {
			Tile newTile = Tile((*it)->getPosition(), (*it)->getSize(), Zeni::String("grass"));
			stateModifications.tileChanges.push_back(newTile);
		}
	}*/

	if (raceCar.getHealth().remaining == 0) {
		raceCar.respawn();
	}

	return stateModifications;
}
예제 #5
0
// Causes the actor to take an action.
const StateModifications Actor::run(const std::vector<Tile*> &tileCollisions, const std::vector<Body*> &bodyCollisions) {
	StateModifications sm = StateModifications();
	sm.bodyAdditions.push_back(new Body());
	return sm;
}