Skip to content

Commit 5fad56b

Browse files
committed
Implement looks_goforwardbackwardlayers block
1 parent 4e3b3cd commit 5fad56b

File tree

3 files changed

+187
-0
lines changed

3 files changed

+187
-0
lines changed

src/blocks/looksblocks.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ void LooksBlocks::registerBlocks(IEngine *engine)
5555
engine->addCompileFunction(this, "looks_nextcostume", &compileNextCostume);
5656
engine->addCompileFunction(this, "looks_switchbackdropto", &compileSwitchBackdropTo);
5757
engine->addCompileFunction(this, "looks_gotofrontback", &compileGoToFrontBack);
58+
engine->addCompileFunction(this, "looks_goforwardbackwardlayers", &compileGoForwardBackwardLayers);
5859
}
5960

6061
void LooksBlocks::onInit(IEngine *engine)
@@ -253,6 +254,29 @@ CompilerValue *LooksBlocks::compileGoToFrontBack(Compiler *compiler)
253254
return nullptr;
254255
}
255256

257+
CompilerValue *LooksBlocks::compileGoForwardBackwardLayers(Compiler *compiler)
258+
{
259+
if (compiler->target()->isStage())
260+
return nullptr;
261+
262+
Field *field = compiler->field("FORWARD_BACKWARD");
263+
264+
if (!field)
265+
return nullptr;
266+
267+
const std::string &option = field->value().toString();
268+
269+
if (option == "forward") {
270+
auto layers = compiler->addInput("NUM");
271+
compiler->addFunctionCallWithCtx("looks_move_forward_layers", Compiler::StaticType::Void, { Compiler::StaticType::Number }, { layers });
272+
} else if (option == "backward") {
273+
auto layers = compiler->addInput("NUM");
274+
compiler->addFunctionCallWithCtx("looks_move_backward_layers", Compiler::StaticType::Void, { Compiler::StaticType::Number }, { layers });
275+
}
276+
277+
return nullptr;
278+
}
279+
256280
extern "C" void looks_start_stack_timer(ExecutionContext *ctx, double duration)
257281
{
258282
ctx->stackTimer()->start(duration);
@@ -458,3 +482,15 @@ extern "C" void looks_move_to_back(ExecutionContext *ctx)
458482
Target *target = ctx->thread()->target();
459483
ctx->engine()->moveDrawableToBack(target);
460484
}
485+
486+
extern "C" void looks_move_forward_layers(ExecutionContext *ctx, double layers)
487+
{
488+
Target *target = ctx->thread()->target();
489+
ctx->engine()->moveDrawableForwardLayers(target, layers);
490+
}
491+
492+
extern "C" void looks_move_backward_layers(ExecutionContext *ctx, double layers)
493+
{
494+
Target *target = ctx->thread()->target();
495+
ctx->engine()->moveDrawableBackwardLayers(target, layers);
496+
}

src/blocks/looksblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class LooksBlocks : public IExtension
4343
static CompilerValue *compileNextCostume(Compiler *compiler);
4444
static CompilerValue *compileSwitchBackdropTo(Compiler *compiler);
4545
static CompilerValue *compileGoToFrontBack(Compiler *compiler);
46+
static CompilerValue *compileGoForwardBackwardLayers(Compiler *compiler);
4647
};
4748

4849
} // namespace libscratchcpp

