Skip to content

Commit ec69adb

Browse files
committed
Implement motion_direction block
1 parent d230416 commit ec69adb

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
@@ -41,6 +41,7 @@ void MotionBlocks::registerBlocks(IEngine *engine)
4141
engine->addCompileFunction(this, "motion_setrotationstyle", &compileSetRotationStyle);
4242
engine->addCompileFunction(this, "motion_xposition", &compileXPosition);
4343
engine->addCompileFunction(this, "motion_yposition", &compileYPosition);
44+
engine->addCompileFunction(this, "motion_direction", &compileDirection);
4445

4546
// Inputs
4647
engine->addInput(this, "STEPS", STEPS);
@@ -227,6 +228,11 @@ void MotionBlocks::compileYPosition(Compiler *compiler)
227228
compiler->addFunctionCall(&yPosition);
228229
}
229230

231+
void MotionBlocks::compileDirection(Compiler *compiler)
232+
{
233+
compiler->addFunctionCall(&direction);
234+
}
235+
230236
unsigned int MotionBlocks::moveSteps(VirtualMachine *vm)
231237
{
232238
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
@@ -682,3 +688,15 @@ unsigned int MotionBlocks::yPosition(VirtualMachine *vm)
682688

683689
return 0;
684690
}
691+
692+
unsigned int MotionBlocks::direction(VirtualMachine *vm)
693+
{
694+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
695+
696+
if (sprite)
697+
vm->addReturnValue(sprite->direction());
698+
else
699+
vm->addReturnValue(0);
700+
701+
return 0;
702+
}

src/blocks/motionblocks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class MotionBlocks : public IBlockSection
6464
static void compileSetRotationStyle(Compiler *compiler);
6565
static void compileXPosition(Compiler *compiler);
6666
static void compileYPosition(Compiler *compiler);
67+
static void compileDirection(Compiler *compiler);
6768

6869
static unsigned int moveSteps(VirtualMachine *vm);
6970
static unsigned int turnRight(VirtualMachine *vm);
@@ -102,6 +103,7 @@ class MotionBlocks : public IBlockSection
102103
static unsigned int setAllAroundRotationStyle(VirtualMachine *vm);
103104
static unsigned int xPosition(VirtualMachine *vm);
104105
static unsigned int yPosition(VirtualMachine *vm);
106+
static unsigned int direction(VirtualMachine *vm);
105107

106108
static IRandomGenerator *rng;
107109
static IClock *clock;

test/blocks/motion_blocks_test.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ TEST_F(MotionBlocksTest, RegisterBlocks)
113113
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_setrotationstyle", &MotionBlocks::compileSetRotationStyle));
114114
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_xposition", &MotionBlocks::compileXPosition));
115115
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_yposition", &MotionBlocks::compileYPosition));
116+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_direction", &MotionBlocks::compileDirection));
116117

117118
// Inputs
118119
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "STEPS", MotionBlocks::STEPS));
@@ -1223,3 +1224,37 @@ TEST_F(MotionBlocksTest, YPositionImpl)
12231224
ASSERT_EQ(vm.registerCount(), 1);
12241225
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), -68.5408);
12251226
}
1227+
1228+
TEST_F(MotionBlocksTest, Direction)
1229+
{
1230+
Compiler compiler(&m_engineMock);
1231+
1232+
auto block = std::make_shared<Block>("a", "motion_direction");
1233+
1234+
EXPECT_CALL(m_engineMock, functionIndex(&MotionBlocks::direction)).WillOnce(Return(0));
1235+
1236+
compiler.init();
1237+
compiler.setBlock(block);
1238+
MotionBlocks::compileDirection(&compiler);
1239+
compiler.end();
1240+
1241+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }));
1242+
ASSERT_TRUE(compiler.constValues().empty());
1243+
}
1244+
1245+
TEST_F(MotionBlocksTest, DirectionImpl)
1246+
{
1247+
static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
1248+
static BlockFunc functions[] = { &MotionBlocks::direction };
1249+
1250+
Sprite sprite;
1251+
sprite.setDirection(179.605);
1252+
1253+
VirtualMachine vm(&sprite, nullptr, nullptr);
1254+
vm.setBytecode(bytecode);
1255+
vm.setFunctions(functions);
1256+
vm.run();
1257+
1258+
ASSERT_EQ(vm.registerCount(), 1);
1259+
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 179.605);
1260+
}

0 commit comments

Comments
 (0)