diff options
Diffstat (limited to 'game/player')
-rw-r--r-- | game/player/PlayerAudioScript.cpp | 62 | ||||
-rw-r--r-- | game/player/PlayerAudioScript.h | 13 | ||||
-rw-r--r-- | game/player/PlayerBulletPool.cpp | 11 | ||||
-rw-r--r-- | game/player/PlayerBulletPool.h | 11 | ||||
-rw-r--r-- | game/player/PlayerBulletScript.cpp | 41 | ||||
-rw-r--r-- | game/player/PlayerBulletScript.h | 11 | ||||
-rw-r--r-- | game/player/PlayerBulletSubScene.cpp | 52 | ||||
-rw-r--r-- | game/player/PlayerBulletSubScene.h | 10 | ||||
-rw-r--r-- | game/player/PlayerEndScript.cpp | 104 | ||||
-rw-r--r-- | game/player/PlayerEndScript.h | 14 | ||||
-rw-r--r-- | game/player/PlayerScript.cpp | 214 | ||||
-rw-r--r-- | game/player/PlayerScript.h | 32 | ||||
-rw-r--r-- | game/player/PlayerSubScene.cpp | 222 | ||||
-rw-r--r-- | game/player/PlayerSubScene.h | 10 |
14 files changed, 807 insertions, 0 deletions
diff --git a/game/player/PlayerAudioScript.cpp b/game/player/PlayerAudioScript.cpp new file mode 100644 index 0000000..6b5f630 --- /dev/null +++ b/game/player/PlayerAudioScript.cpp @@ -0,0 +1,62 @@ +#include "PlayerAudioScript.h" + +#include <crepe/api/Animator.h> +#include <crepe/api/AudioSource.h> + +using namespace crepe; +using namespace std; + +void PlayerAudioScript::fixed_update(crepe::duration_t dt) { + Animator & animator = this->get_components_by_name<Animator>("player").front(); + + if (animator.data.col == 0) { + if (animator.data.row != this->last_row) { + if (animator.data.row == 0) { + // right footstep + if (current_footstep == 0) { + AudioSource & audio + = this->get_components_by_name<AudioSource>("player_audio").at(0); + audio.play(); + } else if (current_footstep == 1) { + AudioSource & audio + = this->get_components_by_name<AudioSource>("player_audio").at(2); + audio.play(); + } else if (current_footstep == 2) { + AudioSource & audio + = this->get_components_by_name<AudioSource>("player_audio").at(4); + audio.play(); + } else if (current_footstep == 3) { + AudioSource & audio + = this->get_components_by_name<AudioSource>("player_audio").at(6); + audio.play(); + } + } else if (animator.data.row == 2) { + // left footstep + if (current_footstep == 0) { + AudioSource & audio + = this->get_components_by_name<AudioSource>("player_audio").at(1); + audio.play(); + current_footstep = 1; + } else if (current_footstep == 1) { + AudioSource & audio + = this->get_components_by_name<AudioSource>("player_audio").at(3); + audio.play(); + current_footstep = 2; + } else if (current_footstep == 2) { + AudioSource & audio + = this->get_components_by_name<AudioSource>("player_audio").at(5); + audio.play(); + current_footstep = 3; + } else if (current_footstep == 3) { + AudioSource & audio + = this->get_components_by_name<AudioSource>("player_audio").at(7); + audio.play(); + current_footstep = 0; + } + } + this->last_row = animator.data.row; + } + } else { + this->last_row = -1; + } +} diff --git a/game/player/PlayerAudioScript.h b/game/player/PlayerAudioScript.h new file mode 100644 index 0000000..764cb20 --- /dev/null +++ b/game/player/PlayerAudioScript.h @@ -0,0 +1,13 @@ +#pragma once + +#include <crepe/api/Event.h> +#include <crepe/api/Script.h> + +class PlayerAudioScript : public crepe::Script { +public: + void fixed_update(crepe::duration_t dt); + +private: + int last_row = -1; + int current_footstep = 0; +}; diff --git a/game/player/PlayerBulletPool.cpp b/game/player/PlayerBulletPool.cpp new file mode 100644 index 0000000..5285ec8 --- /dev/null +++ b/game/player/PlayerBulletPool.cpp @@ -0,0 +1,11 @@ +#include "PlayerBulletPool.h" +#include "PlayerBulletSubScene.h" +using namespace std; + +void PlayerBulletPool::create_bullets(crepe::Scene & scn) { + PlayerBulletSubScene bullet; + int amount = 0; + while (amount < this->MAXIMUM_AMOUNT) { + amount = bullet.create(scn, amount); + } +} diff --git a/game/player/PlayerBulletPool.h b/game/player/PlayerBulletPool.h new file mode 100644 index 0000000..9618d54 --- /dev/null +++ b/game/player/PlayerBulletPool.h @@ -0,0 +1,11 @@ +#pragma once + +#include <crepe/api/Scene.h> + +class PlayerBulletPool { +public: + void create_bullets(crepe::Scene & scn); + +private: + static constexpr int MAXIMUM_AMOUNT = 20; +}; diff --git a/game/player/PlayerBulletScript.cpp b/game/player/PlayerBulletScript.cpp new file mode 100644 index 0000000..a823375 --- /dev/null +++ b/game/player/PlayerBulletScript.cpp @@ -0,0 +1,41 @@ + +#include <crepe/api/Camera.h> +#include <crepe/api/Metadata.h> +#include <crepe/api/Rigidbody.h> + +#include "PlayerBulletScript.h" + +using namespace crepe; +using namespace std; +void PlayerBulletScript::init() { + this->subscribe<CollisionEvent>([this](const CollisionEvent & e) -> bool { + return this->on_collide(e); + }); +} +void PlayerBulletScript::fixed_update(crepe::duration_t dt) { + Transform & transform = this->get_component<Transform>(); + 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 * 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; + if (transform.position.x > despawn_location) { + this->despawn_bullet(); + } +} + +void PlayerBulletScript::despawn_bullet() { + Transform & transform = this->get_component<Transform>(); + Rigidbody & bullet_body = this->get_component<Rigidbody>(); + bullet_body.active = false; + BehaviorScript & bullet_script = this->get_component<BehaviorScript>(); + bullet_script.active = false; + transform.position = {0, -850}; +} + +bool PlayerBulletScript::on_collide(const CollisionEvent & e) { + this->despawn_bullet(); + return false; +} diff --git a/game/player/PlayerBulletScript.h b/game/player/PlayerBulletScript.h new file mode 100644 index 0000000..0637790 --- /dev/null +++ b/game/player/PlayerBulletScript.h @@ -0,0 +1,11 @@ +#pragma once +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/Script.h> + +class PlayerBulletScript : public crepe::Script { +public: + void init() override; + void fixed_update(crepe::duration_t dt) override; + bool on_collide(const crepe::CollisionEvent & e); + void despawn_bullet(); +}; diff --git a/game/player/PlayerBulletSubScene.cpp b/game/player/PlayerBulletSubScene.cpp new file mode 100644 index 0000000..82ce4a9 --- /dev/null +++ b/game/player/PlayerBulletSubScene.cpp @@ -0,0 +1,52 @@ +#include <string> + +#include "../Config.h" +#include <crepe/api/AI.h> +#include <crepe/api/Animator.h> +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/BoxCollider.h> +#include <crepe/api/CircleCollider.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/Rigidbody.h> +#include <crepe/api/Scene.h> +#include <crepe/api/Sprite.h> + +#include "PlayerBulletScript.h" +#include "PlayerBulletSubScene.h" +#include "PlayerScript.h" +using namespace crepe; +using namespace std; +int PlayerBulletSubScene::create(Scene & scn, int counter) { + string unique_name = "player_bullet_" + to_string(counter++); + GameObject player_bullet + = scn.new_object(unique_name.c_str(), "player_bullet", vec2 {0, -850}, 0, 1); + + Rigidbody & player_bullet_body = player_bullet.add_component<Rigidbody>(Rigidbody::Data { + .gravity_scale = 0, + .body_type = Rigidbody::BodyType::KINEMATIC, + .linear_velocity = vec2 {450, 0}, + .angular_velocity = 300, + .kinematic_collision = false, + .collision_layers = {COLL_LAY_ENEMY, COLL_LAY_ZAPPER}, + + .collision_layer = COLL_LAY_PLAYER_BULLET, + + }); + player_bullet_body.active = false; + BoxCollider & player_bullet_collider + = player_bullet.add_component<BoxCollider>(vec2(30, 30)); + + Asset player_bullet_asset {"asset/other_effects/crepe.png"}; + Sprite & player_bullet_sprite = player_bullet.add_component<Sprite>( + player_bullet_asset, + Sprite::Data { + .flip = {true, false}, + .sorting_in_layer = SORT_IN_LAY_OBSTACLES, + .order_in_layer = 1, + .size = vec2(30, 0), + } + ); + player_bullet.add_component<BehaviorScript>().set_script<PlayerBulletScript>().active + = false; + return counter; +} diff --git a/game/player/PlayerBulletSubScene.h b/game/player/PlayerBulletSubScene.h new file mode 100644 index 0000000..72eda62 --- /dev/null +++ b/game/player/PlayerBulletSubScene.h @@ -0,0 +1,10 @@ +#pragma once + +namespace crepe { +class Scene; +} + +class PlayerBulletSubScene { +public: + int create(crepe::Scene & scn, int counter); +}; diff --git a/game/player/PlayerEndScript.cpp b/game/player/PlayerEndScript.cpp new file mode 100644 index 0000000..62fd350 --- /dev/null +++ b/game/player/PlayerEndScript.cpp @@ -0,0 +1,104 @@ +#include "PlayerEndScript.h" + +#include "../Config.h" +#include "../Events.h" +#include "manager/LoopTimerManager.h" + +#include <crepe/api/Animator.h> +#include <crepe/api/BoxCollider.h> +#include <crepe/api/CircleCollider.h> +#include <crepe/api/Rigidbody.h> +#include <crepe/types.h> + +using namespace crepe; +using namespace std; + +void PlayerEndScript::init() { + Rigidbody & rb_player = this->get_components_by_name<Rigidbody>("player").front(); + rb_player.data.elasticity_coefficient = 0.7; + + subscribe<CollisionEvent>([this](const CollisionEvent & ev) -> bool { + return this->on_collision(ev); + }); +} + +bool PlayerEndScript::on_collision(const crepe::CollisionEvent & ev) { + if (ev.info.other.metadata.name == "floor") { + Transform & transform_player + = this->get_components_by_name<Transform>("player").front(); + RefVector<Animator> anim_player = this->get_components_by_name<Animator>("player"); + Rigidbody & rb_player = this->get_components_by_name<Rigidbody>("player").front(); + Rigidbody & rb_camera = this->get_components_by_name<Rigidbody>("camera").front(); + + float dt = this->get_loop_timer().get_fixed_delta_time().count(); + + if (jump == 0) { + int random_number = rand() % 4; + for (Animator & anim : anim_player) { + anim.active = false; + anim.set_anim(6); + for (int i = 0; i < random_number; i++) { + anim.next_anim(); + } + } + } else if (jump == 1) { + for (Animator & anim : anim_player) { + anim.next_anim(); + } + } + + if (jump == 0) { + rb_player.data.angular_velocity = 16000 * dt; + rb_player.data.angular_velocity_coefficient = 0.7; + jump++; + } else if (jump == 1) { + jump++; + } else if (jump == 2) { + RefVector<Rigidbody> rb_back_forest + = this->get_components_by_tag<Rigidbody>("forest_background"); + for (Rigidbody & rb : rb_back_forest) { + rb.data.linear_velocity_coefficient = vec2(0.5, 0.5); + } + + rb_player.data.angular_velocity = 0; + rb_player.data.elasticity_coefficient = 0; + if (rb_player.data.linear_velocity.x != 0) { + rb_player.data.linear_velocity = vec2(PLAYER_SPEED * dt, 0); + } + rb_player.data.linear_velocity_coefficient = vec2(0.5, 0.5); + rb_camera.data.linear_velocity_coefficient = vec2(0.5, 0.5); + for (Animator & anim : anim_player) { + anim.active = false; + anim.set_anim(7); + } + if (transform_player.rotation > 0 && transform_player.rotation < 90) { + // Do not call next_anim() + } else if (transform_player.rotation > 90 && transform_player.rotation < 180) { + for (Animator & anim : anim_player) { + anim.next_anim(); + } + } else if (transform_player.rotation > 180 && transform_player.rotation < 270) { + for (Animator & anim : anim_player) { + anim.next_anim(); + anim.next_anim(); + } + } else { + for (Animator & anim : anim_player) { + anim.next_anim(); + anim.next_anim(); + anim.next_anim(); + } + } + jump++; + } + + if (rb_player.data.linear_velocity.x < 5 && jump == 3) { + this->trigger_event<EndGameEvent>(); + jump++; + } + + return false; + } + + return false; +} diff --git a/game/player/PlayerEndScript.h b/game/player/PlayerEndScript.h new file mode 100644 index 0000000..03ea8a9 --- /dev/null +++ b/game/player/PlayerEndScript.h @@ -0,0 +1,14 @@ +#pragma once + +#include <crepe/api/Script.h> + +class PlayerEndScript : public crepe::Script { +public: + void init(); + +private: + bool on_collision(const crepe::CollisionEvent & ev); + +private: + int jump = 0; +}; diff --git a/game/player/PlayerScript.cpp b/game/player/PlayerScript.cpp new file mode 100644 index 0000000..8cbe8dc --- /dev/null +++ b/game/player/PlayerScript.cpp @@ -0,0 +1,214 @@ +#include "PlayerScript.h" + +#include "../Config.h" +#include "../enemy/BattleScript.h" + +#include <crepe/api/Animator.h> +#include <crepe/api/AudioSource.h> +#include <crepe/api/BoxCollider.h> +#include <crepe/api/ParticleEmitter.h> +#include <crepe/api/Rigidbody.h> +#include <crepe/api/Transform.h> +#include <crepe/types.h> + +using namespace crepe; +using namespace std; + +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(); + RefVector<Animator> animators = this->get_components_by_name<Animator>("player"); + RefVector<ParticleEmitter> emitters + = this->get_components_by_name<ParticleEmitter>("player"); + + if (ev.info.other.metadata.tag == "zapper") { + for (Animator & anim : animators) { + anim.active = true; + anim.set_anim(4); + anim.data.looping = true; + prev_anim = 0; + } + for (ParticleEmitter & emitter : emitters) { + emitter.data.emission_rate = 0; + } + play_scr.active = false; + end_scr.active = true; + + AudioSource & audio = this->get_components_by_name<AudioSource>("player").at(0); + audio.play(); + + return false; + } else if (ev.info.other.metadata.tag == "laser") { + for (Animator & anim : animators) { + anim.active = true; + anim.set_anim(4); + anim.data.looping = true; + prev_anim = 0; + } + for (ParticleEmitter & emitter : emitters) { + emitter.data.emission_rate = 0; + } + play_scr.active = false; + end_scr.active = true; + + AudioSource & audio = this->get_components_by_name<AudioSource>("player").at(1); + audio.play(); + + return false; + } else if (ev.info.other.metadata.tag == "missile" + || ev.info.other.metadata.tag == "enemy_bullet") { + for (Animator & anim : animators) { + anim.active = true; + anim.set_anim(5); + anim.data.looping = true; + prev_anim = 0; + } + for (ParticleEmitter & emitter : emitters) { + emitter.data.emission_rate = 0; + } + play_scr.active = false; + end_scr.active = true; + + AudioSource & audio = this->get_components_by_name<AudioSource>("player").at(2); + audio.play(); + + return false; + } + + return false; +} + +void PlayerScript::fixed_update(crepe::duration_t dt) { + RefVector<Animator> animators = this->get_components_by_name<Animator>("player"); + RefVector<ParticleEmitter> emitters + = this->get_components_by_name<ParticleEmitter>("player"); + Transform & transform = this->get_components_by_name<Transform>("player").front(); + + for (ParticleEmitter & emitter : emitters) { + emitter.data.boundary.offset = vec2(0, -transform.position.y); + } + + Rigidbody & rb = this->body; + if (this->get_key_state(Keycode::ENTER)) { + + auto now = std::chrono::steady_clock::now(); + std::chrono::duration<float> elapsed = now - last_fired; + if (elapsed > shot_delay) { + this->shoot(transform.position, 0); + last_fired = now; + } + } + if (this->get_key_state(Keycode::SPACE)) { + 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; + anim.set_anim(1); + anim.data.looping = true; + prev_anim = 1; + } + for (ParticleEmitter & emitter : emitters) { + emitter.data.emission_rate = 30; + } + } + + AudioSource & audio = this->get_components_by_name<AudioSource>("player").at( + 3 + current_jetpack_sound + ); + audio.play(); + current_jetpack_sound++; + if (current_jetpack_sound > 7) { + current_jetpack_sound = 0; + } + } 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; + anim.set_anim(0); + anim.data.looping = true; + prev_anim = 0; + } + for (ParticleEmitter & emitter : emitters) { + emitter.data.emission_rate = 0; + } + } + } else { + if (prev_anim != 2) { + for (Animator & anim : animators) { + anim.set_anim(2); + anim.data.looping = false; + prev_anim = 2; + } + for (ParticleEmitter & emitter : emitters) { + emitter.data.emission_rate = 0; + } + } + } +} + +void PlayerScript::shoot(const vec2 & location, float angle) { + RefVector<Transform> bullet_transforms + = this->get_components_by_tag<Transform>("player_bullet"); + + for (Transform & bullet_pos : bullet_transforms) { + if (bullet_pos.position.x == 0 && bullet_pos.position.y == -850) { + + bullet_pos.position = location; + bullet_pos.position.x += 20; + Rigidbody & bullet_body + = this->get_components_by_id<Rigidbody>(bullet_pos.game_object_id).front(); + BoxCollider bullet_collider + = this->get_components_by_id<BoxCollider>(bullet_pos.game_object_id).front(); + bullet_body.active = true; + BehaviorScript & bullet_script + = this->get_components_by_id<BehaviorScript>(bullet_pos.game_object_id) + .front(); + bullet_script.active = true; + return; + } + } +} diff --git a/game/player/PlayerScript.h b/game/player/PlayerScript.h new file mode 100644 index 0000000..6a7dedb --- /dev/null +++ b/game/player/PlayerScript.h @@ -0,0 +1,32 @@ +#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(); + void fixed_update(crepe::duration_t dt); + +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 new file mode 100644 index 0000000..d0142e0 --- /dev/null +++ b/game/player/PlayerSubScene.cpp @@ -0,0 +1,222 @@ +#include "PlayerSubScene.h" +#include "PlayerAudioScript.h" +#include "PlayerEndScript.h" +#include "PlayerScript.h" + +#include "../Config.h" +#include "../coins/CoinScript.h" + +#include <crepe/ValueBroker.h> +#include <crepe/api/Animator.h> +#include <crepe/api/AudioSource.h> +#include <crepe/api/BoxCollider.h> +#include <crepe/api/CircleCollider.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/ParticleEmitter.h> +#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; +using namespace std; + +PlayerSubScene::PlayerSubScene(Scene & scn) { + GameObject player = scn.new_object("player", "player", vec2(-100, 200)); + + 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 { + .sorting_in_layer = SORT_IN_LAY_PLAYER, + .order_in_layer = 3, + .size = vec2(0, 6), + } + ); + player.add_component<ParticleEmitter>(player_bullet_sprite, ParticleEmitter::Data{ + .offset = vec2(-15, 15), + .emission_rate = 0, + .min_speed = 300, + .max_speed = 500, + .min_angle = 85, + .max_angle = 100, + .boundary = ParticleEmitter::Boundary { + .height = 400, + .reset_on_exit = true, + }, + }); + Asset player_bullet_x2 {player_bullet_x2_string}; + Sprite & player_bullet_x2_sprite = player.add_component<Sprite>( + player_bullet_x2, + Sprite::Data { + .sorting_in_layer = SORT_IN_LAY_PLAYER, + .order_in_layer = 3, + .size = vec2(0, 12), + } + ); + player.add_component<ParticleEmitter>(player_bullet_x2_sprite, ParticleEmitter::Data{ + .offset = vec2(-15, 15), + .emission_rate = 0, + .min_speed = 300, + .max_speed = 500, + .min_angle = 85, + .max_angle = 100, + .boundary = ParticleEmitter::Boundary { + .height = 400, + .reset_on_exit = true, + }, + }); + Asset player_shell {player_shell_string}; + Sprite & player_shell_sprite = player.add_component<Sprite>( + player_shell, + Sprite::Data { + .sorting_in_layer = SORT_IN_LAY_PLAYER, + .order_in_layer = 3, + .size = vec2(0, 12), + .angle_offset = 90, + } + ); + player.add_component<ParticleEmitter>(player_shell_sprite, ParticleEmitter::Data{ + .offset = vec2(-15, 15), + .emission_rate = 0, + .min_speed = 200, + .max_speed = 500, + .min_angle = 110, + .max_angle = 120, + .force_over_time = vec2(0, 1000), + .boundary = ParticleEmitter::Boundary { + .height = 400, + .reset_on_exit = true, + }, + }); + + Asset player_body_asset {"asset/barry/defaultBody.png"}; + Sprite & player_body_sprite = player.add_component<Sprite>( + player_body_asset, + Sprite::Data { + .sorting_in_layer = SORT_IN_LAY_PLAYER, + .order_in_layer = 0, + .size = vec2(0, 50), + } + ); + player.add_component<Animator>( + player_body_sprite, ivec2(32, 32), uvec2(4, 8), + Animator::Data { + .fps = 5, + .looping = true, + } + ); + 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, + Sprite::Data { + .sorting_in_layer = SORT_IN_LAY_PLAYER, + .order_in_layer = 1, + .size = vec2(0, 50), + .position_offset = vec2(0, -20), + } + ); + player.add_component<Animator>( + player_head_sprite, ivec2(32, 32), uvec2(4, 8), + Animator::Data { + .fps = 5, + .looping = true, + } + ); + player.add_component<CircleCollider>(25, vec2(0, -20)); + Asset player_jetpack_asset {"asset/barry/jetpackDefault.png"}; + Sprite & player_jetpack_sprite = player.add_component<Sprite>( + player_jetpack_asset, + Sprite::Data { + .sorting_in_layer = SORT_IN_LAY_PLAYER, + .order_in_layer = 2, + .size = vec2(0, 60), + .position_offset = vec2(-20, 0), + } + ); + player_jetpack_sprite.active = false; + player.add_component<Animator>( + player_jetpack_sprite, ivec2(32, 44), uvec2(4, 4), + Animator::Data { + .fps = 5, + .looping = true, + } + ); + player.add_component<BoxCollider>(vec2(40, 50), vec2(-20, 0)); + player.add_component<Rigidbody>(Rigidbody::Data { + .gravity_scale = 1.0, + .body_type = Rigidbody::BodyType::DYNAMIC, + .linear_velocity = vec2(PLAYER_SPEED * 0.02, 0), + .collision_layers + = {COLL_LAY_BOT_TOP, COLL_LAY_ZAPPER, COLL_LAY_LASER, COLL_LAY_MISSILE, COLL_LAY_BULLET + }, + .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; + + player.add_component<AudioSource>(Asset("asset/sfx/dud_zapper_lp.ogg")); + player.add_component<AudioSource>(Asset("asset/sfx/dud_zapper_pop.ogg")); + player.add_component<AudioSource>(Asset("asset/sfx/dud_fire.ogg")); + player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_01.ogg")).volume + = 0.1; + player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_02.ogg")).volume + = 0.1; + player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_03.ogg")).volume + = 0.1; + player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_04.ogg")).volume + = 0.1; + player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_05.ogg")).volume + = 0.1; + player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_06.ogg")).volume + = 0.1; + player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_07.ogg")).volume + = 0.1; + player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_08.ogg")).volume + = 0.1; + + GameObject player_audio = scn.new_object("player_audio", "player_audio", vec2(0, 0)); + player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_left_1.ogg")).volume + = 3.0; + player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_right_1.ogg")) + .volume + = 3.0; + player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_left_2.ogg")).volume + = 3.0; + player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_right_2.ogg")) + .volume + = 3.0; + player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_left_3.ogg")).volume + = 3.0; + player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_right_3.ogg")) + .volume + = 3.0; + player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_left_4.ogg")).volume + = 3.0; + player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_right_4.ogg")) + .volume + = 3.0; + + player_audio.add_component<BehaviorScript>().set_script<PlayerAudioScript>().active + = false; +} diff --git a/game/player/PlayerSubScene.h b/game/player/PlayerSubScene.h new file mode 100644 index 0000000..bf94c32 --- /dev/null +++ b/game/player/PlayerSubScene.h @@ -0,0 +1,10 @@ +#pragma once + +namespace crepe { +class Scene; +} + +class PlayerSubScene { +public: + PlayerSubScene(crepe::Scene & scn); +}; |