aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-12-18 14:07:39 +0100
committerLoek Le Blansch <loek@pipeframe.xyz>2024-12-18 14:07:39 +0100
commit8dfdb5a588614db80fa8f41ccf883c1766fe56ff (patch)
tree3f5a323bc6f23ed1072bded1ac2b527c2bb031a6
parentefcb4e88c7b921684379adce2a3d09c8f9aaf3a3 (diff)
parent8afdca56d61a6c66ad1ac1bbd092192eeb827173 (diff)
merge master
-rw-r--r--src/crepe/api/Script.cpp4
-rw-r--r--src/crepe/api/Script.h16
-rw-r--r--src/crepe/system/ScriptSystem.cpp5
-rw-r--r--src/example/game.cpp2
-rw-r--r--src/test/CollisionTest.cpp1
-rw-r--r--src/test/ScriptTest.cpp22
-rw-r--r--src/test/ScriptTest.h7
7 files changed, 46 insertions, 11 deletions
diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp
index ee76011..6de6830 100644
--- a/src/crepe/api/Script.cpp
+++ b/src/crepe/api/Script.cpp
@@ -2,6 +2,7 @@
#include "../facade/SDLContext.h"
#include "../manager/SceneManager.h"
+
#include "Script.h"
using namespace crepe;
@@ -26,6 +27,8 @@ void Script::set_next_scene(const string & name) {
SaveManager & Script::get_save_manager() const { return this->mediator->save_manager; }
+LoopTimerManager & Script::get_loop_timer() const { return this->mediator->loop_timer; }
+
void Script::replay::record_start() {
ReplayManager & mgr = this->mediator->replay_manager;
return mgr.record_start();
@@ -58,3 +61,4 @@ bool Script::get_key_state(Keycode key) const noexcept {
return false;
}
}
+
diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h
index 2750df0..2422cdc 100644
--- a/src/crepe/api/Script.h
+++ b/src/crepe/api/Script.h
@@ -4,6 +4,7 @@
#include "../api/KeyCodes.h"
#include "../manager/EventManager.h"
+#include "../manager/LoopTimerManager.h"
#include "../manager/Mediator.h"
#include "../manager/ReplayManager.h"
#include "../system/CollisionSystem.h"
@@ -49,10 +50,12 @@ protected:
/**
* \brief Script update function (empty by default)
*
+ * \param delta_time Time since last fixed update
+ *
* This function is called during the ScriptSystem::update() routine if the \c BehaviorScript
* component holding this script instance is active.
*/
- virtual void update() {}
+ virtual void update(duration_t delta_time) {}
//! \}
//! ScriptSystem calls \c init() and \c update()
@@ -142,6 +145,15 @@ protected:
SaveManager & get_save_manager() const;
//! \}
+ /**
+ * \name Timing functions
+ * \see LoopTimerManager
+ * \{
+ */
+ //! Retrieve LoopTimerManager reference
+ LoopTimerManager & get_loop_timer() const;
+ //! \}
+
//! Replay management functions
struct replay { // NOLINT
//! \copydoc ReplayManager::record_start
@@ -164,7 +176,6 @@ protected:
* \see SDLContext::get_keyboard_state
*
* \return current keyboard state map with Keycode as key and bool as value(true = pressed, false = not pressed)
- *
*/
const keyboard_state_t & get_keyboard_state() const;
/**
@@ -172,7 +183,6 @@ protected:
* \see SDLContext::get_keyboard_state
*
* \return Keycode state (true if pressed, false if not pressed).
- *
*/
bool get_key_state(Keycode key) const noexcept;
diff --git a/src/crepe/system/ScriptSystem.cpp b/src/crepe/system/ScriptSystem.cpp
index 0d10011..746285f 100644
--- a/src/crepe/system/ScriptSystem.cpp
+++ b/src/crepe/system/ScriptSystem.cpp
@@ -12,6 +12,7 @@ void ScriptSystem::fixed_update() {
dbg_trace();
ComponentManager & mgr = this->mediator.component_manager;
+ LoopTimerManager & timer = this->mediator.loop_timer;
RefVector<BehaviorScript> behavior_scripts = mgr.get_components_by_type<BehaviorScript>();
for (BehaviorScript & behavior_script : behavior_scripts) {
@@ -24,6 +25,8 @@ void ScriptSystem::fixed_update() {
script->init();
script->initialized = true;
}
- script->update();
+
+ duration_t delta_time = timer.get_scaled_fixed_delta_time();
+ script->update(delta_time);
}
}
diff --git a/src/example/game.cpp b/src/example/game.cpp
index 22effd2..3975650 100644
--- a/src/example/game.cpp
+++ b/src/example/game.cpp
@@ -86,7 +86,7 @@ class MyScript1 : public Script {
subscribe<KeyPressEvent>(
[this](const KeyPressEvent & ev) -> bool { return this->keypressed(ev); });
}
- void update() {
+ void update(duration_t) {
Rigidbody & tf = this->get_component<Rigidbody>();
Log::logf("linear_velocity.x {}", tf.data.linear_velocity.x);
Log::logf("linear_velocity.y {}", tf.data.linear_velocity.y);
diff --git a/src/test/CollisionTest.cpp b/src/test/CollisionTest.cpp
index 65d592d..73a964a 100644
--- a/src/test/CollisionTest.cpp
+++ b/src/test/CollisionTest.cpp
@@ -54,6 +54,7 @@ public:
ComponentManager mgr{m};
CollisionSystem collision_sys{m};
ScriptSystem script_sys{m};
+ LoopTimerManager loop_timer{m};
GameObject world = mgr.new_object("world", "", {50, 50});
GameObject game_object1 = mgr.new_object("object1", "", {50, 50});
diff --git a/src/test/ScriptTest.cpp b/src/test/ScriptTest.cpp
index ccf5060..66b8193 100644
--- a/src/test/ScriptTest.cpp
+++ b/src/test/ScriptTest.cpp
@@ -28,7 +28,7 @@ void ScriptTest::SetUp() {
TEST_F(ScriptTest, Default) {
MyScript & script = this->script;
EXPECT_CALL(script, init()).Times(0);
- EXPECT_CALL(script, update()).Times(0);
+ EXPECT_CALL(script, update(_)).Times(0);
}
TEST_F(ScriptTest, UpdateOnce) {
@@ -38,7 +38,7 @@ TEST_F(ScriptTest, UpdateOnce) {
InSequence seq;
EXPECT_CALL(script, init()).Times(1);
- EXPECT_CALL(script, update()).Times(1);
+ EXPECT_CALL(script, update(_)).Times(1);
system.fixed_update();
}
@@ -46,7 +46,7 @@ TEST_F(ScriptTest, UpdateOnce) {
InSequence seq;
EXPECT_CALL(script, init()).Times(0);
- EXPECT_CALL(script, update()).Times(1);
+ EXPECT_CALL(script, update(_)).Times(1);
system.fixed_update();
}
}
@@ -59,7 +59,7 @@ TEST_F(ScriptTest, UpdateInactive) {
InSequence seq;
EXPECT_CALL(script, init()).Times(0);
- EXPECT_CALL(script, update()).Times(0);
+ EXPECT_CALL(script, update(_)).Times(0);
behaviorscript.active = false;
system.fixed_update();
}
@@ -68,8 +68,20 @@ TEST_F(ScriptTest, UpdateInactive) {
InSequence seq;
EXPECT_CALL(script, init()).Times(1);
- EXPECT_CALL(script, update()).Times(1);
+ EXPECT_CALL(script, update(_)).Times(1);
behaviorscript.active = true;
system.fixed_update();
}
}
+
+TEST_F(ScriptTest, SaveManager) {
+ MyScript & script = this->script;
+
+ EXPECT_EQ(&script.get_save_manager(), &this->save_manager);
+}
+
+TEST_F(ScriptTest, LoopTimerManager) {
+ MyScript & script = this->script;
+
+ EXPECT_EQ(&script.get_loop_timer(), &this->loop_timer);
+}
diff --git a/src/test/ScriptTest.h b/src/test/ScriptTest.h
index 31fa7c9..f3dbda4 100644
--- a/src/test/ScriptTest.h
+++ b/src/test/ScriptTest.h
@@ -7,7 +7,10 @@
#include <crepe/api/Script.h>
#include <crepe/manager/ComponentManager.h>
#include <crepe/manager/EventManager.h>
+#include <crepe/manager/LoopTimerManager.h>
+#include <crepe/manager/SaveManager.h>
#include <crepe/system/ScriptSystem.h>
+
class ScriptTest : public testing::Test {
protected:
crepe::Mediator mediator;
@@ -17,6 +20,8 @@ public:
crepe::ComponentManager component_manager{mediator};
crepe::ScriptSystem system{mediator};
crepe::EventManager event_mgr{mediator};
+ crepe::LoopTimerManager loop_timer{mediator};
+ crepe::SaveManager save_manager{mediator};
crepe::GameObject entity = component_manager.new_object(OBJ_NAME);
class MyScript : public crepe::Script {
@@ -24,7 +29,7 @@ public:
public:
MOCK_METHOD(void, init, (), (override));
- MOCK_METHOD(void, update, (), (override));
+ MOCK_METHOD(void, update, (crepe::duration_t), (override));
};
crepe::OptionalRef<crepe::BehaviorScript> behaviorscript;