aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/crepe/api/AI.cpp6
-rw-r--r--src/crepe/api/AI.h7
-rw-r--r--src/crepe/system/AISystem.cpp22
-rw-r--r--src/example/AITest.cpp6
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);