void GameOverState::AdvanceFrame(int delta_time, int* next_state) { world_->entity_manager.UpdateComponents(delta_time); UpdateMainCamera(&main_camera_, world_); // Return to the title screen after any key is hit. static const corgi::WorldTime kMinTimeInEndState = static_cast<corgi::WorldTime>(8000.0f); const bool event_over = world_->patron_component.event_time() > kMinTimeInEndState; const bool pointer_button_pressed = input_system_->GetPointerButton(0).went_down(); const bool exit_button_pressed = input_system_->GetButton(fplbase::FPLK_ESCAPE).went_down() || input_system_->GetButton(fplbase::FPLK_AC_BACK).went_down(); auto player = world_->player_component.begin()->entity; auto player_data = world_->entity_manager.GetComponentData<PlayerData>(player); const bool fire_button_pressed = player_data->input_controller()->Button(kFireProjectile).Value() && player_data->input_controller()->Button(kFireProjectile).HasChanged(); if (event_over && (pointer_button_pressed || exit_button_pressed || fire_button_pressed)) { audio_engine_->PlaySound(sound_click_); // Stay in Cardboard unless the back button is pressed. *next_state = world_->is_in_cardboard() && !exit_button_pressed ? kGameStateGameplay : kGameStateGameMenu; } }
void IntroState::OnEnter(int /*previous_state*/) { world_->player_component.set_state(kPlayerState_Active); UpdateMainCamera(&main_camera_, world_); #ifdef ANDROID_HMD input_system_->head_mounted_display_input().ResetHeadTracker(); #endif // ANDROID_HMD // Move the player inside the intro box. auto player = world_->player_component.begin()->entity; auto player_transform = world_->entity_manager.GetComponentData<TransformData>(player); // TODO(proppy): get position of the introbox entity player_transform->position += mathfu::vec3(0, 0, 500); fade_timer_ = kFadeTimerPending; SetBoxVisibility(true); master_bus_.FadeTo(0.0f, kFadeWaitTime / 1000.0f); }
void GameplayState::OnEnter(int previous_state) { requested_state_ = kGameStateGameplay; world_->player_component.set_state(kPlayerState_Active); input_system_->SetRelativeMouseMode(true); UpdateMainCamera(&main_camera_, world_); // Assign textures for the onscreen controller. auto* onscreen_controller_ui = &world_->onscreen_controller_ui; auto* asset_manager = world_->asset_manager; onscreen_controller_ui->set_base_texture( asset_manager->FindTexture("textures/joystick_base.webp")); onscreen_controller_ui->set_top_texture( asset_manager->FindTexture("textures/joystick_tip.webp")); if (previous_state == kGameStatePause) { music_channel_lap_1_.Resume(); music_channel_lap_2_.Resume(); music_channel_lap_3_.Resume(); } else { music_channel_lap_1_ = audio_engine_->PlaySound(music_gameplay_lap_1_, mathfu::kZeros3f, 1.0f); music_channel_lap_2_ = audio_engine_->PlaySound(music_gameplay_lap_2_, mathfu::kZeros3f, 0.0f); music_channel_lap_3_ = audio_engine_->PlaySound(music_gameplay_lap_3_, mathfu::kZeros3f, 0.0f); } if (world_->rendering_mode() == kRenderingStereoscopic) { #if FPLBASE_ANDROID_VR world_->services_component.set_camera(&cardboard_camera_); #endif } else { world_->services_component.set_camera(&main_camera_); } #if FPLBASE_ANDROID_VR input_system_->head_mounted_display_input().ResetHeadTracker(); #endif // FPLBASE_ANDROID_VR // Perform Analytics if (previous_state != kGameStatePause) { // Set the start time, so elapsed time can be tracked. world_->gameplay_start_time = input_system_->Time(); firebase::analytics::LogEvent(kEventGameplayStart, kParameterControlScheme, AnalyticsControlValue(world_)); } }
// Gameplay Screen Update logic void UpdateGameplayScreen(void) { if (IsKeyPressed('P')) { pause = !pause; if (!pause) ResumeMusicStream(); else PauseMusicStream(); } if (!pause) { if (!startGame && IsKeyPressed(KEY_SPACE)) { startGame = TRUE; ResumeMusicStream(); } // TODO: Update GAMEPLAY screen variables here! if (startGame) { UpdateMainCamera(&mainCamera); UpdateTrianglesPosition(mainCamera.position); UpdateTrianglesState(); UpdatePlatformsPosition(mainCamera.position); UpdatePlatformsState(); UpdatePlayer(&player); } } // Press enter to change to ENDING screen /* if (IsKeyPressed(KEY_ENTER) || !player.isAlive || mainCamera.position.x/CELL_SIZE>GRID_WIDTH+10) { finishScreen = 1; } */ // WIN / LOSE Conditions if (!player.isAlive) GameplayEnd(1); // If player dies, reset gameplay screen else if (mainCamera.position.x/CELL_SIZE>GRID_WIDTH+20) GameplayEnd(2); // If player reaches the end level (+20 cells) game ends. // MusicIsPlaying UpdateMusicStream(); }
void IntroState::AdvanceFrame(int delta_time, int* next_state) { // Update components so that the player can throw sushi. world_->entity_manager.UpdateComponents(delta_time); // Update camera so that the player can look around. UpdateMainCamera(&main_camera_, world_); auto player = world_->player_component.begin()->entity; auto player_data = world_->entity_manager.GetComponentData<PlayerData>(player); // Start countdown timer before we fade to game. if (player_data->input_controller()->Button(kFireProjectile).Value() && player_data->input_controller()->Button(kFireProjectile).HasChanged() && fade_timer_ == kFadeTimerPending) { fade_timer_ = kFadeWaitTime; } // Fade to game. if (fade_timer_ <= 0) { fader_->Start(kIntroStateFadeTransitionDuration, mathfu::kZeros3f, kFadeOutThenIn, vec3(-1.0f, 1.0f, 0.0f), vec3(1.0f, -1.0f, 0.0f)); fade_timer_ = kFadeTimerComplete; } // Update the fade timer, if it's active. if (fade_timer_ != kFadeTimerPending && fade_timer_ != kFadeTimerComplete) { fade_timer_ -= delta_time; } // Go back to menu. if (input_system_->GetButton(fplbase::FPLK_ESCAPE).went_down() || input_system_->GetButton(fplbase::FPLK_AC_BACK).went_down()) { *next_state = kGameStateGameMenu; } if (fader_->AdvanceFrame(delta_time)) { SetBoxVisibility(false); // Enter the game. *next_state = kGameStateGameplay; } }
void GameplayState::AdvanceFrame(int delta_time, int* next_state) { // Update the world. world_->entity_manager.UpdateComponents(delta_time); UpdateMainCamera(&main_camera_, world_); UpdateMusic(&world_->entity_manager, &previous_lap_, &percent_, delta_time, &music_channel_lap_1_, &music_channel_lap_2_, &music_channel_lap_3_); if (input_system_->GetButton(fplbase::FPLK_F9).went_down()) { world_->draw_debug_physics = !world_->draw_debug_physics; } if (input_system_->GetButton(fplbase::FPLK_F8).went_down()) { world_->skip_rendermesh_rendering = !world_->skip_rendermesh_rendering; } // The state machine for the world may request a state change. *next_state = requested_state_; // Switch into scene lab if the keyboard requests. // Switch back to scene lab if we're single stepping. if (scene_lab_ && (input_system_->GetButton(fplbase::FPLK_F10).went_down() || input_system_->GetButton(fplbase::FPLK_1).went_down() || world_->is_single_stepping)) { if (!world_->is_single_stepping) { scene_lab::GenericCamera camera; camera.position = main_camera_.position(); camera.facing = main_camera_.facing(); camera.up = main_camera_.up(); scene_lab_->SetInitialCamera(camera); } *next_state = kGameStateSceneLab; world_->is_single_stepping = false; } // Pause the game. if (input_system_->GetButton(fplbase::FPLK_ESCAPE).went_down() || input_system_->GetButton(fplbase::FPLK_AC_BACK).went_down()) { audio_engine_->PlaySound(sound_pause_); *next_state = kGameStatePause; } fader_->AdvanceFrame(delta_time); }
void GameOverState::OnEnter(int /*previous_state*/) { world_->player_component.set_state(kPlayerState_NoProjectiles); UpdateMainCamera(&main_camera_, world_); // Stop the raft over the course of a few seconds. corgi::EntityRef raft = world_->services_component.raft_entity(); RailDenizenData* raft_rail_denizen = world_->rail_denizen_component.GetComponentData(raft); raft_rail_denizen->SetPlaybackRate(0.0f, kTimeToStopRaft); // Trigger the end-game event. static const corgi::WorldTime kEndGameEventTime = 0; world_->patron_component.StartEvent(kEndGameEventTime); bool high_score = false; #ifdef USING_GOOGLE_PLAY_GAMES if (gpg_manager_->LoggedIn()) { // Finished a game, post a score. auto player = world_->player_component.begin()->entity; auto attribute_data = world_->entity_manager.GetComponentData<AttributesData>(player); auto score = attribute_data->attributes[AttributeDef_PatronsFed]; auto leaderboard_config = config_->gpg_config()->leaderboards(); std::string leaderboard_id = leaderboard_config->LookupByKey(kGPGDefaultLeaderboard)->id()->c_str(); // Check if we have a new high score. high_score = score > gpg_manager_->CurrentPlayerHighScore(leaderboard_id); // Submit score. gpg_manager_->SubmitScore(leaderboard_id, score); } #endif if (high_score) { game_over_channel_ = audio_engine_->PlaySound(sound_high_score_); } else { game_over_channel_ = audio_engine_->PlaySound(sound_game_over_); } }