Skip to content

Commit b5ce55c

Browse files
committed
Complete the key state API
1 parent 1d7f622 commit b5ce55c

File tree

5 files changed

+49
-13
lines changed

5 files changed

+49
-13
lines changed

include/scratchcpp/iengine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ class LIBSCRATCHCPP_EXPORT IEngine
9999
virtual void setFps(double fps) = 0;
100100

101101
/*! Returns true if the given key is pressed. */
102-
virtual bool keyPressed(std::string name) const = 0;
102+
virtual bool keyPressed(const std::string &name) const = 0;
103103

104104
/*! Sets the state of the given key. */
105-
virtual void setKeyState(std::string name, bool pressed) = 0;
105+
virtual void setKeyState(const std::string &name, bool pressed) = 0;
106106

107107
/*! Returns the X coordinate of the mouse pointer. */
108108
virtual double mouseX() const = 0;

src/engine/internal/engine.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <scratchcpp/variable.h>
1515
#include <scratchcpp/list.h>
1616
#include <scratchcpp/costume.h>
17+
#include <scratchcpp/keyevent.h>
1718
#include <cassert>
1819
#include <iostream>
1920
#include <thread>
@@ -378,21 +379,30 @@ void Engine::setFps(double fps)
378379
updateFrameDuration();
379380
}
380381

381-
bool Engine::keyPressed(std::string name) const
382+
bool Engine::keyPressed(const std::string &name) const
382383
{
383-
std::transform(name.begin(), name.end(), name.begin(), ::tolower);
384-
auto it = m_keyMap.find(name);
384+
if (name == "any") {
385+
for (const auto &[key, value] : m_keyMap) {
386+
if (value)
387+
return true;
388+
}
389+
390+
return false;
391+
}
392+
393+
KeyEvent event(name);
394+
auto it = m_keyMap.find(event.name());
385395

386396
if (it == m_keyMap.cend())
387397
return false;
388398
else
389399
return it->second;
390400
}
391401

392-
void Engine::setKeyState(std::string name, bool pressed)
402+
void Engine::setKeyState(const std::string &name, bool pressed)
393403
{
394-
std::transform(name.begin(), name.end(), name.begin(), ::tolower);
395-
m_keyMap[name] = pressed;
404+
KeyEvent event(name);
405+
m_keyMap[event.name()] = pressed;
396406
}
397407

398408
double Engine::mouseX() const

src/engine/internal/engine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ 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;
45+
bool keyPressed(const std::string &name) const override;
46+
void setKeyState(const std::string &name, bool pressed) override;
4747

4848
double mouseX() const override;
4949
void setMouseX(double x) override;

test/engine/engine_test.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,36 +67,62 @@ TEST(EngineTest, KeyState)
6767
ASSERT_FALSE(engine.keyPressed("a"));
6868
ASSERT_FALSE(engine.keyPressed("b"));
6969
ASSERT_FALSE(engine.keyPressed("up arrow"));
70+
ASSERT_FALSE(engine.keyPressed("any"));
7071

71-
engine.setKeyState("a", true);
72+
engine.setKeyState("A", true);
7273
ASSERT_TRUE(engine.keyPressed("a"));
7374
ASSERT_FALSE(engine.keyPressed("b"));
7475
ASSERT_FALSE(engine.keyPressed("up arrow"));
76+
ASSERT_TRUE(engine.keyPressed("any"));
7577

7678
engine.setKeyState("up arrow", true);
7779
ASSERT_TRUE(engine.keyPressed("a"));
7880
ASSERT_FALSE(engine.keyPressed("b"));
7981
ASSERT_TRUE(engine.keyPressed("up arrow"));
82+
ASSERT_FALSE(engine.keyPressed("U"));
83+
ASSERT_TRUE(engine.keyPressed("any"));
8084

85+
engine.setKeyState("up arrow", false);
86+
engine.setKeyState("UP arrow", true);
87+
ASSERT_TRUE(engine.keyPressed("a"));
88+
ASSERT_FALSE(engine.keyPressed("b"));
89+
ASSERT_FALSE(engine.keyPressed("up arrow"));
90+
ASSERT_TRUE(engine.keyPressed("u"));
91+
ASSERT_TRUE(engine.keyPressed("U"));
92+
ASSERT_TRUE(engine.keyPressed("any"));
93+
94+
engine.setKeyState("up arrow", true);
8195
engine.setKeyState("b", true);
8296
ASSERT_TRUE(engine.keyPressed("a"));
8397
ASSERT_TRUE(engine.keyPressed("b"));
8498
ASSERT_TRUE(engine.keyPressed("up arrow"));
99+
ASSERT_TRUE(engine.keyPressed("any"));
85100

86101
engine.setKeyState("a", false);
87102
ASSERT_FALSE(engine.keyPressed("a"));
88103
ASSERT_TRUE(engine.keyPressed("b"));
89104
ASSERT_TRUE(engine.keyPressed("up arrow"));
105+
ASSERT_TRUE(engine.keyPressed("any"));
90106

91107
engine.setKeyState("up arrow", false);
92108
ASSERT_FALSE(engine.keyPressed("a"));
93109
ASSERT_TRUE(engine.keyPressed("b"));
94110
ASSERT_FALSE(engine.keyPressed("up arrow"));
111+
ASSERT_TRUE(engine.keyPressed("any"));
95112

96113
engine.setKeyState("b", false);
97114
ASSERT_FALSE(engine.keyPressed("a"));
98115
ASSERT_FALSE(engine.keyPressed("b"));
99116
ASSERT_FALSE(engine.keyPressed("up arrow"));
117+
ASSERT_TRUE(engine.keyPressed("any"));
118+
119+
engine.setKeyState("u", false);
120+
ASSERT_FALSE(engine.keyPressed("any"));
121+
122+
engine.setKeyState("32", true);
123+
ASSERT_TRUE(engine.keyPressed("32"));
124+
ASSERT_TRUE(engine.keyPressed("space"));
125+
ASSERT_TRUE(engine.keyPressed("any"));
100126
}
101127

102128
TEST(EngineTest, MouseX)

test/mocks/enginemock.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ 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));
33+
MOCK_METHOD(bool, keyPressed, (const std::string &), (const, override));
34+
MOCK_METHOD(void, setKeyState, (const std::string &, bool), (override));
3535

3636
MOCK_METHOD(double, mouseX, (), (const, override));
3737
MOCK_METHOD(void, setMouseX, (double x), (override));

0 commit comments

Comments
 (0)