Beispiel #1
0
void Scene2Controller::Update() {
  model_.dialogue.Update();
  UpdateRackets();
  model_.world.Step(delta_time * 0.5, box2d_velocity_iterations, box2d_position_iterations);
  if (model_.score >= max_balls_goal) {
    scene_manager.NextScene();
    return;
  }
  model_.score = 0.0;
  model_.inverse_score = 0.0;
  for (auto ball : model_.ball_body) {
    if (ball->GetPosition().x > 0 && ball->GetLinearVelocity().Length() < 5.0) {
      model_.score += 1.0;
    }
    if (ball->GetPosition().x < 0 && ball->GetLinearVelocity().Length() < 5.0) {
      model_.inverse_score += 1.0;
    }
  }
  if (ofGetElapsedTimef() > scene_begin_time + 8.0 && ofGetFrameNum() % 1 == 0 && model_.ball_body.size() < max_balls) {
    const ofVec2f position = ball_initial_position.GetValue() + ofVec2f(-ofNoise(-1.7 * ofGetElapsedTimef()),
                                                                        ofSignedNoise(1.3 * ofGetElapsedTimef()));
    const ofVec2f velocity = ball_initial_velocity.GetValue()
        .rotated(-15.0 + ofSignedNoise(ofGetElapsedTimef()) * 30.0) * (1.0 + 0.1 * ofSignedNoise(1.3 * ofGetElapsedTimef()));
    CreateBall(position, velocity, 0.0, angular_velocity * ofRandomf());
    if (model_.ball_body.size() > max_balls) {
      b2Body *const body = model_.ball_body.front();
      DestroyBall(body);
      model_.ball_body.pop_front();
    }
  }
  if (keys[OF_KEY_BACKSPACE] && !previous_keys[OF_KEY_BACKSPACE]) {
    if (model_.ball_body.size() > 0) {
      b2Body *const body = model_.ball_body.front();
      DestroyBall(body);
      model_.ball_body.pop_front();
    }
  }
  Controller::Update();
}
Beispiel #2
0
void Scene3Controller::Update() {
  model_.dialogue.Update();
  if (model_.score >= 10) {
    model_.outro += 1.0 / 60.0 / 2.6;
  }
  if (model_.outro >= 1.0) {
    scene_manager.NextScene();
    return;
  }
  if (model_.bounces >= ((model_.opponent_index == 5) ? 8 : 2)) {
    DestroyBall(model_.ball_body);
    model_.ball_body = nullptr;
    model_.bounces = 0;
  }
  if (model_.opponent_index != 2 && model_.extra_balls.size()) {
    for (auto ball : model_.extra_balls) {
      model_.world.DestroyBody(ball);
    }
    model_.extra_balls.clear();
  }
  UpdateRackets();
  model_.world.Step(model_.time_slowed ? 0.1 * delta_time : delta_time, box2d_velocity_iterations, box2d_position_iterations);

  for (std::vector<Scene3Model::Particle>::iterator particle = model_.particles.begin(); particle != model_.particles.end(); ++particle) {
    particle->angle += particle->angular_velocity * delta_time;
    particle->position += particle->velocity * delta_time;
    particle->velocity += -ofVec2f(0.0, 0.5) * delta_time;
    particle->life -= 1.0 / 60.0 / 8.0;
  }
  model_.particles.erase(std::remove_if(model_.particles.begin(), model_.particles.end(), [] (Scene3Model::Particle &particle) -> bool {
    return particle.life <= 0.0;
  }), model_.particles.end());
  
  if (model_.ball_trail.size() > ball_trail_length_scholar || (model_.opponent_index != 7 && model_.ball_trail.size() >  0)) {
    model_.ball_trail.pop_front();
  }
  if (model_.ball_body && model_.opponent_index == 7) {
    Scene3Model::Trail trail;
    trail.position = OpenFrameworksVector(model_.ball_body->GetPosition());
    trail.text = nullptr;
    model_.ball_trail.push_back(trail);
  }
  if (model_.ball_in_play && !model_.ball_body) {
    CreateBall(ofVec2f(0.377 * half_court_length, court_height), ofVec2f(0, 0), 0.0, -ofRandomuf() * angular_velocity);
    if (model_.opponent_index == 8) {
      model_.ball_body->GetFixtureList()->SetRestitution(0.0);
    }
    if (!(model_.opponent_index == 9 && model_.mirror_score > 0)) {
      model_.opponent = model_.opponent_target = ofVec2f(half_court_length, racket_radius + court_thickness);
    }
  }
  if (keys[OF_KEY_BACKSPACE] && !previous_keys[OF_KEY_BACKSPACE]) {
    if (model_.ball_body) {
      DestroyBall(model_.ball_body);
      model_.ball_body = nullptr;
    }
  }
  if (model_.angle <= 180.0 - 180.0 / 60.0 / 2.0) {
    model_.angle += 180.0 / 60.0 / 2.0;
  }
  if (model_.glass_hits == 2 && model_.glass <= 1.0 - 1.0 / 60.0) {
    model_.glass += 1.0 / 60.0;
  }
  if (model_.glass_hits > 2 && model_.glass <= 1.0 - 1.0 / 60.0) {
    model_.glass += 1.0 / 60.0;
  }
  if (model_.opponent_index == 7 && model_.nerd_energy >= 1.0 / 60.0 / 30.0) {
    model_.nerd_energy -= 1.0 / 60.0 / 30.0;
  }
  Controller::Update();
}