diff options
Diffstat (limited to 'game/player')
-rw-r--r-- | game/player/PlayerBulletScript.cpp | 2 | ||||
-rw-r--r-- | game/player/PlayerBulletSubScene.cpp | 4 | ||||
-rw-r--r-- | game/player/PlayerEndScript.cpp | 3 | ||||
-rw-r--r-- | game/player/PlayerScript.cpp | 45 | ||||
-rw-r--r-- | game/player/PlayerScript.h | 12 | ||||
-rw-r--r-- | game/player/PlayerSubScene.cpp | 32 |
6 files changed, 82 insertions, 16 deletions
diff --git a/game/player/PlayerBulletScript.cpp b/game/player/PlayerBulletScript.cpp index a76b7eb..a823375 100644 --- a/game/player/PlayerBulletScript.cpp +++ b/game/player/PlayerBulletScript.cpp @@ -17,7 +17,7 @@ void PlayerBulletScript::fixed_update(crepe::duration_t dt) { Camera & camera = this->get_components_by_name<Camera>("camera").front(); Transform & cam_transform = this->get_components_by_name<Transform>("camera").front(); Rigidbody & bullet_body = this->get_component<Rigidbody>(); - transform.rotation += bullet_body.data.angular_velocity; + transform.rotation += bullet_body.data.angular_velocity * dt.count(); transform.position += bullet_body.data.linear_velocity * dt.count(); vec2 half_screen = camera.viewport_size / 2; float despawn_location = cam_transform.position.x + half_screen.x + 50; diff --git a/game/player/PlayerBulletSubScene.cpp b/game/player/PlayerBulletSubScene.cpp index 795747b..82ce4a9 100644 --- a/game/player/PlayerBulletSubScene.cpp +++ b/game/player/PlayerBulletSubScene.cpp @@ -24,8 +24,8 @@ int PlayerBulletSubScene::create(Scene & scn, int counter) { Rigidbody & player_bullet_body = player_bullet.add_component<Rigidbody>(Rigidbody::Data { .gravity_scale = 0, .body_type = Rigidbody::BodyType::KINEMATIC, - .linear_velocity = vec2 {400, 0}, - .angular_velocity = 10, + .linear_velocity = vec2 {450, 0}, + .angular_velocity = 300, .kinematic_collision = false, .collision_layers = {COLL_LAY_ENEMY, COLL_LAY_ZAPPER}, diff --git a/game/player/PlayerEndScript.cpp b/game/player/PlayerEndScript.cpp index 4ae813f..62fd350 100644 --- a/game/player/PlayerEndScript.cpp +++ b/game/player/PlayerEndScript.cpp @@ -92,8 +92,9 @@ bool PlayerEndScript::on_collision(const crepe::CollisionEvent & ev) { jump++; } - if (rb_player.data.linear_velocity.x < 5 && jump >= 3) { + if (rb_player.data.linear_velocity.x < 5 && jump == 3) { this->trigger_event<EndGameEvent>(); + jump++; } return false; diff --git a/game/player/PlayerScript.cpp b/game/player/PlayerScript.cpp index fadca9c..8cbe8dc 100644 --- a/game/player/PlayerScript.cpp +++ b/game/player/PlayerScript.cpp @@ -18,8 +18,42 @@ void PlayerScript::init() { subscribe<CollisionEvent>([this](const CollisionEvent & ev) -> bool { return this->on_collision(ev); }); + subscribe<KeyPressEvent>([this](const KeyPressEvent & ev) -> bool { + if (ev.repeat) return false; + return this->on_key_down(ev); + }); + subscribe<KeyReleaseEvent>([this](const KeyReleaseEvent & ev) -> bool { + return this->on_key_up(ev); + }); this->last_fired = std::chrono::steady_clock::now(); + this->body = get_component<Rigidbody>(); +} + +bool PlayerScript::on_key_down(const KeyPressEvent & ev) { + if (ev.key == Keycode::SPACE) { + const vec2 UP = {0, -1}; + this->help_kick(UP); + } + return false; } + +bool PlayerScript::on_key_up(const KeyReleaseEvent & ev) { + if (ev.key == Keycode::SPACE) { + const vec2 DOWN = {0, 1}; + this->help_kick(DOWN); + } + return false; +} + +void PlayerScript::help_kick(const vec2 & direction) { + // softly "kick" the player (at start/end of flight) + vec2 & velocity = this->body->data.linear_velocity; + float kick_amount = std::min( + velocity.length() * PLAYER_HELP_KICK_SCALE, engine_gravity * PLAYER_HELP_KICK_MAX + ); + velocity += direction * kick_amount; +} + bool PlayerScript::on_collision(const CollisionEvent & ev) { BehaviorScript & play_scr = this->get_components_by_name<BehaviorScript>("player").front(); BehaviorScript & end_scr = this->get_components_by_name<BehaviorScript>("player").back(); @@ -94,7 +128,7 @@ void PlayerScript::fixed_update(crepe::duration_t dt) { emitter.data.boundary.offset = vec2(0, -transform.position.y); } - Rigidbody & rb = this->get_components_by_name<Rigidbody>("player").front(); + Rigidbody & rb = this->body; if (this->get_key_state(Keycode::ENTER)) { auto now = std::chrono::steady_clock::now(); @@ -105,7 +139,10 @@ void PlayerScript::fixed_update(crepe::duration_t dt) { } } if (this->get_key_state(Keycode::SPACE)) { - rb.add_force_linear(vec2(0, -PLAYER_GRAVITY_SCALE / 2.5) * dt.count() / 0.02); + rb.add_force_linear( + vec2(0, -1) * (engine_gravity * PLAYER_GRAVITY_SCALE * dt.count()) + ); + if (prev_anim != 1) { for (Animator & anim : animators) { anim.active = true; @@ -126,8 +163,8 @@ void PlayerScript::fixed_update(crepe::duration_t dt) { if (current_jetpack_sound > 7) { current_jetpack_sound = 0; } - } else if (transform.position.y == 195) { - Rigidbody & rb = this->get_components_by_name<Rigidbody>("player").front(); + } else if (transform.position.y == 200) { + Rigidbody & rb = this->body; if (prev_anim != 0 && rb.data.linear_velocity.x != 0) { for (Animator & anim : animators) { anim.active = true; diff --git a/game/player/PlayerScript.h b/game/player/PlayerScript.h index e7d860a..6a7dedb 100644 --- a/game/player/PlayerScript.h +++ b/game/player/PlayerScript.h @@ -1,8 +1,11 @@ #pragma once +#include "util/OptionalRef.h" #include <chrono> +#include <crepe/api/Config.h> #include <crepe/api/Event.h> #include <crepe/api/Script.h> + class PlayerScript : public crepe::Script { public: void init(); @@ -10,13 +13,20 @@ public: private: bool on_collision(const crepe::CollisionEvent & ev); + bool on_key_down(const crepe::KeyPressEvent & ev); + bool on_key_up(const crepe::KeyReleaseEvent & ev); // bool on_key_up(const crepe::KeyReleaseEvent& ev); void shoot(const crepe::vec2 & location, float angle); + void help_kick(const crepe::vec2 & direction); private: int prev_anim = 0; std::chrono::time_point<std::chrono::steady_clock> last_fired; + std::chrono::time_point<std::chrono::steady_clock> last_switched; std::chrono::duration<float> shot_delay = std::chrono::duration<float>(0.5); - + std::chrono::duration<float> switch_delay = std::chrono::duration<float>(0.01); int current_jetpack_sound = 0; + + float & engine_gravity = crepe::Config::get_instance().physics.gravity; + crepe::OptionalRef<crepe::Rigidbody> body; }; diff --git a/game/player/PlayerSubScene.cpp b/game/player/PlayerSubScene.cpp index c4d689a..d0142e0 100644 --- a/game/player/PlayerSubScene.cpp +++ b/game/player/PlayerSubScene.cpp @@ -5,8 +5,8 @@ #include "../Config.h" #include "../coins/CoinScript.h" -#include "api/Asset.h" +#include <crepe/ValueBroker.h> #include <crepe/api/Animator.h> #include <crepe/api/AudioSource.h> #include <crepe/api/BoxCollider.h> @@ -16,6 +16,7 @@ #include <crepe/api/Scene.h> #include <crepe/api/Script.h> #include <crepe/api/Sprite.h> +#include <crepe/manager/SaveManager.h> #include <crepe/types.h> using namespace crepe; @@ -24,7 +25,23 @@ using namespace std; PlayerSubScene::PlayerSubScene(Scene & scn) { GameObject player = scn.new_object("player", "player", vec2(-100, 200)); - Asset player_bullet {"asset/other_effects/effect_smgbullet.png"}; + SaveManager & save = scn.get_save_manager(); + ValueBroker<int> particle_type = save.get<int>(JETPACK_PARTICLES, 0); + + string player_bullet_string; + string player_bullet_x2_string; + string player_shell_string; + if (particle_type.get() == 0) { + player_bullet_string = "asset/other_effects/effect_smgbullet.png"; + player_bullet_x2_string = "asset/other_effects/effect_smgbullet_x2.png"; + player_shell_string = "asset/other_effects/effect_rocketmgshell_TVOS.png"; + } else { + player_bullet_string = "asset/background/aquarium/bubble.png"; + player_bullet_x2_string = "asset/background/aquarium/bubble.png"; + player_shell_string = "asset/background/aquarium/bubble.png"; + } + + Asset player_bullet {player_bullet_string}; Sprite & player_bullet_sprite = player.add_component<Sprite>( player_bullet, Sprite::Data { @@ -45,7 +62,7 @@ PlayerSubScene::PlayerSubScene(Scene & scn) { .reset_on_exit = true, }, }); - Asset player_bullet_x2 {"asset/other_effects/effect_smgbullet_x2.png"}; + Asset player_bullet_x2 {player_bullet_x2_string}; Sprite & player_bullet_x2_sprite = player.add_component<Sprite>( player_bullet_x2, Sprite::Data { @@ -66,7 +83,7 @@ PlayerSubScene::PlayerSubScene(Scene & scn) { .reset_on_exit = true, }, }); - Asset player_shell {"asset/other_effects/effect_rocketmgshell_TVOS.png"}; + Asset player_shell {player_shell_string}; Sprite & player_shell_sprite = player.add_component<Sprite>( player_shell, Sprite::Data { @@ -106,7 +123,7 @@ PlayerSubScene::PlayerSubScene(Scene & scn) { .looping = true, } ); - player.add_component<BoxCollider>(vec2(50, 50)); + player.add_component<BoxCollider>(vec2(50, 35)); Asset player_head_asset {"asset/barry/defaultHead.png"}; Sprite & player_head_sprite = player.add_component<Sprite>( player_head_asset, @@ -143,9 +160,9 @@ PlayerSubScene::PlayerSubScene(Scene & scn) { .looping = true, } ); - player.add_component<BoxCollider>(vec2(40, 60), vec2(-20, 0)); + player.add_component<BoxCollider>(vec2(40, 50), vec2(-20, 0)); player.add_component<Rigidbody>(Rigidbody::Data { - .gravity_scale = PLAYER_GRAVITY_SCALE, + .gravity_scale = 1.0, .body_type = Rigidbody::BodyType::DYNAMIC, .linear_velocity = vec2(PLAYER_SPEED * 0.02, 0), .collision_layers @@ -153,6 +170,7 @@ PlayerSubScene::PlayerSubScene(Scene & scn) { }, .collision_layer = COLL_LAY_PLAYER, }); + player.add_component<BehaviorScript>().set_script<PlayerScript>().active = false; player.add_component<BehaviorScript>().set_script<CoinScript>(); player.add_component<BehaviorScript>().set_script<PlayerEndScript>().active = false; |