diff options
| -rw-r--r-- | game/CMakeLists.txt | 45 | ||||
| -rw-r--r-- | game/PreviewScene.cpp | 99 | ||||
| -rw-r--r-- | game/PreviewScene.h | 11 | ||||
| -rw-r--r-- | game/missile/MissilePool.cpp | 16 | ||||
| -rw-r--r-- | game/missile/MissilePool.h | 11 | ||||
| -rw-r--r-- | game/missile/MissileScript.cpp | 105 | ||||
| -rw-r--r-- | game/missile/MissileScript.h | 20 | ||||
| -rw-r--r-- | game/missile/MissileSubScene.cpp | 101 | ||||
| -rw-r--r-- | game/missile/MissileSubScene.h | 12 | ||||
| -rw-r--r-- | game/missile/SpawnEvent.cpp | 47 | ||||
| -rw-r--r-- | game/missile/SpawnEvent.h | 20 | ||||
| -rw-r--r-- | game/preview/NpcScript.cpp | 32 | ||||
| -rw-r--r-- | game/preview/NpcScript.h | 11 | ||||
| -rw-r--r-- | game/preview/NpcSubScene.cpp | 69 | ||||
| -rw-r--r-- | game/preview/NpcSubScene.h | 10 | ||||
| -rw-r--r-- | game/preview/PrevPlayerScript.cpp | 132 | ||||
| -rw-r--r-- | game/preview/PrevPlayerScript.h | 23 | ||||
| -rw-r--r-- | game/preview/PrevPlayerSubScene.cpp | 86 | ||||
| -rw-r--r-- | game/preview/PrevPlayerSubScene.h | 10 | ||||
| -rw-r--r-- | game/preview/SmokeSubScene.cpp | 37 | ||||
| -rw-r--r-- | game/preview/SmokeSubScene.h | 10 | ||||
| -rw-r--r-- | game/scheduler/ObjectsScheduler.cpp | 41 | ||||
| -rw-r--r-- | game/scheduler/ObjectsScheduler.h | 34 | 
23 files changed, 977 insertions, 5 deletions
diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 4e31f80..47adb11 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -8,25 +8,56 @@ project(game C CXX)  add_subdirectory(../src crepe)  add_executable(main +	#background  	background/AquariumSubScene.cpp  	background/AquariumScript.cpp  	background/BackgroundSubScene.cpp  	background/ForestParallaxScript.cpp  	background/ForestSubScene.cpp -	GameScene.cpp  	background/HallwaySubScene.cpp +	background/StartSubScene.cpp + +	# mainscenes +	GameScene.cpp +	menus/shop/ShopMenuScene.cpp +	menus/mainmenu/MainMenuScene.cpp +	PreviewScene.cpp +	main.cpp + +	# missile +	missile/MissilePool.cpp +	missile/MissileScript.cpp +	missile/MissileSubScene.cpp +	missile/SpawnEvent.cpp + +	#scheduling +	scheduler/ObjectsScheduler.cpp + +	# Preview +	preview/SmokeSubScene.cpp +	preview/NpcSubScene.cpp +	preview/NpcScript.cpp +	preview/PrevPlayerSubScene.cpp +	preview/PrevPlayerScript.cpp + +	# scripts  	background/HallwayScript.cpp  	MoveCameraManualyScript.cpp +	StartGameScript.cpp + +	# player  	player/PlayerScript.cpp  	player/PlayerSubScene.cpp -	StartGameScript.cpp  	player/PlayerEndScript.cpp  	player/PlayerAudioScript.cpp -	background/StartSubScene.cpp + +	# workers  	workers/WorkersSubScene.cpp  	workers/WorkerScript.cpp  	workers/PanicFromPlayerScript.cpp  	workers/CollisionScript.cpp + +	# menus  	main.cpp  	menus/BannerSubScene.cpp  	menus/ButtonSubScene.cpp @@ -36,20 +67,24 @@ add_executable(main  	menus/ButtonNextMainMenuSubScript.cpp  	menus/FloatingWindowSubScene.cpp  	menus/IFloatingWindowScript.cpp -	menus/shop/ShopMenuScene.cpp  	menus/mainmenu/ButtonTransitionPreviewSubScript.cpp  	menus/mainmenu/ITransitionScript.cpp -	menus/mainmenu/MainMenuScene.cpp  	menus/mainmenu/TransitionStartSubScript.cpp  	menus/endgame/EndGameSubScene.cpp  	menus/endgame/EndGameSubScript.cpp + +	# coins  	coins/CoinSubScene.cpp  	coins/CoinPoolSubScene.cpp  	coins/CoinSystemScript.cpp  	coins/CoinScript.cpp + +	# hud  	hud/HudSubScene.cpp  	hud/HudScript.cpp  	hud/SpeedScript.cpp + +	#random  	Random.cpp  ) diff --git a/game/PreviewScene.cpp b/game/PreviewScene.cpp new file mode 100644 index 0000000..6cd9e78 --- /dev/null +++ b/game/PreviewScene.cpp @@ -0,0 +1,99 @@ +#include "PreviewScene.h" + +#include "Config.h" +#include "background/BackgroundSubScene.h" +#include "missile/MissilePool.h" +#include "missile/SpawnEvent.h" +#include "preview/NpcSubScene.h" +#include "preview/PrevPlayerSubScene.h" +#include "preview/SmokeSubScene.h" + +#include "missile/MissileSubScene.h" + +#include <cmath> +#include <crepe/api/Animator.h> +#include <crepe/api/Asset.h> +#include <crepe/api/AudioSource.h> +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/BoxCollider.h> +#include <crepe/api/Camera.h> +#include <crepe/api/Color.h> +#include <crepe/api/Event.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/ParticleEmitter.h> +#include <crepe/api/Rigidbody.h> +#include <crepe/api/Script.h> +#include <crepe/api/Sprite.h> +#include <crepe/api/Transform.h> + +#include <crepe/ValueBroker.h> +#include <crepe/manager/SaveManager.h> +#include <crepe/types.h> +#include <iostream> + +using namespace crepe; +using namespace std; + +void PreviewScene::load_scene() { + +	BackgroundSubScene background(*this); + +	GameObject camera = new_object("camera", "camera", vec2(650, 0)); +	camera.add_component<Camera>( +		ivec2(990, 720), vec2(VIEWPORT_X, VIEWPORT_Y), +		Camera::Data { +			.bg_color = Color::RED, +		} +	); +	camera.add_component<Rigidbody>(Rigidbody::Data {}); +	camera.add_component<BehaviorScript>().set_script<MissileSpawnEventHandler>(); + +	GameObject floor = new_object("floor", "game_world", vec2(0, 325)); +	floor.add_component<Rigidbody>(Rigidbody::Data { +		.body_type = Rigidbody::BodyType::STATIC, +		.collision_layer = COLL_LAY_BOT_TOP, +	}); +	floor.add_component<BoxCollider>(vec2(INFINITY, 200)); +	GameObject floor_low = new_object("floor_low", "game_world", vec2(0, 350)); +	floor_low.add_component<Rigidbody>(Rigidbody::Data { +		.body_type = Rigidbody::BodyType::STATIC, +		.collision_layer = COLL_LAY_BOT_LOW, +	}); +	floor_low.add_component<BoxCollider>(vec2(INFINITY, 200)); +	GameObject floor_high = new_object("floor_high", "game_world", vec2(0, 300)); +	floor_high.add_component<Rigidbody>(Rigidbody::Data { +		.body_type = Rigidbody::BodyType::STATIC, +		.collision_layer = COLL_LAY_BOT_HIGH, +	}); +	GameObject ceiling = new_object("ceiling", "game_world", vec2(0, -325)); +	ceiling.add_component<Rigidbody>(Rigidbody::Data { +		.body_type = Rigidbody::BodyType::STATIC, +		.collision_layer = COLL_LAY_BOT_TOP, +	}); +	ceiling.add_component<BoxCollider>(vec2(INFINITY, 200)); +	GameObject world = this->new_object("world", "TAG", vec2 {0, 0}, 0, 1); + +	world.add_component<Rigidbody>(Rigidbody::Data { +		.body_type = Rigidbody::BodyType::STATIC, +		.collision_layers = {0}, +	}); + +	PrevPlayerSubScene player(*this); +	NpcSubScene npc(*this); +	SmokeSubScene smoke(*this); +	MissilePool mpool(*this); + +	/* +	 +	for (int i = 0; i < 200; ++i) { +		int row = i / 10; +		int col = i % 10; +		float x = col * 25 + i; +		float y = row * 25 - 400; +		GameObject game_coin = this->new_object("coin", "coin", vec2 {x, y}, 0, 1); +		Coin coin(game_coin, vec2 {0, 0}); +	} +	  */ +} + +string PreviewScene::get_name() const { return "preview scene"; } diff --git a/game/PreviewScene.h b/game/PreviewScene.h new file mode 100644 index 0000000..afe911e --- /dev/null +++ b/game/PreviewScene.h @@ -0,0 +1,11 @@ +#pragma once + +#include <crepe/api/Scene.h> +#include <string> + +class PreviewScene : public crepe::Scene { +public: +	void load_scene(); + +	std::string get_name() const; +}; diff --git a/game/missile/MissilePool.cpp b/game/missile/MissilePool.cpp new file mode 100644 index 0000000..e549210 --- /dev/null +++ b/game/missile/MissilePool.cpp @@ -0,0 +1,16 @@ +#include "MissilePool.h" +#include "MissileSubScene.h" + +#include <crepe/api/Scene.h> + +using namespace std; +using namespace crepe; + +MissilePool::MissilePool(Scene & scn) { +	int amount = 0; +	MissileSubScene missile; +	while (amount < this->MAX_MISSILE_COUNT) { +		missile.create(scn); +		amount++; +	} +} diff --git a/game/missile/MissilePool.h b/game/missile/MissilePool.h new file mode 100644 index 0000000..296701e --- /dev/null +++ b/game/missile/MissilePool.h @@ -0,0 +1,11 @@ +#pragma once + +#include <crepe/api/Scene.h> + +class MissilePool { +public: +	MissilePool(crepe::Scene & scn); + +private: +	static constexpr unsigned int MAX_MISSILE_COUNT = 5; +}; diff --git a/game/missile/MissileScript.cpp b/game/missile/MissileScript.cpp new file mode 100644 index 0000000..6d0e40e --- /dev/null +++ b/game/missile/MissileScript.cpp @@ -0,0 +1,105 @@ +#include "MissileScript.h" +#include "../Config.h" +#include "api/BehaviorScript.h" + +#include <crepe/api/Animator.h> +#include <crepe/api/AudioSource.h> +#include <crepe/api/Transform.h> +#include <crepe/system/CollisionSystem.h> +#include <crepe/types.h> + +#include <cmath> +#include <crepe/api/AI.h> +#include <crepe/api/KeyCodes.h> +#include <crepe/api/Sprite.h> + +using namespace std; +using namespace crepe; + +void MissileScript::init() { +	subscribe<CollisionEvent>([this](const CollisionEvent & ev) -> bool { +		return this->on_collision(ev); +	}); +	this->seeking_disabled = false; +} +void MissileScript::kill_missile() { +	auto animations = this->get_components<Animator>(); +	auto sprites = this->get_components<Sprite>(); +	auto & fly_sound = this->get_components<AudioSource>().front().get(); +	auto & this_script = this->get_components<BehaviorScript>().back().get(); + +	animations[0].get().active = false; +	animations[1].get().active = false; +	animations[2].get().active = true; +	sprites[0].get().active = false; +	sprites[1].get().active = false; +	sprites[2].get().active = true; + +	this_script.active = false; +	this->seeking_disabled = false; + +	fly_sound.stop(); +} +void MissileScript::activate() { +	auto anim = this->get_components<Animator>(); +	auto sprites = this->get_components<Sprite>(); + +	anim[0].get().active = true; +	anim[1].get().active = true; +	anim[2].get().stop(); +	sprites[0].get().active = true; +	sprites[1].get().active = true; +	sprites[2].get().active = false; +} + +bool MissileScript::on_collision(const CollisionEvent & ev) { +	auto & explosion_sound = this->get_components<AudioSource>().back().get(); + +	this->kill_missile(); +	explosion_sound.play(); + +	return false; +} + +bool MissileScript::is_in_x_range(const Transform & missile, const Transform & player) { +	return fabs(missile.position.x - player.position.x) <= this->X_RANGE; +} + +void MissileScript::fixed_update(crepe::duration_t dt) { +	auto & explosion_anim = this->get_components<Animator>().back().get(); +	auto & missile = this->get_component<Transform>(); +	auto & m_ai = this->get_component<AI>(); + +	const auto & player = this->get_components_by_name<Transform>("player").front().get(); +	const auto & cam = this->get_components_by_name<Transform>("camera").front().get(); +	const auto & velocity = this->get_component<Rigidbody>().data.linear_velocity; + +	if (missile.position.x < (cam.position.x - VIEWPORT_X / 1.8)) { +		this->kill_missile(); +		return; +	} + +	// check if animation is at the end +	if (explosion_anim.data.row == 7) { +		this->activate(); +		this->seeking_disabled = false; +	} + +	if (this->seeking_disabled) { +		m_ai.seek_off(); +	} else { +		m_ai.seek_target = player.position; +		m_ai.seek_on(); + +		if (is_in_x_range(missile, player)) { +			this->seeking_disabled = true; +			m_ai.seek_off(); +		} +	} + +	vec2 angle_pos = velocity; +	float angle = atan2(angle_pos.y, angle_pos.x) * (180 / M_PI); + +	missile.rotation = angle; +	missile.position += velocity * dt.count(); +} diff --git a/game/missile/MissileScript.h b/game/missile/MissileScript.h new file mode 100644 index 0000000..a492e18 --- /dev/null +++ b/game/missile/MissileScript.h @@ -0,0 +1,20 @@ +#pragma once + +#include <crepe/api/Script.h> + +class MissileScript : public crepe::Script { +private: +	bool on_collision(const crepe::CollisionEvent & ev); + +	bool seeking_disabled; + +	// will be used to calculate when ai will be stopped +	static constexpr int X_RANGE = 90; +	bool is_in_x_range(const crepe::Transform & missile, const crepe::Transform & player); +	void kill_missile(); +	void activate(); + +public: +	void init(); +	void fixed_update(crepe::duration_t dt); +}; diff --git a/game/missile/MissileSubScene.cpp b/game/missile/MissileSubScene.cpp new file mode 100644 index 0000000..db49f88 --- /dev/null +++ b/game/missile/MissileSubScene.cpp @@ -0,0 +1,101 @@ +#include "MissileSubScene.h" +#include "../Config.h" +#include "../missile/MissileScript.h" + +#include <crepe/api/AI.h> +#include <crepe/api/Animator.h> +#include <crepe/api/AudioSource.h> +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/CircleCollider.h> +#include <crepe/api/Scene.h> +#include <crepe/api/Sprite.h> +#include <crepe/types.h> +#include <random> + +using namespace crepe; + +void MissileSubScene::create(crepe::Scene & scn) { +	std::random_device rd; +	std::mt19937 gen(rd()); + +	GameObject missle = scn.new_object("missile", "missile", {0, 0}, 0, 1); + +	Asset missle_ss {"asset/obstacles/missile/missile.png"}; +	Asset missle_thruster_ss {"asset/obstacles/missile/missileEffects.png"}; +	Asset missile_explosion_ss {"asset/obstacles/missile/missileExplosion.png"}; +	Asset explosion_sound {"asset/sfx/rocket_explode_1.ogg"}; +	Asset missile_fire {"asset/sfx/missile_launch.ogg"}; + +	missle.add_component<BehaviorScript>().set_script<MissileScript>().active = false; + +	auto & sound = missle.add_component<AudioSource>(missile_fire); +	sound.volume = 0.1; +	auto & sound2 = missle.add_component<AudioSource>(explosion_sound); +	sound2.volume = 0.1; + +	// sprites +	auto & missle_sprite = missle.add_component<Sprite>( +		missle_ss, +		Sprite::Data { +			.flip = {true, false}, +			.sorting_in_layer = SORT_IN_LAY_OBSTACLES, +			.size = {0, 35}, +		} +	); + +	auto & missle_thruster_sprite = missle.add_component<Sprite>( +		missle_thruster_ss, +		Sprite::Data { +			.flip = {true, false}, +			.sorting_in_layer = SORT_IN_LAY_OBSTACLES, +			.size = {0, 35}, +			.position_offset = {-20, 0}, +		} +	); + +	auto & missile_explosion_sprite = missle.add_component<Sprite>( +		missile_explosion_ss, +		Sprite::Data { +			.sorting_in_layer = SORT_IN_LAY_OBSTACLES, +			.size = {0, 50}, +		} +	); + +	// Animations +	missle.add_component<Animator>( +		missle_sprite, ivec2 {32, 32}, uvec2 {4, 1}, +		Animator::Data { +			.looping = true, +		} +	); + +	missle.add_component<Animator>( +		missle_thruster_sprite, ivec2 {64, 64}, uvec2 {4, 2}, +		Animator::Data { +			.looping = true, +		} +	); + +	auto & explosion_anim = missle.add_component<Animator>( +		missile_explosion_sprite, ivec2 {64, 64}, uvec2 {8, 1}, +		Animator::Data { +			.fps = 10, +		} +	); + +	missile_explosion_sprite.active = false; +	explosion_anim.active = false; + +	std::uniform_int_distribution<> dist(140, 200); +	missle.add_component<Rigidbody>(Rigidbody::Data { +		.body_type = Rigidbody::BodyType::KINEMATIC, +		.max_linear_velocity = static_cast<float>(dist(gen)), +		.kinematic_collision = false, +		.collision_layers = {COLL_LAY_PLAYER, COLL_LAY_BOT_TOP}, +		.collision_layer = COLL_LAY_MISSILE, +	}); + +	missle.add_component<CircleCollider>(3); + +	auto & missle_ai = missle.add_component<AI>(1000); +} diff --git a/game/missile/MissileSubScene.h b/game/missile/MissileSubScene.h new file mode 100644 index 0000000..9ea422a --- /dev/null +++ b/game/missile/MissileSubScene.h @@ -0,0 +1,12 @@ +#pragma once + +namespace crepe { +class Scene; +} + +class MissileSubScene { +public: +	MissileSubScene() = default; + +	void create(crepe::Scene & scn); +}; diff --git a/game/missile/SpawnEvent.cpp b/game/missile/SpawnEvent.cpp new file mode 100644 index 0000000..03a9b8c --- /dev/null +++ b/game/missile/SpawnEvent.cpp @@ -0,0 +1,47 @@ +#include "SpawnEvent.h" + +#include <crepe/api/Animator.h> +#include <crepe/api/AudioSource.h> +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/Camera.h> +#include <crepe/api/Sprite.h> +#include <crepe/api/Transform.h> + +#include <cstdlib> +#include <random> + +using namespace crepe; + +void MissileSpawnEventHandler::init() { +	subscribe<MissileSpawnEvent>([this](const MissileSpawnEvent & ev) -> bool { +		return this->on_event(ev); +	}); +} + +std::random_device rd; +std::mt19937 gen(rd()); + +bool MissileSpawnEventHandler::on_event(const MissileSpawnEvent & event) { +	auto missile_sprites = this->get_components_by_name<Sprite>("missile"); +	auto missile_transforms = this->get_components_by_name<Transform>("missile"); +	auto missile_behaviorscripts = this->get_components_by_name<BehaviorScript>("missile"); +	auto missile_audiosources = this->get_components_by_name<AudioSource>("missile"); +	auto & camera_transform = this->get_components_by_name<Transform>("camera").front().get(); + +	for (size_t i = 0; i < missile_behaviorscripts.size(); ++i) { +		auto & script = missile_behaviorscripts[i].get(); +		if (script.active) continue; +		script.active = true; + +		missile_audiosources[i * 2].get().play(); + +		auto & transform = missile_transforms[i].get(); +		transform.position.x = camera_transform.position.x + this->MISSILE_OFFSET; +		std::uniform_int_distribution<> dist(this->MIN_RANGE, this->MAX_RANGE); +		transform.position.y = dist(gen); + +		break; +	} + +	return false; +} diff --git a/game/missile/SpawnEvent.h b/game/missile/SpawnEvent.h new file mode 100644 index 0000000..ce301fd --- /dev/null +++ b/game/missile/SpawnEvent.h @@ -0,0 +1,20 @@ +#pragma once + +#include <crepe/api/Event.h> +#include <crepe/api/Script.h> + +#include "../Config.h" + +struct MissileSpawnEvent : public crepe::Event {}; + +class MissileSpawnEventHandler : public crepe::Script { +private: +	static constexpr int MISSILE_OFFSET = VIEWPORT_X / 1.8; +	static constexpr int RANGE = GAME_HEIGHT / 4; +	static constexpr int MIN_RANGE = -RANGE; +	static constexpr int MAX_RANGE = RANGE; + +public: +	void init(); +	bool on_event(const MissileSpawnEvent & ev); +}; diff --git a/game/preview/NpcScript.cpp b/game/preview/NpcScript.cpp new file mode 100644 index 0000000..c4148f2 --- /dev/null +++ b/game/preview/NpcScript.cpp @@ -0,0 +1,32 @@ +#include "NpcScript.h" + +#include <crepe/api/Sprite.h> +#include <crepe/api/Transform.h> +#include <crepe/manager/SaveManager.h> + +using namespace std; +using namespace crepe; + +void NpcScript::init() {} +void NpcScript::fixed_update(duration_t dt) { +	auto & rb = this->get_component<Rigidbody>(); +	auto & npc = this->get_component<Sprite>(); +	auto & transform = this->get_component<Transform>(); + +	if (transform.position.x < -990) { +		rb.data.linear_velocity.x *= -1; +	} +	if (transform.position.x > 990) { +		rb.data.linear_velocity.x *= -1; +	} + +	if (rb.data.linear_velocity.x < 0) { +		npc.data.flip = {true, false}; +	} else { +		npc.data.flip = {false, false}; +	} + +	auto & savemgr = this->get_save_manager(); +	savemgr.set("npc_x", transform.position.x); +	savemgr.set("npc_y", transform.position.y); +} diff --git a/game/preview/NpcScript.h b/game/preview/NpcScript.h new file mode 100644 index 0000000..8d856fd --- /dev/null +++ b/game/preview/NpcScript.h @@ -0,0 +1,11 @@ + +#include <crepe/api/Script.h> + +class NpcScript : public crepe::Script { + +private: + +public: +	void init(); +	void fixed_update(crepe::duration_t dt); +}; diff --git a/game/preview/NpcSubScene.cpp b/game/preview/NpcSubScene.cpp new file mode 100644 index 0000000..bd6cfb2 --- /dev/null +++ b/game/preview/NpcSubScene.cpp @@ -0,0 +1,69 @@ + + +#include "NpcSubScene.h" + +#include "../Config.h" +#include "NpcScript.h" + +#include <crepe/ValueBroker.h> +#include <crepe/api/Animator.h> +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/Scene.h> +#include <crepe/api/Sprite.h> +#include <crepe/manager/SaveManager.h> + +using namespace crepe; + +NpcSubScene::NpcSubScene(Scene & scn) { +	auto & savemgr = scn.get_save_manager(); +	ValueBroker npc_x = savemgr.get<float>("npc_x", 500); +	ValueBroker npc_y = savemgr.get<float>("npc_y", 0); + +	GameObject npc = scn.new_object("npc", "npc_tag", vec2 {npc_x.get(), npc_y.get()}, 0, 1); +	Asset npc_body {"asset/workers/worker1Body.png"}; +	Asset npc_head {"asset/workers/worker1Head.png"}; + +	auto & npc_body_sprite = npc.add_component<Sprite>( +		npc_body, +		Sprite::Data { +			.sorting_in_layer = SORT_IN_LAY_PLAYER, +			.size = {0, 50}, +		} +	); +	auto & npc_head_sprite = npc.add_component<Sprite>( +		npc_head, +		Sprite::Data { +			.sorting_in_layer = SORT_IN_LAY_PLAYER, +			.size = {0, 50}, +			.position_offset = {0, -20}, +		} +	); + +	npc.add_component<Animator>( +		npc_body_sprite, ivec2 {32, 32}, uvec2 {4, 8}, +		Animator::Data { +			.fps = 5, +			.looping = true, +		} +	); +	npc.add_component<Animator>( +		npc_head_sprite, ivec2 {32, 32}, uvec2 {4, 8}, +		Animator::Data { +			.fps = 5, +			.looping = true, +		} +	); +	npc.add_component<BoxCollider>(vec2 {50, 50}); + +	npc.add_component<Rigidbody>(Rigidbody::Data { +		.mass = 10, +		.gravity_scale = 1, +		.body_type = Rigidbody::BodyType::DYNAMIC, +		.linear_velocity = {-50, 0}, +		//.max_linear_velocity = 40, +		.collision_layers = {COLL_LAY_BOT_TOP, COLL_LAY_PLAYER}, +		.collision_layer = COLL_LAY_PLAYER, +	}); + +	npc.add_component<BehaviorScript>().set_script<NpcScript>(); +} diff --git a/game/preview/NpcSubScene.h b/game/preview/NpcSubScene.h new file mode 100644 index 0000000..a226195 --- /dev/null +++ b/game/preview/NpcSubScene.h @@ -0,0 +1,10 @@ +#pragma once + +namespace crepe { +class Scene; +} + +class NpcSubScene { +public: +	NpcSubScene(crepe::Scene & scn); +}; diff --git a/game/preview/PrevPlayerScript.cpp b/game/preview/PrevPlayerScript.cpp new file mode 100644 index 0000000..2657b8d --- /dev/null +++ b/game/preview/PrevPlayerScript.cpp @@ -0,0 +1,132 @@ +#include "PrevPlayerScript.h" + +#include "../missile/SpawnEvent.h" +#include "api/Transform.h" +#include <crepe/api/AudioSource.h> +#include <crepe/api/Camera.h> +#include <crepe/manager/SaveManager.h> +#include <iostream> +#include <ostream> + +using namespace crepe; + +bool PrevPlayerScript::key_pressed(const KeyPressEvent & ev) { +	switch (ev.key) { +		case Keycode::A: +			this->get_component<Rigidbody>().data.linear_velocity.x = -move_speed; +			this->body->data.flip = {true, false}; +			this->head->data.flip = {true, false}; +			break; +		case Keycode::D: +			this->get_component<Rigidbody>().data.linear_velocity.x = move_speed; +			this->body->data.flip = {false, false}; +			this->head->data.flip = {false, false}; +			break; + +		case Keycode::SPACE: +			this->get_component<Rigidbody>().data.linear_velocity.y = -move_speed; +			break; +		case Keycode::D0: +			this->body_anim->set_anim(0); +			this->head_anim->set_anim(0); +			break; +		case Keycode::D1: +			this->body_anim->set_anim(1); +			this->head_anim->set_anim(1); +			break; +		case Keycode::D2: +			this->body_anim->set_anim(2); +			this->head_anim->set_anim(2); +			break; +		case Keycode::D3: +			this->body_anim->set_anim(3); +			this->head_anim->set_anim(3); +			break; +		case Keycode::D4: +			this->body_anim->set_anim(4); +			this->head_anim->set_anim(4); +			break; +		case Keycode::D5: +			this->body_anim->set_anim(5); +			this->head_anim->set_anim(5); +			break; +		case Keycode::D6: +			this->body_anim->set_anim(6); +			this->head_anim->set_anim(6); +			break; +		case Keycode::D7: +			this->body_anim->set_anim(7); +			this->head_anim->set_anim(7); +			break; +		case Keycode::LEFT: +			this->head->data.angle_offset -= 1; +			break; +		case Keycode::RIGHT: +			this->head->data.angle_offset += 1; +			break; +		case Keycode::UP: +			this->head->data.scale_offset += 0.1; +			break; +		case Keycode::DOWN: +			this->head->data.scale_offset -= 0.1; +			break; +		case Keycode::P: +			this->get_component<AudioSource>().play(); +			break; +		case Keycode::Q: +			this->get_components_by_name<Camera>("camera").front().get().data.zoom -= 0.01; +			break; +		case Keycode::E: +			this->get_components_by_name<Camera>("camera").front().get().data.zoom += 0.01; +			break; +		case Keycode::J: +			this->get_components_by_name<Transform>("camera").front().get().position.x +				-= move_speed; +			break; +		case Keycode::K: +			this->get_components_by_name<Transform>("camera").front().get().position.y +				-= move_speed; +			break; +		case Keycode::L: +			this->get_components_by_name<Transform>("camera").front().get().position.x +				+= move_speed; +			break; +		case Keycode::I: +			this->get_components_by_name<Transform>("camera").front().get().position.y +				+= move_speed; +			break; +		case Keycode::M: +			trigger_event<MissileSpawnEvent>(MissileSpawnEvent {}); +			break; +			//todo +		case Keycode::PAGE_UP: +		case Keycode::PAGE_DOWN: +		case Keycode::HOME: +			break; +		default: +			break; +	} +	return false; +} + +void PrevPlayerScript::init() { +	auto animations = this->get_components<Animator>(); +	body_anim = animations[0]; +	head_anim = animations[1]; + +	auto sprites = this->get_components<Sprite>(); +	body = sprites[0]; +	head = sprites[1]; + +	subscribe<KeyPressEvent>([this](const KeyPressEvent & ev) -> bool { +		return this->key_pressed(ev); +	}); +}; + +void PrevPlayerScript::fixed_update(crepe::duration_t dt) { +	auto & savemgr = this->get_save_manager(); +	const auto & pos = this->get_component<Transform>().position; + +	savemgr.set("player_x", pos.x); +	savemgr.set("player_y", pos.y); +}; diff --git a/game/preview/PrevPlayerScript.h b/game/preview/PrevPlayerScript.h new file mode 100644 index 0000000..cc3184e --- /dev/null +++ b/game/preview/PrevPlayerScript.h @@ -0,0 +1,23 @@ + +#include <crepe/api/Event.h> +#include <crepe/api/Script.h> +#include <crepe/util/OptionalRef.h> + +#include <crepe/api/Animator.h> +#include <crepe/api/Sprite.h> + +class PrevPlayerScript : public crepe::Script { +private: +	crepe::OptionalRef<crepe::Animator> head_anim; +	crepe::OptionalRef<crepe::Animator> body_anim; +	crepe::OptionalRef<crepe::Sprite> head; +	crepe::OptionalRef<crepe::Sprite> body; + +private: +	float move_speed = 100; + +private: +	void init(); +	void fixed_update(crepe::duration_t dt); +	bool key_pressed(const crepe::KeyPressEvent & ev); +}; diff --git a/game/preview/PrevPlayerSubScene.cpp b/game/preview/PrevPlayerSubScene.cpp new file mode 100644 index 0000000..b59a0af --- /dev/null +++ b/game/preview/PrevPlayerSubScene.cpp @@ -0,0 +1,86 @@ + +#include "PrevPlayerSubScene.h" + +#include "../Config.h" +#include "PrevPlayerScript.h" + +#include <crepe/api/Animator.h> +#include <crepe/api/AudioSource.h> +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/Scene.h> +#include <crepe/api/Sprite.h> + +#include <crepe/ValueBroker.h> +#include <crepe/manager/SaveManager.h> + +using namespace crepe; + +PrevPlayerSubScene::PrevPlayerSubScene(Scene & scn) { +	auto & savemgr = scn.get_save_manager(); + +	ValueBroker player_x = savemgr.get<float>("player_x", 500); +	ValueBroker player_y = savemgr.get<float>("player_y", -100); + +	GameObject player +		= scn.new_object("player", "TAG", vec2 {player_x.get(), player_y.get()}, 0, 1); +	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, +		} +	); +	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, +		} +	); +	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<Rigidbody>(Rigidbody::Data { +		.gravity_scale = 20, +		.body_type = Rigidbody::BodyType::DYNAMIC, +		.linear_velocity = vec2(100, 0), +		.collision_layers = {COLL_LAY_BOT_TOP}, +		.collision_layer = COLL_LAY_PLAYER, +	}); +	player.add_component<BoxCollider>(vec2(50, 50)); +	player.add_component<BehaviorScript>().set_script<PrevPlayerScript>(); +} diff --git a/game/preview/PrevPlayerSubScene.h b/game/preview/PrevPlayerSubScene.h new file mode 100644 index 0000000..a61f341 --- /dev/null +++ b/game/preview/PrevPlayerSubScene.h @@ -0,0 +1,10 @@ +#pragma once + +namespace crepe { +class Scene; +} + +class PrevPlayerSubScene { +public: +	PrevPlayerSubScene(crepe::Scene & scn); +}; diff --git a/game/preview/SmokeSubScene.cpp b/game/preview/SmokeSubScene.cpp new file mode 100644 index 0000000..e363f95 --- /dev/null +++ b/game/preview/SmokeSubScene.cpp @@ -0,0 +1,37 @@ + +#include "SmokeSubScene.h" + +#include "../Config.h" + +#include <crepe/api/ParticleEmitter.h> +#include <crepe/api/Scene.h> +#include <crepe/api/Sprite.h> + +using namespace crepe; + +SmokeSubScene::SmokeSubScene(Scene & scn) { +	GameObject smoke = scn.new_object("smoke_particle", "TAG", vec2 {500, -210}, 0, 1); + +	Asset smoke_ss {"asset/particles/smoke.png"}; + +	auto & smoke_sprite = smoke.add_component<Sprite>( +		smoke_ss, +		Sprite::Data { +			.sorting_in_layer = SORT_IN_LAY_PARTICLES_FOREGROUND, +			.size = {0, 30}, +		} +	); + +	smoke.add_component<ParticleEmitter>( +		smoke_sprite, +		ParticleEmitter::Data { +			.offset = {0, -60}, +			.max_particles = 10, +			.emission_rate = 25, +			.min_angle = 60, +			.max_angle = 120, +			.begin_lifespan = 1, +			.end_lifespan = 2, +		} +	); +} diff --git a/game/preview/SmokeSubScene.h b/game/preview/SmokeSubScene.h new file mode 100644 index 0000000..93d8a2d --- /dev/null +++ b/game/preview/SmokeSubScene.h @@ -0,0 +1,10 @@ +#pragma once + +namespace crepe { +class Scene; +} + +class SmokeSubScene { +public: +	SmokeSubScene(crepe::Scene & scn); +}; diff --git a/game/scheduler/ObjectsScheduler.cpp b/game/scheduler/ObjectsScheduler.cpp new file mode 100644 index 0000000..f354e70 --- /dev/null +++ b/game/scheduler/ObjectsScheduler.cpp @@ -0,0 +1,41 @@ + + +#include "ObjectsScheduler.h" + +#include "../Random.h" +#include "../missile/SpawnEvent.h" +#include "api/Transform.h" +#include <iostream> + +using namespace crepe; + +void ObjectsScheduler::preset_0() { trigger_event<MissileSpawnEvent>(MissileSpawnEvent {}); } +void ObjectsScheduler::preset_1() { trigger_event<MissileSpawnEvent>(MissileSpawnEvent {}); } +void ObjectsScheduler::preset_2() {} +void ObjectsScheduler::preset_3() {} +void ObjectsScheduler::preset_4() {} +void ObjectsScheduler::boss_fight_1() { std::cout << "Boss fight" << std::endl; } + +void ObjectsScheduler::init() { +	this->obstacles.push_back([this]() { preset_0(); }); +	this->obstacles.push_back([this]() { preset_1(); }); +	this->obstacles.push_back([this]() { boss_fight_1(); }); + +	// subscribe to battlewonevent +} + +void ObjectsScheduler::fixed_update(duration_t dt) { +	int pos_x +		= (int) this->get_components_by_name<Transform>("camera").front().get().position.x; + +	int boss_check = (pos_x - this->start_offset) / this->boss_fight_interval; +	if (boss_check > this->last_boss_check) { +		this->obstacles[2](); +		this->last_boss_check = boss_check; +	} +	int obstacle_check = (pos_x - this->start_offset) / this->obstacle_interval; +	if (obstacle_check > this->last_obstacle_check) { +		this->obstacles[Random::i(this->obstacles.size() - 1, 0)](); +		this->last_obstacle_check = obstacle_check; +	} +} diff --git a/game/scheduler/ObjectsScheduler.h b/game/scheduler/ObjectsScheduler.h new file mode 100644 index 0000000..d2d0f55 --- /dev/null +++ b/game/scheduler/ObjectsScheduler.h @@ -0,0 +1,34 @@ +#pragma once + + + +#include "api/Script.h" +#include <functional> +#include <vector> + + +class ObjectsScheduler : public crepe::Script { + +private: +	std::vector<std::function<void()>> obstacles; +	 +	int last_boss_check = 0; +	int last_obstacle_check = 0; + +	int boss_fight_interval = 2000; +	int obstacle_interval = 300; +	int start_offset = 1300; + + +	void preset_0(); +	void preset_1(); +	void preset_2(); +	void preset_3(); +	void preset_4(); +	void boss_fight_1(); + +public: +	void init(); +	void fixed_update(crepe::duration_t dt); + +};  |