Skip to content

Commit dbd5a53

Browse files
committed
Implement sensing_keypressed block
1 parent b5ce55c commit dbd5a53

File tree

3 files changed

+102
-1
lines changed

3 files changed

+102
-1
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ void SensingBlocks::registerBlocks(IEngine *engine)
2424
{
2525
// Blocks
2626
engine->addCompileFunction(this, "sensing_distanceto", &compileDistanceTo);
27+
engine->addCompileFunction(this, "sensing_keypressed", &compileKeyPressed);
2728
engine->addCompileFunction(this, "sensing_timer", &compileTimer);
2829
engine->addCompileFunction(this, "sensing_resettimer", &compileResetTimer);
2930
engine->addCompileFunction(this, "sensing_current", &compileCurrent);
3031
engine->addCompileFunction(this, "sensing_dayssince2000", &compileDaysSince2000);
3132

3233
// Inputs
3334
engine->addInput(this, "DISTANCETOMENU", DISTANCETOMENU);
35+
engine->addInput(this, "KEY_OPTION", KEY_OPTION);
3436

3537
// Fields
3638
engine->addField(this, "CURRENTMENU", CURRENTMENU);
@@ -66,6 +68,12 @@ void SensingBlocks::compileDistanceTo(Compiler *compiler)
6668
}
6769
}
6870

71+
void SensingBlocks::compileKeyPressed(Compiler *compiler)
72+
{
73+
compiler->addInput(KEY_OPTION);
74+
compiler->addFunctionCall(&keyPressed);
75+
}
76+
6977
void SensingBlocks::compileTimer(Compiler *compiler)
7078
{
7179
compiler->addFunctionCall(&timer);
@@ -119,6 +127,12 @@ void SensingBlocks::compileDaysSince2000(Compiler *compiler)
119127
compiler->addFunctionCall(&daysSince2000);
120128
}
121129

130+
unsigned int SensingBlocks::keyPressed(VirtualMachine *vm)
131+
{
132+
vm->replaceReturnValue(vm->engine()->keyPressed(vm->getInput(0, 1)->toString()), 1);
133+
return 0;
134+
}
135+
122136
unsigned int SensingBlocks::distanceTo(VirtualMachine *vm)
123137
{
124138
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());

src/blocks/sensingblocks.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ class SensingBlocks : public IBlockSection
1414
public:
1515
enum Inputs
1616
{
17-
DISTANCETOMENU
17+
DISTANCETOMENU,
18+
KEY_OPTION
1819
};
1920

2021
enum Fields
@@ -38,11 +39,14 @@ class SensingBlocks : public IBlockSection
3839
void registerBlocks(IEngine *engine) override;
3940

4041
static void compileDistanceTo(Compiler *compiler);
42+
static void compileKeyPressed(Compiler *compiler);
4143
static void compileTimer(Compiler *compiler);
4244
static void compileResetTimer(Compiler *compiler);
4345
static void compileCurrent(Compiler *compiler);
4446
static void compileDaysSince2000(Compiler *compiler);
4547

48+
static unsigned int keyPressed(VirtualMachine *vm);
49+
4650
static unsigned int distanceTo(VirtualMachine *vm);
4751
static unsigned int distanceToByIndex(VirtualMachine *vm);
4852
static unsigned int distanceToMousePointer(VirtualMachine *vm);

test/blocks/sensing_blocks_test.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,15 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
9898
{
9999
// Blocks
100100
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_distanceto", &SensingBlocks::compileDistanceTo));
101+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_keypressed", &SensingBlocks::compileKeyPressed));
101102
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_timer", &SensingBlocks::compileTimer));
102103
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_resettimer", &SensingBlocks::compileResetTimer));
103104
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_current", &SensingBlocks::compileCurrent));
104105
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_dayssince2000", &SensingBlocks::compileDaysSince2000));
105106

106107
// Inputs
107108
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "DISTANCETOMENU", SensingBlocks::DISTANCETOMENU));
109+
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "KEY_OPTION", SensingBlocks::KEY_OPTION));
108110

109111
// Fields
110112
EXPECT_CALL(m_engineMock, addField(m_section.get(), "CURRENTMENU", SensingBlocks::CURRENTMENU));
@@ -256,6 +258,87 @@ TEST_F(SensingBlocksTest, DistanceToImpl)
256258
ASSERT_EQ(std::round(vm.getInput(0, 1)->toDouble() * 10000) / 10000, 261.0096);
257259
}
258260

