Skip to content

Commit 9a1d262

Browse files
committed
Handle invisible sprites in touchingSprite()
1 parent 353692d commit 9a1d262

File tree

4 files changed

+48
-3
lines changed

4 files changed

+48
-3
lines changed

src/scratch/sprite.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ Target *Sprite::dataSource() const
479479

480480
bool Sprite::touchingClones(const std::vector<Sprite *> &clones) const
481481
{
482-
if (!impl->iface)
482+
if (!impl->iface || !impl->visible) // If the sprite invisible, it cannot touch anything
483483
return false;
484484

485485
return impl->iface->touchingClones(clones);

src/scratch/target.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,11 +443,11 @@ bool Target::touchingSprite(Sprite *sprite) const
443443
assert(firstClone);
444444
std::vector<Sprite *> clones;
445445

446-
if (firstClone != this) // TODO: Filter clones that are being dragged, including firstClone
446+
if (firstClone != this && firstClone->visible()) // TODO: Filter clones that are being dragged, including firstClone
447447
clones.push_back(firstClone);
448448

449449
for (auto clone : firstClone->clones()) {
450-
if (clone.get() != this) // TODO: Filter clones that are being dragged
450+
if (clone.get() != this && clone->visible()) // TODO: Filter clones that are being dragged
451451
clones.push_back(clone.get());
452452
}
453453

test/scratch_classes/sprite_test.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,18 @@ TEST(SpriteTest, TouchingSprite)
673673
})));
674674
ASSERT_FALSE(clone2->touchingSprite(clone2.get()));
675675
ASSERT_EQ(clones, actualClones);
676+
677+
// If the sprite is invisible, it cannot touch anything
678+
EXPECT_CALL(iface, onVisibleChanged).Times(2);
679+
sprite.setVisible(false);
680+
EXPECT_CALL(iface, touchingClones).Times(0);
681+
ASSERT_FALSE(sprite.touchingSprite(&another));
682+
683+
sprite.setVisible(true);
684+
EXPECT_CALL(iface3, onVisibleChanged);
685+
clone2->setVisible(false);
686+
EXPECT_CALL(iface, touchingClones).Times(0);
687+
ASSERT_FALSE(clone2->touchingSprite(&another));
676688
}
677689

678690
TEST(SpriteTest, TouchingPoint)

test/scratch_classes/target_test.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,39 @@ TEST(TargetTest, TouchingSprite)
619619
})));
620620
ASSERT_TRUE(target.touchingSprite(clone2.get()));
621621
ASSERT_EQ(clones, actualClones);
622+
623+
// Pass an invisible sprite
624+
clone2->setVisible(false);
625+
clones.erase(clones.begin() + 2);
626+
EXPECT_CALL(target, touchingClones(_)).WillOnce(WithArgs<0>(Invoke([&clones, &actualClones](const std::vector<Sprite *> &candidates) {
627+
actualClones = candidates;
628+
return true;
629+
})));
630+
ASSERT_TRUE(target.touchingSprite(clone2.get()));
631+
ASSERT_EQ(clones, actualClones);
632+
633+
EXPECT_CALL(target, touchingClones(_)).WillOnce(WithArgs<0>(Invoke([&clones, &actualClones](const std::vector<Sprite *> &candidates) {
634+
actualClones = candidates;
635+
return true;
636+
})));
637+
ASSERT_TRUE(target.touchingSprite(&sprite));
638+
ASSERT_EQ(clones, actualClones);
639+
640+
sprite.setVisible(false);
641+
clones.erase(clones.begin());
642+
EXPECT_CALL(target, touchingClones(_)).WillOnce(WithArgs<0>(Invoke([&clones, &actualClones](const std::vector<Sprite *> &candidates) {
643+
actualClones = candidates;
644+
return true;
645+
})));
646+
ASSERT_TRUE(target.touchingSprite(clone3.get()));
647+
ASSERT_EQ(clones, actualClones);
648+
649+
EXPECT_CALL(target, touchingClones(_)).WillOnce(WithArgs<0>(Invoke([&clones, &actualClones](const std::vector<Sprite *> &candidates) {
650+
actualClones = candidates;
651+
return true;
652+
})));
653+
ASSERT_TRUE(target.touchingSprite(&sprite));
654+
ASSERT_EQ(clones, actualClones);
622655
}
623656

624657
TEST(TargetTest, TouchingPoint)

0 commit comments

Comments
 (0)