Skip to content

Commit c376cee

Browse files
committed
Add key state methods to IEngine
1 parent bb7382f commit c376cee

File tree

5 files changed

+70
-2
lines changed

5 files changed

+70
-2
lines changed

include/scratchcpp/iengine.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ class LIBSCRATCHCPP_EXPORT IEngine
9898
/*! Sets the framerate of the project. */
9999
virtual void setFps(double fps) = 0;
100100

101+
/*! Returns true if the given key is pressed. */
102+
virtual bool keyPressed(std::string name) const = 0;
103+
104+
/*! Sets the state of the given key. */
105+
virtual void setKeyState(std::string name, bool pressed) = 0;
106+
101107
/*! Returns the X coordinate of the mouse pointer. */
102108
virtual double mouseX() const = 0;
103109

src/engine/internal/engine.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,23 @@ void Engine::setFps(double fps)
378378
updateFrameDuration();
379379
}
380380

381+
bool Engine::keyPressed(std::string name) const
382+
{
383+
std::transform(name.begin(), name.end(), name.begin(), ::tolower);
384+
auto it = m_keyMap.find(name);
385+
386+
if (it == m_keyMap.cend())
387+
return false;
388+
else
389+
return it->second;
390+
}
391+
392+
void Engine::setKeyState(std::string name, bool pressed)
393+
{
394+
std::transform(name.begin(), name.end(), name.begin(), ::tolower);
395+
m_keyMap[name] = pressed;
396+
}
397+
381398
double Engine::mouseX() const
382399
{
383400
return m_mouseX;

src/engine/internal/engine.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ class Engine : public IEngine
4242
double fps() const override;
4343
void setFps(double fps) override;
4444

45+
bool keyPressed(std::string name) const override;
46+
void setKeyState(std::string name, bool pressed) override;
47+
4548
double mouseX() const override;
4649
void setMouseX(double x) override;
4750

@@ -130,8 +133,9 @@ class Engine : public IEngine
130133

131134
std::unique_ptr<ITimer> m_defaultTimer;
132135
ITimer *m_timer = nullptr;
133-
double m_fps = 30; // default FPS
134-
std::chrono::milliseconds m_frameDuration; // will be computed in run()
136+
double m_fps = 30; // default FPS
137+
std::chrono::milliseconds m_frameDuration; // will be computed in run()
138+
std::unordered_map<std::string, bool> m_keyMap; // holds key states
135139
double m_mouseX = 0;
136140
double m_mouseY = 0;
137141
unsigned int m_stageWidth = 480;

test/engine/engine_test.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,44 @@ TEST(EngineTest, Fps)
6161
ASSERT_EQ(engine.fps(), 60.25);
6262
}
6363

64+
TEST(EngineTest, KeyState)
65+
{
66+
Engine engine;
67+
ASSERT_FALSE(engine.keyPressed("a"));
68+
ASSERT_FALSE(engine.keyPressed("b"));
69+
ASSERT_FALSE(engine.keyPressed("up arrow"));
70+
71+
engine.setKeyState("a", true);
72+
ASSERT_TRUE(engine.keyPressed("a"));
73+
ASSERT_FALSE(engine.keyPressed("b"));
74+
ASSERT_FALSE(engine.keyPressed("up arrow"));
75+
76+
engine.setKeyState("up arrow", true);
77+
ASSERT_TRUE(engine.keyPressed("a"));
78+
ASSERT_FALSE(engine.keyPressed("b"));
79+
ASSERT_TRUE(engine.keyPressed("up arrow"));
80+
81+
engine.setKeyState("b", true);
82+
ASSERT_TRUE(engine.keyPressed("a"));
83+
ASSERT_TRUE(engine.keyPressed("b"));
84+
ASSERT_TRUE(engine.keyPressed("up arrow"));
85+
86+
engine.setKeyState("a", false);
87+
ASSERT_FALSE(engine.keyPressed("a"));
88+
ASSERT_TRUE(engine.keyPressed("b"));
89+
ASSERT_TRUE(engine.keyPressed("up arrow"));
90+
91+
engine.setKeyState("up arrow", false);
92+
ASSERT_FALSE(engine.keyPressed("a"));
93+
ASSERT_TRUE(engine.keyPressed("b"));
94+
ASSERT_FALSE(engine.keyPressed("up arrow"));
95+
96+
engine.setKeyState("b", false);
97+
ASSERT_FALSE(engine.keyPressed("a"));
98+
ASSERT_FALSE(engine.keyPressed("b"));
99+
ASSERT_FALSE(engine.keyPressed("up arrow"));
100+
}
101+
64102
TEST(EngineTest, MouseX)
65103
{
66104
Engine engine;

test/mocks/enginemock.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ class EngineMock : public IEngine
3030
MOCK_METHOD(double, fps, (), (const, override));
3131
MOCK_METHOD(void, setFps, (double fps), (override));
3232

33+
MOCK_METHOD(bool, keyPressed, (std::string), (const, override));
34+
MOCK_METHOD(void, setKeyState, (std::string, bool), (override));
35+
3336
MOCK_METHOD(double, mouseX, (), (const, override));
3437
MOCK_METHOD(void, setMouseX, (double x), (override));
3538

0 commit comments

Comments
 (0)