Skip to content

Commit f54644a

Browse files
committed
Set costume scale based on sprite size
1 parent 2d80105 commit f54644a

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

include/scratchcpp/sprite.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class LIBSCRATCHCPP_EXPORT Sprite : public Target
4747
double size() const;
4848
void setSize(double newSize);
4949

50+
void setCurrentCostume(int newCostume);
51+
5052
double direction() const;
5153
void setDirection(double newDirection);
5254

src/scratch/sprite.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <scratchcpp/iengine.h>
66
#include <scratchcpp/variable.h>
77
#include <scratchcpp/list.h>
8+
#include <scratchcpp/costume.h>
89
#include <cassert>
910

1011
#include "sprite_p.h"
@@ -181,6 +182,24 @@ void Sprite::setSize(double newSize)
181182
impl->size = newSize;
182183
if (impl->iface)
183184
impl->iface->onSizeChanged(impl->size);
185+
186+
// TODO: Make currentCostume() return the costume (not index)
187+
auto costume = costumeAt(currentCostume() - 1);
188+
189+
if (costume)
190+
costume->setScale(newSize / 100);
191+
}
192+
193+
/*! Overrides Target#setCurrentCostume(). */
194+
void Sprite::setCurrentCostume(int newCostume)
195+
{
196+
// TODO: Make currentCostume() return the costume (not index)
197+
auto costume = costumeAt(newCostume - 1);
198+
199+
if (costume)
200+
costume->setScale(impl->size / 100);
201+
202+
Target::setCurrentCostume(newCostume);
184203
}
185204

186205
/*! Returns the direction. */

test/scratch_classes/sprite_test.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,30 @@ TEST(SpriteTest, Y)
209209

210210
TEST(SpriteTest, Size)
211211
{
212+
auto c1 = std::make_shared<Costume>("", "", "");
213+
auto c2 = std::make_shared<Costume>("", "", "");
214+
212215
Sprite sprite;
213216
ASSERT_EQ(sprite.size(), 100);
217+
sprite.addCostume(c1);
218+
sprite.addCostume(c2);
219+
sprite.setCurrentCostume(1);
220+
221+
ASSERT_EQ(c1->scale(), 1);
222+
214223
sprite.setSize(63.724);
215224
ASSERT_EQ(sprite.size(), 63.724);
225+
ASSERT_EQ(std::round(c1->scale() * 100000) / 100000, 0.63724);
226+
227+
sprite.setCurrentCostume(2);
228+
ASSERT_EQ(std::round(c2->scale() * 100000) / 100000, 0.63724);
229+
230+
sprite.setSize(186.84);
231+
ASSERT_EQ(sprite.size(), 186.84);
232+
ASSERT_EQ(std::round(c2->scale() * 10000) / 10000, 1.8684);
233+
234+
sprite.setCurrentCostume(1);
235+
ASSERT_EQ(std::round(c1->scale() * 10000) / 10000, 1.8684);
216236
}
217237

218238
TEST(SpriteTest, Direction)

0 commit comments

Comments
 (0)