diff options
Diffstat (limited to 'game/player/PlayerScript.cpp')
-rw-r--r-- | game/player/PlayerScript.cpp | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/game/player/PlayerScript.cpp b/game/player/PlayerScript.cpp index fadca9c..c3843ca 100644 --- a/game/player/PlayerScript.cpp +++ b/game/player/PlayerScript.cpp @@ -18,8 +18,38 @@ 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) { + const vec2 UP = {0, -1}; + this->help_kick(UP); + return false; +} + +bool PlayerScript::on_key_up(const KeyReleaseEvent & ev) { + 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 +124,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 +135,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; @@ -127,7 +160,7 @@ void PlayerScript::fixed_update(crepe::duration_t dt) { current_jetpack_sound = 0; } } else if (transform.position.y == 195) { - Rigidbody & rb = this->get_components_by_name<Rigidbody>("player").front(); + Rigidbody & rb = this->body; if (prev_anim != 0 && rb.data.linear_velocity.x != 0) { for (Animator & anim : animators) { anim.active = true; |