#include "GameScene.h" #include "Background.h" #include "api/Animator.h" #include "api/Asset.h" #include "api/BoxCollider.h" #include "api/Transform.h" #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; 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; }; class PlayerScript : 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::SPACE) { Rigidbody & rb = this->get_components_by_name("player").front(); rb.add_force_linear(vec2(0, -10)); return true; } return false; } }; void GameScene::load_scene() { Background 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{ .linear_velocity = vec2(0, 0), }); GameObject player = new_object("player", "player", vec2(-100, 200)); Asset player_body_asset{"asset/jetpack_joyride/barry/defaultBody.png"}; Sprite & player_body_sprite = player.add_component(player_body_asset, Sprite::Data{ .sorting_in_layer = 10, .order_in_layer = 0, .size = vec2(0, 50), }); player.add_component(player_body_sprite, ivec2(32, 32), uvec2(4, 8), Animator::Data{ .fps = 5, .looping = true, }); Asset player_head_asset{"asset/jetpack_joyride/barry/defaultHead.png"}; Sprite & player_head_sprite = player.add_component(player_head_asset, Sprite::Data{ .sorting_in_layer = 10, .order_in_layer = 1, .size = vec2(0, 50), .position_offset = vec2(0, -20), }); player.add_component(player_head_sprite, ivec2(32, 32), uvec2(4, 8), Animator::Data{ .fps = 5, .looping = true, }); Asset player_jetpack_asset{"asset/jetpack_joyride/barry/jetpackDefault.png"}; Sprite & player_jetpack_sprite = player.add_component( player_jetpack_asset, Sprite::Data{ .sorting_in_layer = 10, .order_in_layer = 2, .size = vec2(0, 60), .position_offset = vec2(-20, 0), }); player_jetpack_sprite.active = false; player.add_component(player_jetpack_sprite, ivec2(32, 44), uvec2(4, 4), Animator::Data{ .fps = 5, .looping = true, }); player.add_component(Rigidbody::Data{ .gravity_scale = 10, .body_type = Rigidbody::BodyType::DYNAMIC, .linear_velocity = vec2(100, 0), }); player.add_component(vec2(50, 50)); player.add_component().set_script().active = false; 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"; }