test/blocks/looks_blocks_test.cpp

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,3 +1692,153 @@ TEST_F(LooksBlocksTest, GoToFrontBack_MoveStageToBack)
16921692
builder.run();
16931693
ASSERT_EQ(sprite->layerOrder(), 0);
16941694
}
1695+
1696+
TEST_F(LooksBlocksTest, GoForwardBackwardLayers_MoveSpriteForwardPositive)
1697+
{
1698+
auto stage = std::make_shared<Stage>();
1699+
auto sprite = std::make_shared<Sprite>();
1700+
auto sprite1 = std::make_shared<Sprite>();
1701+
auto sprite2 = std::make_shared<Sprite>();
1702+
auto sprite3 = std::make_shared<Sprite>();
1703+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1704+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1705+
1706+
builder.addBlock("looks_goforwardbackwardlayers");
1707+
builder.addDropdownField("FORWARD_BACKWARD", "forward");
1708+
builder.addValueInput("NUM", 2);
1709+
builder.build();
1710+
1711+
// sprite, sprite1, sprite3, sprite2
1712+
m_engine->moveDrawableToFront(sprite1.get());
1713+
m_engine->moveDrawableToFront(sprite3.get());
1714+
m_engine->moveDrawableToFront(sprite2.get());
1715+
m_engine->moveDrawableToBack(sprite.get());
1716+
1717+
// sprite1, sprite3, sprite, sprite2
1718+
builder.run();
1719+
ASSERT_GT(sprite->layerOrder(), sprite1->layerOrder());
1720+
ASSERT_GT(sprite->layerOrder(), sprite3->layerOrder());
1721+
ASSERT_LT(sprite->layerOrder(), sprite2->layerOrder());
1722+
}
1723+
1724+
TEST_F(LooksBlocksTest, GoForwardBackwardLayers_MoveSpriteForwardNegative)
1725+
{
1726+
auto stage = std::make_shared<Stage>();
1727+
auto sprite = std::make_shared<Sprite>();
1728+
auto sprite1 = std::make_shared<Sprite>();
1729+
auto sprite2 = std::make_shared<Sprite>();
1730+
auto sprite3 = std::make_shared<Sprite>();
1731+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1732+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1733+
1734+
builder.addBlock("looks_goforwardbackwardlayers");
1735+
builder.addDropdownField("FORWARD_BACKWARD", "forward");
1736+
builder.addValueInput("NUM", -1);
1737+
builder.build();
1738+
1739+
// sprite1, sprite3, sprite2, sprite
1740+
m_engine->moveDrawableToFront(sprite1.get());
1741+
m_engine->moveDrawableToFront(sprite3.get());
1742+
m_engine->moveDrawableToFront(sprite2.get());
1743+
m_engine->moveDrawableToFront(sprite.get());
1744+
1745+
// sprite1, sprite3, sprite, sprite2
1746+
builder.run();
1747+
ASSERT_GT(sprite->layerOrder(), sprite1->layerOrder());
1748+
ASSERT_GT(sprite->layerOrder(), sprite3->layerOrder());
1749+
ASSERT_LT(sprite->layerOrder(), sprite2->layerOrder());
1750+
}
1751+
1752+
TEST_F(LooksBlocksTest, GoForwardBackwardLayers_MoveSpriteBackwardPositive)
1753+
{
1754+
auto stage = std::make_shared<Stage>();
1755+
auto sprite = std::make_shared<Sprite>();
1756+
auto sprite1 = std::make_shared<Sprite>();
1757+
auto sprite2 = std::make_shared<Sprite>();
1758+
auto sprite3 = std::make_shared<Sprite>();
1759+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1760+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1761+
1762+
builder.addBlock("looks_goforwardbackwardlayers");
1763+
builder.addDropdownField("FORWARD_BACKWARD", "backward");
1764+
builder.addValueInput("NUM", 1);
1765+
builder.build();
1766+
1767+
// sprite1, sprite3, sprite2, sprite
1768+
m_engine->moveDrawableToFront(sprite1.get());
1769+
m_engine->moveDrawableToFront(sprite3.get());
1770+
m_engine->moveDrawableToFront(sprite2.get());
1771+
m_engine->moveDrawableToFront(sprite.get());
1772+
1773+
// sprite1, sprite3, sprite, sprite2
1774+
builder.run();
1775+
ASSERT_GT(sprite->layerOrder(), sprite1->layerOrder());
1776+
ASSERT_GT(sprite->layerOrder(), sprite3->layerOrder());
1777+
ASSERT_LT(sprite->layerOrder(), sprite2->layerOrder());
1778+
}
1779+
1780+
TEST_F(LooksBlocksTest, GoForwardBackwardLayers_MoveSpriteBackwardNegative)
1781+
{
1782+
auto stage = std::make_shared<Stage>();
1783+
auto sprite = std::make_shared<Sprite>();
1784+
auto sprite1 = std::make_shared<Sprite>();
1785+
auto sprite2 = std::make_shared<Sprite>();
1786+
auto sprite3 = std::make_shared<Sprite>();
1787+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1788+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1789+
1790+
builder.addBlock("looks_goforwardbackwardlayers");
1791+
builder.addDropdownField("FORWARD_BACKWARD", "backward");
1792+
builder.addValueInput("NUM", -2);
1793+
builder.build();
1794+
1795+
// sprite, sprite1, sprite3, sprite2
1796+
m_engine->moveDrawableToFront(sprite1.get());
1797+
m_engine->moveDrawableToFront(sprite3.get());
1798+
m_engine->moveDrawableToFront(sprite2.get());
1799+
m_engine->moveDrawableToBack(sprite.get());
1800+
1801+
// sprite1, sprite3, sprite, sprite2
1802+
builder.run();
1803+
ASSERT_GT(sprite->layerOrder(), sprite1->layerOrder());
1804+
ASSERT_GT(sprite->layerOrder(), sprite3->layerOrder());
1805+
ASSERT_LT(sprite->layerOrder(), sprite2->layerOrder());
1806+
}
1807+
1808+
TEST_F(LooksBlocksTest, GoForwardBackwardLayers_MoveStageForward)
1809+
{
1810+
auto stage = std::make_shared<Stage>();
1811+
auto sprite = std::make_shared<Sprite>();
1812+
auto sprite1 = std::make_shared<Sprite>();
1813+
auto sprite2 = std::make_shared<Sprite>();
1814+
auto sprite3 = std::make_shared<Sprite>();
1815+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1816+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
1817+
1818+
builder.addBlock("looks_goforwardbackwardlayers");
1819+
builder.addDropdownField("FORWARD_BACKWARD", "forward");
1820+
builder.addValueInput("NUM", 3);
1821+
builder.build();
1822+
1823+
builder.run();
1824+
ASSERT_EQ(stage->layerOrder(), 0);
1825+
}
1826+
1827+
TEST_F(LooksBlocksTest, GoForwardBackwardLayers_MoveStageBackward)
1828+
{
1829+
auto stage = std::make_shared<Stage>();
1830+
auto sprite = std::make_shared<Sprite>();
1831+
auto sprite1 = std::make_shared<Sprite>();
1832+
auto sprite2 = std::make_shared<Sprite>();
1833+
auto sprite3 = std::make_shared<Sprite>();
1834+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1835+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
1836+
1837+
builder.addBlock("looks_goforwardbackwardlayers");
1838+
builder.addDropdownField("FORWARD_BACKWARD", "backward");
1839+
builder.addValueInput("NUM", 3);
1840+
builder.build();
1841+
1842+
builder.run();
1843+
ASSERT_EQ(stage->layerOrder(), 0);
1844+
}

0 commit comments

Comments
 (0)