aboutsummaryrefslogtreecommitdiff
path: root/game/player
diff options
context:
space:
mode:
Diffstat (limited to 'game/player')
-rw-r--r--game/player/PlayerBulletScript.cpp2
-rw-r--r--game/player/PlayerBulletSubScene.cpp4
-rw-r--r--game/player/PlayerEndScript.cpp3
-rw-r--r--game/player/PlayerScript.cpp45
-rw-r--r--game/player/PlayerScript.h12
-rw-r--r--game/player/PlayerSubScene.cpp32
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;