Skip to content

Commit d7ddd1e

Browse files
committed
Mirror costume image horizontally based on rotation style
1 parent f54644a commit d7ddd1e

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/scratch/sprite.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,10 @@ void Sprite::setCurrentCostume(int newCostume)
196196
// TODO: Make currentCostume() return the costume (not index)
197197
auto costume = costumeAt(newCostume - 1);
198198

199-
if (costume)
199+
if (costume) {
200200
costume->setScale(impl->size / 100);
201+
costume->setMirrorHorizontally(impl->rotationStyle == RotationStyle::LeftRight);
202+
}
201203

202204
Target::setCurrentCostume(newCostume);
203205
}
@@ -258,6 +260,12 @@ std::string Sprite::rotationStyleStr() const
258260
void Sprite::setRotationStyle(RotationStyle newRotationStyle)
259261
{
260262
impl->rotationStyle = newRotationStyle;
263+
// TODO: Make currentCostume() return the costume (not index)
264+
auto costume = costumeAt(currentCostume() - 1);
265+
266+
if (costume)
267+
costume->setMirrorHorizontally(newRotationStyle == RotationStyle::LeftRight);
268+
261269
if (impl->iface)
262270
impl->iface->onRotationStyleChanged(impl->rotationStyle);
263271
}

test/scratch_classes/sprite_test.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,51 +281,79 @@ TEST(SpriteTest, Draggable)
281281

282282
TEST(SpriteTest, RotationStyle)
283283
{
284+
auto c1 = std::make_shared<Costume>("", "", "");
285+
auto c2 = std::make_shared<Costume>("", "", "");
286+
284287
Sprite sprite;
285288
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::AllAround); // default
286289
ASSERT_EQ(sprite.rotationStyleStr(), "all around");
290+
sprite.addCostume(c1);
291+
sprite.addCostume(c2);
292+
sprite.setCurrentCostume(1);
293+
294+
ASSERT_EQ(c1->mirrorHorizontally(), false);
287295

288296
sprite.setRotationStyle(Sprite::RotationStyle::DoNotRotate);
289297
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::DoNotRotate);
290298
ASSERT_EQ(sprite.rotationStyleStr(), "don't rotate");
299+
ASSERT_EQ(c1->mirrorHorizontally(), false);
291300

292301
sprite.setRotationStyle(Sprite::RotationStyle::LeftRight);
293302
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::LeftRight);
294303
ASSERT_EQ(sprite.rotationStyleStr(), "left-right");
304+
ASSERT_EQ(c1->mirrorHorizontally(), true);
295305

296306
sprite.setRotationStyle(Sprite::RotationStyle::AllAround);
297307
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::AllAround);
298308
ASSERT_EQ(sprite.rotationStyleStr(), "all around");
309+
ASSERT_EQ(c1->mirrorHorizontally(), false);
299310

300311
sprite.setRotationStyle("invalid");
301312
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::AllAround); // shouldn't change
302313
ASSERT_EQ(sprite.rotationStyleStr(), "all around");
314+
ASSERT_EQ(c1->mirrorHorizontally(), false);
315+
316+
sprite.setCurrentCostume(2);
317+
sprite.setRotationStyle(Sprite::RotationStyle::LeftRight);
318+
ASSERT_EQ(c2->mirrorHorizontally(), true);
319+
320+
sprite.setCurrentCostume(1);
321+
sprite.setRotationStyle(Sprite::RotationStyle::AllAround);
322+
sprite.setCurrentCostume(2);
323+
ASSERT_EQ(c2->mirrorHorizontally(), false);
303324

304325
sprite.setRotationStyle("don't rotate");
305326
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::DoNotRotate);
306327
ASSERT_EQ(sprite.rotationStyleStr(), "don't rotate");
328+
ASSERT_EQ(c2->mirrorHorizontally(), false);
307329

308330
sprite.setRotationStyle("left-right");
309331
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::LeftRight);
310332
ASSERT_EQ(sprite.rotationStyleStr(), "left-right");
333+
ASSERT_EQ(c2->mirrorHorizontally(), true);
311334

312335
sprite.setRotationStyle("all around");
313336
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::AllAround);
314337
ASSERT_EQ(sprite.rotationStyleStr(), "all around");
338+
ASSERT_EQ(c2->mirrorHorizontally(), false);
315339

316340
sprite.setRotationStyle(std::string("invalid"));
317341
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::AllAround); // shouldn't change
318342
ASSERT_EQ(sprite.rotationStyleStr(), "all around");
343+
ASSERT_EQ(c2->mirrorHorizontally(), false);
319344

320345
sprite.setRotationStyle(std::string("don't rotate"));
321346
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::DoNotRotate);
322347
ASSERT_EQ(sprite.rotationStyleStr(), "don't rotate");
348+
ASSERT_EQ(c2->mirrorHorizontally(), false);
323349

324350
sprite.setRotationStyle(std::string("left-right"));
325351
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::LeftRight);
326352
ASSERT_EQ(sprite.rotationStyleStr(), "left-right");
353+
ASSERT_EQ(c2->mirrorHorizontally(), true);
327354

328355
sprite.setRotationStyle(std::string("all around"));
329356
ASSERT_EQ(sprite.rotationStyle(), Sprite::RotationStyle::AllAround);
330357
ASSERT_EQ(sprite.rotationStyleStr(), "all around");
358+
ASSERT_EQ(c2->mirrorHorizontally(), false);
331359
}

0 commit comments

Comments
 (0)