#include "GameScene.h" #include "BackgroundSubScene.h" #include "PlayerSubScene.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace crepe; using namespace std; class MoveCameraScript : public Script { public: void init() { subscribe( [this](const KeyPressEvent & ev) -> bool { return this->keypressed(ev); }); } private: bool keypressed(const KeyPressEvent & event) { if (event.key == Keycode::RIGHT) { Transform & cam = this->get_components_by_name("camera").front(); cam.position.x += 100; return true; } else if (event.key == Keycode::LEFT) { Transform & cam = this->get_components_by_name("camera").front(); cam.position.x -= 100; return true; } return false; } }; class StartGameScript : public Script { public: void update() { Transform & player_transform = this->get_components_by_name("player").front(); // Create hole in wall and activate panic lamp if (player_transform.position.x > 75 && !this->created_hole) { Sprite & lamp_sprite = this->get_components_by_name("start_end").back(); lamp_sprite.active = true; Sprite & hole_sprite = this->get_components_by_name("start_hole").front(); hole_sprite.active = true; RefVector frags_rg = this->get_components_by_tag("wall_fragment"); RefVector frags_sprite = this->get_components_by_tag("wall_fragment"); for (Rigidbody & frag_rg : frags_rg) { frag_rg.active = true; } for (Sprite & frag_sprite : frags_sprite) { frag_sprite.active = true; } RefVector smoke_emitters = this->get_components_by_name("smoke_particles"); for (ParticleEmitter & emitter : smoke_emitters) { emitter.active = true; } this->created_hole = true; } // Take jetpack from jetpack stand if (player_transform.position.x > 275 && !this->took_jetpack) { Animator & jetpack_stand_anim = this->get_components_by_name("start_begin").back(); jetpack_stand_anim.next_anim(); Sprite & jetpack_sprite = this->get_components_by_name("player").back(); jetpack_sprite.active = true; this->took_jetpack = true; } // Start camera movement, enable player jumping and disable this script if (player_transform.position.x > 500) { Rigidbody & rb = this->get_components_by_name("camera").front(); rb.data.linear_velocity = vec2(100, 0); BehaviorScript & player_script = this->get_components_by_name("player").front(); player_script.active = true; BehaviorScript & this_script = this->get_components_by_name("start_game_script").front(); this_script.active = false; } } private: bool created_hole = false; bool took_jetpack = false; }; void GameScene::load_scene() { BackgroundSubScene background(*this); GameObject camera = new_object("camera", "camera", vec2(650, 0)); camera.add_component(ivec2(990, 720), vec2(1100, 800), Camera::Data{ .bg_color = Color::RED, }); camera.add_component().set_script(); camera.add_component(Rigidbody::Data{}); PlayerSubScene player(*this); GameObject floor = new_object("floor", "game_world", vec2(0, 325)); floor.add_component(Rigidbody::Data{ .body_type = Rigidbody::BodyType::STATIC, }); floor.add_component(vec2(INFINITY, 200)); GameObject ceiling = new_object("ceiling", "game_world", vec2(0, -325)); ceiling.add_component(Rigidbody::Data{ .body_type = Rigidbody::BodyType::STATIC, }); ceiling.add_component(vec2(INFINITY, 200)); GameObject start_game_script = new_object("start_game_script", "script", vec2(0, 0)); start_game_script.add_component().set_script(); } string GameScene::get_name() const { return "scene1"; }