diff options
| -rw-r--r-- | game/prefab/ZapperObject.cpp | 10 | ||||
| -rw-r--r-- | game/prefab/ZapperPoolScript.cpp | 37 | ||||
| -rw-r--r-- | game/prefab/ZapperPoolScript.h | 11 | ||||
| -rw-r--r-- | game/prefab/ZapperPoolSubScene.cpp | 14 | ||||
| -rw-r--r-- | game/prefab/ZapperPoolSubScene.h | 8 | 
5 files changed, 43 insertions, 37 deletions
| diff --git a/game/prefab/ZapperObject.cpp b/game/prefab/ZapperObject.cpp index 61681ae..712eca9 100644 --- a/game/prefab/ZapperObject.cpp +++ b/game/prefab/ZapperObject.cpp @@ -13,7 +13,7 @@ ZapperObject::ZapperObject(crepe::GameObject && base)  			  Sprite::Data {  				  .sorting_in_layer = SORT_IN_LAY_OBSTACLES,  				  .order_in_layer = 1, -				  .size = vec2(0, 42) * SCALE, +				  .size = vec2(0, 50) * SCALE,  			  }  		  ),  		  .orb_end = add_component<Sprite>( @@ -22,7 +22,7 @@ ZapperObject::ZapperObject(crepe::GameObject && base)  				  .flip = {true, true},  				  .sorting_in_layer = SORT_IN_LAY_OBSTACLES,  				  .order_in_layer = 1, -				  .size = vec2(0, 42) * SCALE, +				  .size = vec2(0, 50) * SCALE,  			  }  		  ),  		  .glow_start = add_component<Sprite>( @@ -81,10 +81,12 @@ ZapperObject::ZapperObject(crepe::GameObject && base)  	  })},  	  collider {add_component<BoxCollider>(vec2(0, 0))} {  	this->set_active(false); -	Log::logf(Log::DEBUG, "creating zapper"); +	Log::logf(Log::DEBUG, "Creating zapper");  }  void ZapperObject::place(const crepe::vec2 & position, float rotation, float length) { +	Log::logf(Log::DEBUG, "Placing zapper [position = {}, rotation = {}, length = {}]", position, rotation, length); +  	this->transform.position = position;  	this->transform.rotation = rotation; @@ -98,6 +100,8 @@ void ZapperObject::place(const crepe::vec2 & position, float rotation, float len  	this->sprite.beam.data.size.x = length;  	this->collider.dimensions = offset.rotate(rotation) * 2 + vec2(30, 30) * SCALE; + +	this->set_active(true);  }  void ZapperObject::set_active(bool active) { diff --git a/game/prefab/ZapperPoolScript.cpp b/game/prefab/ZapperPoolScript.cpp index c6ce1e7..812024b 100644 --- a/game/prefab/ZapperPoolScript.cpp +++ b/game/prefab/ZapperPoolScript.cpp @@ -10,37 +10,48 @@  using namespace crepe;  using namespace std; -ZapperPoolScript::ZapperPoolScript(ZapperPoolSubScene & pool) : pool(pool) {} +ZapperPoolScript::ZapperPoolScript(std::vector<ZapperObject> && pool) : pool(pool) {}  void ZapperPoolScript::init() {  	subscribe<CreateZapperEvent>([this](const CreateZapperEvent &) {  		this->spawn_random();  		return true;  	}); + +	camera_transform = get_components_by_name<Transform>(CAMERA_NAME).back(); +	camera_camera = get_components_by_name<Camera>(CAMERA_NAME).back();  }  void ZapperPoolScript::fixed_update(crepe::duration_t) { -	if (i++ < 80) return; -	i = 0; +	for (ZapperObject & zapper : this->pool) { +		if (!zapper.active) continue; + +		if (zapper.transform.position.x < camera_transform->position.x) +			zapper.set_active(false); +	} + +	if (i-- > 0) return; +	i = 200;  	queue_event<CreateZapperEvent>();  }  void ZapperPoolScript::spawn_random() { -	OptionalRef<ZapperObject> zapper = pool.get_next_zapper(); +	OptionalRef<ZapperObject> zapper = this->get_next_zapper();  	if (!zapper) return; // pool exhausted -	vec2 pos = this->get_camera_pos(); -	pos.y = Random::f(0.5, -0.5) * HALLWAY_HEIGHT; +	vec2 pos = { +		.x = camera_transform->position.x + camera_camera->viewport_size.x / 2, +		.y = Random::f(0.5, -0.5) * HALLWAY_HEIGHT, +	};  	zapper->place(pos, 0, Random::f(400, 200)); -	logf(Log::DEBUG, "Spawning random zapper at {}", pos);  } -vec2 ZapperPoolScript::get_camera_pos() { -	Transform & transform = get_components_by_name<Transform>(CAMERA_NAME).back(); -	Camera & camera = get_components_by_name<Camera>(CAMERA_NAME).back(); - -	// right middle edge position -	return transform.position + vec2(camera.viewport_size.x / 2, 0); +OptionalRef<ZapperObject> ZapperPoolScript::get_next_zapper() { +	for (ZapperObject & zapper : this->pool) { +		if (zapper.active) continue; +		return zapper; +	} +	return {};  } diff --git a/game/prefab/ZapperPoolScript.h b/game/prefab/ZapperPoolScript.h index 7c4701c..5daba79 100644 --- a/game/prefab/ZapperPoolScript.h +++ b/game/prefab/ZapperPoolScript.h @@ -2,11 +2,14 @@  #include <crepe/api/Script.h> +#include "ZapperObject.h" +#include "util/OptionalRef.h" +  class ZapperPoolSubScene;  class ZapperPoolScript : public crepe::Script {  public: -	ZapperPoolScript(ZapperPoolSubScene & pool); +	ZapperPoolScript(std::vector<ZapperObject> && pool);  	void init();  	void fixed_update(crepe::duration_t); @@ -14,10 +17,12 @@ public:  	unsigned i = 0;  private: -	ZapperPoolSubScene & pool; +	std::vector<ZapperObject> pool;  private: -	crepe::vec2 get_camera_pos(); +	crepe::OptionalRef<crepe::Transform> camera_transform; +	crepe::OptionalRef<crepe::Camera> camera_camera; +	crepe::OptionalRef<ZapperObject> get_next_zapper();  private:  	void spawn_random(); diff --git a/game/prefab/ZapperPoolSubScene.cpp b/game/prefab/ZapperPoolSubScene.cpp index d7d30ea..923ed57 100644 --- a/game/prefab/ZapperPoolSubScene.cpp +++ b/game/prefab/ZapperPoolSubScene.cpp @@ -8,18 +8,12 @@ using namespace std;  ZapperPoolSubScene::ZapperPoolSubScene(Scene & scene)  	: controller { scene.new_object("controller") } { -	this->controller.add_component<BehaviorScript>().set_script<ZapperPoolScript>(*this);  	Log::logf(Log::DEBUG, "Building zapper pool..."); +	vector<ZapperObject> pool;  	for (size_t i = 0; i < this->POOL_SIZE; i++) -		zappers.emplace_back(scene.new_object("zapper")); -} - -OptionalRef<ZapperObject> ZapperPoolSubScene::get_next_zapper() { -	for (ZapperObject & zapper : this->zappers) { -		if (!zapper.active) continue; -		return zapper; -	} -	return {}; +		pool.emplace_back(scene.new_object("zapper")); +	BehaviorScript & behavior = this->controller.add_component<BehaviorScript>(); +	behavior.set_script<ZapperPoolScript>(std::move(pool));  } diff --git a/game/prefab/ZapperPoolSubScene.h b/game/prefab/ZapperPoolSubScene.h index 25328ee..f930e22 100644 --- a/game/prefab/ZapperPoolSubScene.h +++ b/game/prefab/ZapperPoolSubScene.h @@ -1,14 +1,10 @@  #pragma once -#include <vector> -  #include <crepe/api/Scene.h>  #include <crepe/api/GameObject.h>  #include <crepe/api/Event.h>  #include <crepe/util/OptionalRef.h> -#include "ZapperObject.h" -  class CreateZapperEvent : public crepe::Event {};  class ZapperPoolSubScene { @@ -17,11 +13,7 @@ public:  private:  	crepe::GameObject controller; -	std::vector<ZapperObject> zappers;  private:  	static constexpr size_t POOL_SIZE = 4; - -public: -	crepe::OptionalRef<ZapperObject> get_next_zapper();  }; |