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(); }
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(); }
void BallManager::DestroyBall(Ball* ball) { DestroyBall(find(begin(_balls), end(_balls), ball) - begin(_balls)); }