예제 #1
0
void Animal::handleStimulus(Environment *environment, double dt) {
    voiceInterval -= dt;
    
    if (this == environment->getPlayer()) {
        Vector2D movement = environment->getMovement();
        movement = movement.mult(dt);
        translate(movement);
        handleCollisions(environment);
        environment->updateObjectScreen(this);
        
        if (movement.distanceTo(Vector2D()) > 1.0e-5) {
            addEnergy(-dt);
        }
        
        for (int i = 0; i < sensors.size(); i++) {
            sensors[i]->handleStimulus(this, environment, dt);
        }
    } else {
        RandomNumberGenerator *rng = RandomNumberGenerator::getInstance();
        if (curAIStateDuration > 0.0) {
            curAIStateDuration -= dt;
        } else {
            curAIStateDuration = ((double) rng->getInt(500, 3000)) / 1000.0;
            curAIDirection = Vector2D(rng->getInt(-1, 1), rng->getInt(-1, 1));
            curAIDirection = curAIDirection.mult(speed);
        }
        
        Vector2D movement = curAIDirection;
        movement = movement.mult(dt);
        translate(movement);
        handleCollisions(environment);
        environment->updateObjectScreen(this);
    }
}
예제 #2
0
Animal::Animal() : Object(OBJ_TYPE_ANIMAL) {
    energy = 80.0;
    speed = 80.0;
    
    if (!samplesInitialized) {
        for (int i = 0; i < 16; i++) {
            voiceSamples[i] = 0;
        }
        samplesInitialized = true;
    }
    
    voice = dna.getVoice();
    RandomNumberGenerator *rng = RandomNumberGenerator::getInstance();
    voiceInterval = ((double) rng->getInt(500, 5000)) / 1000.0;
    addSensor(dna.getSightSensor());
    addSensor(dna.getDigestiveSystem());
    addSensor(dna.getHearingSensor());
    addSensor(dna.getNervousSystem());
}
예제 #3
0
void Animal::resetVoiceInterval() {
    RandomNumberGenerator *rng = RandomNumberGenerator::getInstance();    
    voiceInterval = ((double) rng->getInt(500, 5000)) / 1000.0;    
}