55#include < scratchcpp/script.h>
66#include < scratchcpp/sprite.h>
77#include < scratchcpp/stage.h>
8+ #include < scratchcpp/textbubble.h>
89#include < scratchcpp/broadcast.h>
910#include < scratchcpp/compiler.h>
1011#include < scratchcpp/input.h>
@@ -1211,51 +1212,63 @@ int Engine::findTarget(const std::string &targetName) const
12111212 return it - m_targets.begin ();
12121213}
12131214
1214- void Engine::moveSpriteToFront (Sprite *sprite )
1215+ void Engine::moveDrawableToFront (Drawable *drawable )
12151216{
1216- if (!sprite || m_sortedDrawables.size () <= 2 )
1217+ if (!drawable || m_sortedDrawables.size () <= 2 )
12171218 return ;
12181219
1219- auto it = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), sprite);
1220+ if (drawable->isTarget () && static_cast <Target *>(drawable)->isStage ()) {
1221+ std::cout << " warning: cannot move stage to front" << std::endl;
1222+ assert (false );
1223+ return ;
1224+ }
1225+
1226+ auto it = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), drawable);
12201227
12211228 if (it != m_sortedDrawables.end ()) {
12221229 std::rotate (it, it + 1 , m_sortedDrawables.end ());
12231230 updateDrawableLayerOrder ();
12241231 }
12251232}
12261233
1227- void Engine::moveSpriteToBack (Sprite *sprite )
1234+ void Engine::moveDrawableToBack (Drawable *drawable )
12281235{
1229- if (!sprite || m_sortedDrawables.size () <= 2 )
1236+ if (!drawable || m_sortedDrawables.size () <= 2 )
12301237 return ;
12311238
1232- auto it = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), sprite );
1239+ auto it = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), drawable );
12331240
12341241 if (it != m_sortedDrawables.end ()) {
12351242 std::rotate (m_sortedDrawables.begin () + 1 , it, it + 1 ); // stage is always the first
12361243 updateDrawableLayerOrder ();
12371244 }
12381245}
12391246
1240- void Engine::moveSpriteForwardLayers (Sprite *sprite , int layers)
1247+ void Engine::moveDrawableForwardLayers (Drawable *drawable , int layers)
12411248{
1242- if (!sprite || layers == 0 )
1249+ if (!drawable || layers == 0 )
1250+ return ;
1251+
1252+ if (layers > 0 && drawable->isTarget () && static_cast <Target *>(drawable)->isStage ()) {
1253+ std::cout << " warning: cannot move stage forward" << std::endl;
1254+ assert (false );
12431255 return ;
1256+ }
12441257
1245- auto it = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), sprite );
1258+ auto it = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), drawable );
12461259
12471260 if (it == m_sortedDrawables.end ())
12481261 return ;
12491262
12501263 auto target = it + layers;
12511264
12521265 if (target <= m_sortedDrawables.begin ()) {
1253- moveSpriteToBack (sprite );
1266+ moveDrawableToBack (drawable );
12541267 return ;
12551268 }
12561269
12571270 if (target >= m_sortedDrawables.end ()) {
1258- moveSpriteToFront (sprite );
1271+ moveDrawableToFront (drawable );
12591272 return ;
12601273 }
12611274
@@ -1267,17 +1280,23 @@ void Engine::moveSpriteForwardLayers(Sprite *sprite, int layers)
12671280 updateDrawableLayerOrder ();
12681281}
12691282
1270- void Engine::moveSpriteBackwardLayers (Sprite *sprite , int layers)
1283+ void Engine::moveDrawableBackwardLayers (Drawable *drawable , int layers)
12711284{
1272- moveSpriteForwardLayers (sprite , -layers);
1285+ moveDrawableForwardLayers (drawable , -layers);
12731286}
12741287
1275- void Engine::moveSpriteBehindOther (Sprite *sprite, Sprite *other)
1288+ void Engine::moveDrawableBehindOther (Drawable *drawable, Drawable *other)
12761289{
1277- if (sprite == other)
1290+ if (drawable == other)
1291+ return ;
1292+
1293+ if (drawable->isTarget () && static_cast <Target *>(drawable)->isStage ()) {
1294+ std::cout << " warning: cannot move stage behind drawable" << std::endl;
1295+ assert (false );
12781296 return ;
1297+ }
12791298
1280- auto itSprite = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), sprite );
1299+ auto itSprite = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), drawable );
12811300 auto itOther = std::find (m_sortedDrawables.begin (), m_sortedDrawables.end (), other);
12821301
12831302 if ((itSprite == m_sortedDrawables.end ()) || (itOther == m_sortedDrawables.end ()))
@@ -1289,12 +1308,12 @@ void Engine::moveSpriteBehindOther(Sprite *sprite, Sprite *other)
12891308 target++;
12901309
12911310 if (target <= m_sortedDrawables.begin ()) {
1292- moveSpriteToBack (sprite );
1311+ moveDrawableToBack (drawable );
12931312 return ;
12941313 }
12951314
12961315 if (target >= m_sortedDrawables.end ()) {
1297- moveSpriteToFront (sprite );
1316+ moveDrawableToFront (drawable );
12981317 return ;
12991318 }
13001319
0 commit comments