diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/crepe/api/AI.cpp | 6 | ||||
| -rw-r--r-- | src/crepe/api/AI.h | 7 | ||||
| -rw-r--r-- | src/crepe/system/AISystem.cpp | 22 | ||||
| -rw-r--r-- | src/example/AITest.cpp | 6 | 
4 files changed, 18 insertions, 23 deletions
| diff --git a/src/crepe/api/AI.cpp b/src/crepe/api/AI.cpp index 7f820a8..d785bb5 100644 --- a/src/crepe/api/AI.cpp +++ b/src/crepe/api/AI.cpp @@ -2,10 +2,6 @@  namespace crepe { -AI::AI(game_object_id_t id, float mass, float max_speed, float max_force) -	: Component(id), -	  mass(mass), -	  max_speed(max_speed), -	  max_force(max_force) {} +AI::AI(game_object_id_t id, float max_force) : Component(id), max_force(max_force) {}  } // namespace crepe diff --git a/src/crepe/api/AI.h b/src/crepe/api/AI.h index 242ff89..046426d 100644 --- a/src/crepe/api/AI.h +++ b/src/crepe/api/AI.h @@ -16,7 +16,7 @@ public:  	};  public: -	AI(game_object_id_t id, float mass, float max_speed, float max_force); +	AI(game_object_id_t id, float max_force);  	bool on(BehaviorType behavior) const { return (flags & behavior) == behavior; }  	void seek_on() { flags |= SEEK; } @@ -37,8 +37,6 @@ public:  	}  public: -	float mass; -	float max_speed;  	float max_force;  	// The target to seek or arrive at @@ -51,9 +49,6 @@ public:  	float arrive_deceleration = 2.0f;  private: -	vec2 velocity; -	friend class AISystem; -  	int flags = 0;  }; diff --git a/src/crepe/system/AISystem.cpp b/src/crepe/system/AISystem.cpp index 3c61c78..d496e12 100644 --- a/src/crepe/system/AISystem.cpp +++ b/src/crepe/system/AISystem.cpp @@ -1,4 +1,5 @@  #include "api/LoopTimer.h" +#include "api/Rigidbody.h"  #include "api/Transform.h"  #include "manager/ComponentManager.h"  #include "manager/Mediator.h" @@ -16,16 +17,13 @@ void AISystem::update() {  	double dt = LoopTimer::get_instance().get_delta_time();  	for (AI & ai : ai_components) { +		RefVector<Rigidbody> rigidbodies +			= mgr.get_components_by_id<Rigidbody>(ai.game_object_id); +		Rigidbody & rigidbody = rigidbodies.front().get(); +  		vec2 force = this->calculate(ai); -		vec2 acceleration = force / ai.mass; -		ai.velocity += acceleration * dt; -		ai.velocity.truncate(ai.max_speed); - -		// Update the position -		RefVector<Transform> transforms -			= mgr.get_components_by_id<Transform>(ai.game_object_id); -		Transform & transform = transforms.front().get(); -		transform.position += ai.velocity * dt; +		vec2 acceleration = force / rigidbody.data.mass; +		rigidbody.data.linear_velocity += acceleration * dt;  	}  } @@ -69,10 +67,12 @@ vec2 AISystem::seek(const AI & ai) {  	ComponentManager & mgr = mediator.component_manager;  	RefVector<Transform> transforms = mgr.get_components_by_id<Transform>(ai.game_object_id);  	Transform & transform = transforms.front().get(); +	RefVector<Rigidbody> rigidbodies = mgr.get_components_by_id<Rigidbody>(ai.game_object_id); +	Rigidbody & rigidbody = rigidbodies.front().get();  	vec2 desired_velocity = ai.seek_target - transform.position;  	desired_velocity.normalize(); -	desired_velocity *= ai.max_speed; +	desired_velocity *= rigidbody.data.max_linear_velocity; -	return desired_velocity - ai.velocity; +	return desired_velocity - rigidbody.data.linear_velocity;  } diff --git a/src/example/AITest.cpp b/src/example/AITest.cpp index 91a529c..2b6a4d6 100644 --- a/src/example/AITest.cpp +++ b/src/example/AITest.cpp @@ -6,6 +6,7 @@  #include <crepe/api/Color.h>  #include <crepe/api/GameObject.h>  #include <crepe/api/LoopManager.h> +#include <crepe/api/Rigidbody.h>  #include <crepe/api/Scene.h>  #include <crepe/api/Script.h>  #include <crepe/api/Sprite.h> @@ -40,7 +41,10 @@ public:  		Texture img = Texture("asset/texture/test_ap43.png");  		game_object1.add_component<Sprite>(img, Color::MAGENTA,  										   Sprite::FlipSettings{false, false}, 1, 1, 195); -		game_object1.add_component<AI>(1, 200, 200).seek_on(); +		game_object1.add_component<AI>(200).seek_on(); +		game_object1.add_component<Rigidbody>(Rigidbody::Data{ +			.mass = 1.0f, .max_linear_velocity = {21, 21}, // sqrt(21^2 + 21^2) = 30 +		});  		game_object2.add_component<Camera>(Color::WHITE, ivec2{1080, 720}, vec2{1036, 780},  										   1.0f); |