261+
TEST_F(SensingBlocksTest, KeyPressed)
262+
{
263+
Compiler compiler(&m_engineMock);
264+
265+
// key (space) pressed?
266+
auto block1 = std::make_shared<Block>("a", "sensing_keypressed");
267+
addDropdownInput(block1, "KEY_OPTION", SensingBlocks::KEY_OPTION, "space");
268+
269+
// key (any) pressed?
270+
auto block2 = std::make_shared<Block>("b", "sensing_keypressed");
271+
addDropdownInput(block2, "KEY_OPTION", SensingBlocks::KEY_OPTION, "any");
272+
273+
// key (join "" "") pressed?
274+
auto joinBlock = std::make_shared<Block>("d", "operator_join");
275+
joinBlock->setCompileFunction(&OperatorBlocks::compileJoin);
276+
auto block3 = std::make_shared<Block>("c", "sensing_keypressed");
277+
addDropdownInput(block3, "KEY_OPTION", SensingBlocks::KEY_OPTION, "", joinBlock);
278+
279+
compiler.init();
280+
281+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::keyPressed)).WillOnce(Return(0));
282+
compiler.setBlock(block1);
283+
SensingBlocks::compileKeyPressed(&compiler);
284+
285+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::keyPressed)).WillOnce(Return(0));
286+
compiler.setBlock(block2);
287+
SensingBlocks::compileKeyPressed(&compiler);
288+
289+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::keyPressed)).WillOnce(Return(0));
290+
compiler.setBlock(block3);
291+
SensingBlocks::compileKeyPressed(&compiler);
292+
293+
compiler.end();
294+
295+
ASSERT_EQ(
296+
compiler.bytecode(),
297+
std::vector<unsigned int>({ vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_CONST, 1, vm::OP_EXEC, 0, vm::OP_NULL, vm::OP_NULL, vm::OP_STR_CONCAT, vm::OP_EXEC, 0, vm::OP_HALT }));
298+
ASSERT_EQ(compiler.constValues(), std::vector<Value>({ "space", "any" }));
299+
}
300+
301+
TEST_F(SensingBlocksTest, KeyPressedImpl)
302+
{
303+
static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_HALT };
304+
static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 1, vm::OP_EXEC, 0, vm::OP_HALT };
305+
static BlockFunc functions[] = { &SensingBlocks::keyPressed };
306+
static Value constValues[] = { "space", "any" };
307+
308+
VirtualMachine vm(nullptr, &m_engineMock, nullptr);
309+
vm.setFunctions(functions);
310+
vm.setConstValues(constValues);
311+
312+
EXPECT_CALL(m_engineMock, keyPressed("space")).WillOnce(Return(true));
313+
vm.setBytecode(bytecode1);
314+
vm.run();
315+
316+
ASSERT_EQ(vm.registerCount(), 1);
317+
ASSERT_EQ(vm.getInput(0, 1)->toBool(), true);
318+
319+
EXPECT_CALL(m_engineMock, keyPressed("space")).WillOnce(Return(false));
320+
vm.reset();
321+
vm.run();
322+
323+
ASSERT_EQ(vm.registerCount(), 1);
324+
ASSERT_EQ(vm.getInput(0, 1)->toBool(), false);
325+
326+
EXPECT_CALL(m_engineMock, keyPressed("any")).WillOnce(Return(true));
327+
vm.reset();
328+
vm.setBytecode(bytecode2);
329+
vm.run();
330+
331+
ASSERT_EQ(vm.registerCount(), 1);
332+
ASSERT_EQ(vm.getInput(0, 1)->toBool(), true);
333+
334+
EXPECT_CALL(m_engineMock, keyPressed("any")).WillOnce(Return(false));
335+
vm.reset();
336+
vm.run();
337+
338+
ASSERT_EQ(vm.registerCount(), 1);
339+
ASSERT_EQ(vm.getInput(0, 1)->toBool(), false);
340+
}
341+
259342
TEST_F(SensingBlocksTest, Timer)
260343
{
261344
Compiler compiler(&m_engineMock);

0 commit comments

Comments
 (0)