diff options
Diffstat (limited to 'src/crepe/api')
| -rw-r--r-- | src/crepe/api/BoxCollider.cpp | 10 | ||||
| -rw-r--r-- | src/crepe/api/BoxCollider.h | 22 | ||||
| -rw-r--r-- | src/crepe/api/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/crepe/api/CircleCollider.cpp | 8 | ||||
| -rw-r--r-- | src/crepe/api/CircleCollider.h | 16 | ||||
| -rw-r--r-- | src/crepe/api/Event.h | 4 | ||||
| -rw-r--r-- | src/crepe/api/LoopManager.cpp | 15 | ||||
| -rw-r--r-- | src/crepe/api/Rigidbody.cpp | 4 | ||||
| -rw-r--r-- | src/crepe/api/Rigidbody.h | 125 | ||||
| -rw-r--r-- | src/crepe/api/Script.h | 1 | 
10 files changed, 170 insertions, 39 deletions
| diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp new file mode 100644 index 0000000..c097a24 --- /dev/null +++ b/src/crepe/api/BoxCollider.cpp @@ -0,0 +1,10 @@ +#include "BoxCollider.h" + +#include "../Collider.h" + +using namespace crepe; + +BoxCollider::BoxCollider(game_object_id_t game_object_id, const vec2 & offset, +						 const vec2 & dimensions) +	: Collider(game_object_id, offset), +	  dimensions(dimensions) {} diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h new file mode 100644 index 0000000..89e43d8 --- /dev/null +++ b/src/crepe/api/BoxCollider.h @@ -0,0 +1,22 @@ +#pragma once + +#include "../Collider.h" +#include "Vector2.h" +#include "types.h" + +namespace crepe { + +/** + * \brief A class representing a box-shaped collider. + *  + * This class is used for collision detection with other colliders (e.g., CircleCollider). + */ +class BoxCollider : public Collider { +public: +	BoxCollider(game_object_id_t game_object_id, const vec2 & offset, const vec2 & dimensions); + +	//! Width and height of the box collider +	vec2 dimensions; +}; + +} // namespace crepe diff --git a/src/crepe/api/CMakeLists.txt b/src/crepe/api/CMakeLists.txt index 0355b72..9f61ef5 100644 --- a/src/crepe/api/CMakeLists.txt +++ b/src/crepe/api/CMakeLists.txt @@ -13,6 +13,8 @@ target_sources(crepe PUBLIC  	Metadata.cpp  	Camera.cpp  	Animator.cpp +	BoxCollider.cpp +	CircleCollider.cpp  	IKeyListener.cpp  	IMouseListener.cpp  	LoopManager.cpp @@ -45,6 +47,8 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES  	Metadata.h  	Camera.h  	Animator.h +	BoxCollider.h +	CircleCollider.h  	EventHandler.h  	EventHandler.hpp  	Event.h diff --git a/src/crepe/api/CircleCollider.cpp b/src/crepe/api/CircleCollider.cpp new file mode 100644 index 0000000..a4271e9 --- /dev/null +++ b/src/crepe/api/CircleCollider.cpp @@ -0,0 +1,8 @@ +#include "CircleCollider.h" + +using namespace crepe; + +CircleCollider::CircleCollider(game_object_id_t game_object_id, const vec2 & offset, +							   float radius) +	: Collider(game_object_id, offset), +	  radius(radius) {} diff --git a/src/crepe/api/CircleCollider.h b/src/crepe/api/CircleCollider.h index e77a592..ebd1cb2 100644 --- a/src/crepe/api/CircleCollider.h +++ b/src/crepe/api/CircleCollider.h @@ -1,14 +1,22 @@  #pragma once + +#include "Vector2.h" +  #include "../Collider.h"  namespace crepe { +/** + * \brief A class representing a circle-shaped collider. + *  + * This class is used for collision detection with other colliders (e.g., BoxCollider). + */  class CircleCollider : public Collider {  public: -	CircleCollider(game_object_id_t game_object_id, int radius) -		: Collider(game_object_id), -		  radius(radius) {} -	int radius; +	CircleCollider(game_object_id_t game_object_id, const vec2 & offset, float radius); + +	//! Radius of the circle collider. +	float radius;  };  } // namespace crepe diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index 6298118..f2f3daf 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -112,10 +112,6 @@ public:  	//! scroll amount in y axis (from and away from the person).  	float scroll_delta = 0;  }; -/** - * \brief Event triggered during a collision between objects. - */ -class CollisionEvent : public Event {};  /**   * \brief Event triggered when text is submitted, e.g., from a text input. diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp index e4b1609..2f8a0a7 100644 --- a/src/crepe/api/LoopManager.cpp +++ b/src/crepe/api/LoopManager.cpp @@ -7,6 +7,7 @@  #include "../system/PhysicsSystem.h"  #include "../system/RenderSystem.h"  #include "../system/ScriptSystem.h" +#include "manager/EventManager.h"  #include "LoopManager.h" @@ -35,7 +36,13 @@ void LoopManager::start() {  }  void LoopManager::set_running(bool running) { this->game_running = running; } -void LoopManager::fixed_update() {} +void LoopManager::fixed_update() { +	EventManager & ev = this->mediator.event_manager; +	ev.dispatch_events(); +	this->get_system<ScriptSystem>().update(); +	this->get_system<PhysicsSystem>().update(); +	this->get_system<CollisionSystem>().update(); +}  void LoopManager::loop() {  	LoopTimer & timer = this->loop_timer; @@ -43,13 +50,13 @@ void LoopManager::loop() {  	while (game_running) {  		timer.update(); - +		  		while (timer.get_lag() >= timer.get_fixed_delta_time()) {  			this->process_input();  			this->fixed_update();  			timer.advance_fixed_update();  		} - +		  		this->update();  		this->render(); @@ -64,8 +71,8 @@ void LoopManager::loop() {  void LoopManager::setup() {  	LoopTimer & timer = this->loop_timer; -  	this->game_running = true; +	this->scene_manager.load_next_scene();  	timer.start();  	timer.set_fps(200);  	this->scene_manager.load_next_scene(); diff --git a/src/crepe/api/Rigidbody.cpp b/src/crepe/api/Rigidbody.cpp index 576ca45..8213afb 100644 --- a/src/crepe/api/Rigidbody.cpp +++ b/src/crepe/api/Rigidbody.cpp @@ -10,6 +10,4 @@ void crepe::Rigidbody::add_force_linear(const vec2 & force) {  	this->data.linear_velocity += force;  } -void crepe::Rigidbody::add_force_angular(double force) { -	this->data.angular_velocity += force; -} +void crepe::Rigidbody::add_force_angular(float force) { this->data.angular_velocity += force; } diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h index 3b0588f..b0a24f7 100644 --- a/src/crepe/api/Rigidbody.h +++ b/src/crepe/api/Rigidbody.h @@ -1,9 +1,13 @@  #pragma once +#include <cmath> +#include <set> +  #include "../Component.h"  #include "types.h" +  namespace crepe {  /** @@ -34,11 +38,11 @@ public:  	 * the systems will not move the object.  	 */  	struct PhysicsConstraints { -		//! X constraint +		//! Prevent movement along X axis  		bool x = false; -		//! Y constraint +		//! Prevent movement along Y axis  		bool y = false; -		//! rotation constraint +		//! Prevent rotation  		bool rotation = false;  	}; @@ -50,29 +54,93 @@ public:  	 */  	struct Data {  		//! objects mass -		double mass = 0.0; -		//! gravtiy scale -		double gravity_scale = 0.0; -		//! Changes if physics apply +		float mass = 0.0; +		/** +		* \brief Gravity scale factor. +		* +		* The `gravity_scale` controls how much gravity affects the object. It is a multiplier applied to the default +		* gravity force, allowing for fine-grained control over how the object responds to gravity. +		*  +		*/ +		float gravity_scale = 0; + +		//! Defines the type of the physics body, which determines how the physics system interacts with the object.  		BodyType body_type = BodyType::DYNAMIC; -		//! linear velocity of object + +		/** +		* \name Linear (positional) motion +		* +		* These variables define the linear motion (movement along the position) of an object. +		* The linear velocity is applied to the object's position in each update of the PhysicsSystem. +		* The motion is affected by the object's linear velocity, its maximum velocity, and a coefficient +		* that can scale the velocity over time. +		* +		* \{ +		*/ +		//! Linear velocity of the object (speed and direction).  		vec2 linear_velocity; -		//! maximum linear velocity of object -		vec2 max_linear_velocity; -		//! linear damping of object -		vec2 linear_damping; -		//! angular velocity of object -		double angular_velocity = 0.0; -		//! max angular velocity of object -		double max_angular_velocity = 0.0; -		//! angular damping of object -		double angular_damping = 0.0; -		//! movements constraints of object +		//! Maximum linear velocity of the object. This limits the object's speed. +		vec2 max_linear_velocity = {INFINITY, INFINITY}; +		//! Linear velocity coefficient. This scales the object's velocity for adjustment or damping. +		vec2 linear_velocity_coefficient = {1, 1}; +		//! \} + +		/** +		* \name Angular (rotational) motion +		* +		* These variables define the angular motion (rotation) of an object. +		* The angular velocity determines how quickly the object rotates, while the maximum angular velocity +		* sets a limit on the rotation speed. The angular velocity coefficient applies damping or scaling +		* to the angular velocity, which can be used to simulate friction or other effects that slow down rotation. +		* +		* \{ +		*/ +		//! Angular velocity of the object, representing the rate of rotation (in degrees). +		float angular_velocity = 0; +		//! Maximum angular velocity of the object. This limits the maximum rate of rotation. +		float max_angular_velocity = INFINITY; +		//! Angular velocity coefficient. This scales the object's angular velocity, typically used for damping. +		float angular_velocity_coefficient = 1; +		//! \} + +		/** +		* \brief Movement constraints for an object. +		* +		* The `PhysicsConstraints` struct defines the constraints that restrict an object's movement +		* in certain directions or prevent rotation. These constraints effect only the physics system +		* to prevent the object from moving or rotating in specified ways. +		*  +		*/  		PhysicsConstraints constraints; -		//! if gravity applies -		bool use_gravity = true; -		//! if object bounces -		bool bounce = false; + +		/** +		* \brief Elasticity factor of the material (bounce factor). +		* +		* The `elasticity_coefficient` controls how much of the object's velocity is retained after a collision. +		* It represents the material's ability to bounce or recover velocity upon impact. The coefficient is a value +		* above 0.0. +		* +		*/ +		float elastisity_coefficient = 0.0; + +		/** +		* \brief Offset of all colliders relative to the object's transform position. +		* +		* The `offset` defines a positional shift applied to all colliders associated with the object, relative to the object's +		* transform position. This allows for the colliders to be placed at a different position than the object's actual +		* position, without modifying the object's transform itself. +		*  +		*/ +		vec2 offset; + +		/** +		 * \brief Defines the collision layers of a GameObject. +		 * +		 * The `collision_layers` vector specifies the layers that the GameObject will collide with. +		 * Each element in the vector represents a layer ID, and the GameObject will only detect  +		 * collisions with other GameObjects that belong to these layers. +		 */ +		std::set<int> collision_layers;  	};  public: @@ -96,7 +164,16 @@ public:  	 *   	 * \param force Vector2 that is added to the angular force.  	 */ -	void add_force_angular(double force); +	void add_force_angular(float force); + +protected: +	/** +	* Ensures there is at most one Rigidbody component per entity. +	* \return Always returns 1, indicating this constraint. +	*/ +	virtual int get_instances_max() const { return 1; } +	//! ComponentManager instantiates all components +	friend class ComponentManager;  };  } // namespace crepe diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index 1b339b0..1474a09 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -3,6 +3,7 @@  #include <vector>  #include "../manager/EventManager.h" +#include "system/CollisionSystem.h"  #include "../manager/Mediator.h"  #include "../types.h"  #include "../util/OptionalRef.h" |