Skip to content

Commit afdc329

Browse files
committed
Implement motion_xposition block
1 parent 64fe2da commit afdc329

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

src/blocks/motionblocks.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void MotionBlocks::registerBlocks(IEngine *engine)
3939
engine->addCompileFunction(this, "motion_changeyby", &compileChangeYBy);
4040
engine->addCompileFunction(this, "motion_sety", &compileSetY);
4141
engine->addCompileFunction(this, "motion_setrotationstyle", &compileSetRotationStyle);
42+
engine->addCompileFunction(this, "motion_xposition", &compileXPosition);
4243

4344
// Inputs
4445
engine->addInput(this, "STEPS", STEPS);
@@ -215,6 +216,11 @@ void MotionBlocks::compileSetRotationStyle(Compiler *compiler)
215216
}
216217
}
217218

219+
void MotionBlocks::compileXPosition(Compiler *compiler)
220+
{
221+
compiler->addFunctionCall(&xPosition);
222+
}
223+
218224
unsigned int MotionBlocks::moveSteps(VirtualMachine *vm)
219225
{
220226
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
@@ -646,3 +652,15 @@ unsigned int MotionBlocks::setAllAroundRotationStyle(VirtualMachine *vm)
646652

647653
return 0;
648654
}
655+
656+
unsigned int MotionBlocks::xPosition(VirtualMachine *vm)
657+
{
658+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
659+
660+
if (sprite)
661+
vm->addReturnValue(sprite->x());
662+
else
663+
vm->addReturnValue(0);
664+
665+
return 0;
666+
}

src/blocks/motionblocks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class MotionBlocks : public IBlockSection
6262
static void compileChangeYBy(Compiler *compiler);
6363
static void compileSetY(Compiler *compiler);
6464
static void compileSetRotationStyle(Compiler *compiler);
65+
static void compileXPosition(Compiler *compiler);
6566

6667
static unsigned int moveSteps(VirtualMachine *vm);
6768
static unsigned int turnRight(VirtualMachine *vm);
@@ -98,6 +99,7 @@ class MotionBlocks : public IBlockSection
9899
static unsigned int setLeftRightRotationStyle(VirtualMachine *vm);
99100
static unsigned int setDoNotRotateRotationStyle(VirtualMachine *vm);
100101
static unsigned int setAllAroundRotationStyle(VirtualMachine *vm);
102+
static unsigned int xPosition(VirtualMachine *vm);
101103

102104
static IRandomGenerator *rng;
103105
static IClock *clock;

test/blocks/motion_blocks_test.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ TEST_F(MotionBlocksTest, RegisterBlocks)
111111
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_changeyby", &MotionBlocks::compileChangeYBy));
112112
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_sety", &MotionBlocks::compileSetY));
113113
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_setrotationstyle", &MotionBlocks::compileSetRotationStyle));
114+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_xposition", &MotionBlocks::compileXPosition));
114115

115116
// Inputs
116117
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "STEPS", MotionBlocks::STEPS));
@@ -1153,3 +1154,37 @@ TEST_F(MotionBlocksTest, SetRotationStyleImpl)
11531154
ASSERT_EQ(vm.registerCount(), 0);
11541155
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::AllAround);
11551156
}
1157+
1158+
TEST_F(MotionBlocksTest, XPosition)
1159+
{
1160+
Compiler compiler(&m_engineMock);
1161+
1162+
auto block = std::make_shared<Block>("a", "motion_xposition");
1163+
1164+
EXPECT_CALL(m_engineMock, functionIndex(&MotionBlocks::xPosition)).WillOnce(Return(0));
1165+
1166+
compiler.init();
1167+
compiler.setBlock(block);
1168+
MotionBlocks::compileXPosition(&compiler);
1169+
compiler.end();
1170+
1171+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }));
1172+
ASSERT_TRUE(compiler.constValues().empty());
1173+
}
1174+
1175+
TEST_F(MotionBlocksTest, XPositionImpl)
1176+
{
1177+
static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
1178+
static BlockFunc functions[] = { &MotionBlocks::xPosition };
1179+
1180+
Sprite sprite;
1181+
sprite.setX(198.0874);
1182+
1183+
VirtualMachine vm(&sprite, nullptr, nullptr);
1184+
vm.setBytecode(bytecode);
1185+
vm.setFunctions(functions);
1186+
vm.run();
1187+
1188+
ASSERT_EQ(vm.registerCount(), 1);
1189+
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 198.0874);
1190+
}

0 commit comments

Comments
 (0)