Skip to content

Commit 344175a

Browse files
authored
Merge pull request #311 from scratchcpp/costume_index
Get and set costumes by index
2 parents d3c71da + 6470e72 commit 344175a

File tree

14 files changed

+206
-195
lines changed

14 files changed

+206
-195
lines changed

include/scratchcpp/sprite.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class LIBSCRATCHCPP_EXPORT Sprite : public Target
5050
double size() const;
5151
void setSize(double newSize);
5252

53-
void setCurrentCostume(int newCostume);
53+
void setCostumeIndex(int newCostumeIndex);
5454

5555
double direction() const;
5656
void setDirection(double newDirection);

include/scratchcpp/target.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ class LIBSCRATCHCPP_EXPORT Target
5050
int findBlock(const std::string &id) const;
5151
std::vector<std::shared_ptr<Block>> greenFlagBlocks() const;
5252

53-
int currentCostume() const;
54-
void setCurrentCostume(int newCostume);
53+
int costumeIndex() const;
54+
void setCostumeIndex(int newCostumeIndex);
55+
56+
std::shared_ptr<Costume> currentCostume() const;
5557

5658
const std::vector<std::shared_ptr<Costume>> &costumes() const;
5759
int addCostume(std::shared_ptr<Costume> costume);

src/blocks/looksblocks.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ void LooksBlocks::setCostumeByIndex(Target *target, long index)
653653
index = std::fmod(index, costumeCount);
654654
}
655655

656-
target->setCurrentCostume(index + 1);
656+
target->setCostumeIndex(index);
657657
}
658658

659659
unsigned int LooksBlocks::switchCostumeToByIndex(VirtualMachine *vm)
@@ -693,15 +693,15 @@ unsigned int LooksBlocks::switchCostumeTo(VirtualMachine *vm)
693693
unsigned int LooksBlocks::nextCostume(VirtualMachine *vm)
694694
{
695695
if (Target *target = vm->target())
696-
setCostumeByIndex(target, target->currentCostume());
696+
setCostumeByIndex(target, target->costumeIndex() + 1);
697697

698698
return 0;
699699
}
700700

701701
unsigned int LooksBlocks::previousCostume(VirtualMachine *vm)
702702
{
703703
if (Target *target = vm->target())
704-
setCostumeByIndex(target, target->currentCostume() - 2);
704+
setCostumeByIndex(target, target->costumeIndex() - 1);
705705

706706
return 0;
707707
}
@@ -710,7 +710,7 @@ void LooksBlocks::startBackdropScripts(VirtualMachine *vm, bool wait)
710710
{
711711
if (Stage *stage = vm->engine()->stage()) {
712712
if (stage->costumes().size() > 0)
713-
vm->engine()->broadcastByPtr(stage->costumeAt(stage->currentCostume() - 1)->broadcast(), vm, wait);
713+
vm->engine()->broadcastByPtr(stage->currentCostume()->broadcast(), vm, wait);
714714
}
715715
}
716716

@@ -749,13 +749,13 @@ void LooksBlocks::switchBackdropToImpl(VirtualMachine *vm)
749749
void LooksBlocks::nextBackdropImpl(VirtualMachine *vm)
750750
{
751751
if (Stage *stage = vm->engine()->stage())
752-
setCostumeByIndex(stage, stage->currentCostume());
752+
setCostumeByIndex(stage, stage->costumeIndex() + 1);
753753
}
754754

755755
void LooksBlocks::previousBackdropImpl(VirtualMachine *vm)
756756
{
757757
if (Stage *stage = vm->engine()->stage())
758-
setCostumeByIndex(stage, stage->currentCostume() - 2);
758+
setCostumeByIndex(stage, stage->costumeIndex() - 1);
759759
}
760760

761761
void LooksBlocks::randomBackdropImpl(VirtualMachine *vm)
@@ -767,7 +767,7 @@ void LooksBlocks::randomBackdropImpl(VirtualMachine *vm)
767767
std::size_t count = stage->costumes().size();
768768

769769
if (count > 0)
770-
stage->setCurrentCostume(rng->randint(1, count));
770+
stage->setCostumeIndex(rng->randint(0, count - 1));
771771
}
772772
}
773773

@@ -854,7 +854,7 @@ unsigned int LooksBlocks::randomBackdropAndWait(VirtualMachine *vm)
854854
unsigned int LooksBlocks::checkBackdropScripts(VirtualMachine *vm)
855855
{
856856
if (Stage *stage = vm->engine()->stage()) {
857-
if ((stage->costumes().size() > 0) && vm->engine()->broadcastByPtrRunning(stage->costumeAt(stage->currentCostume() - 1)->broadcast(), vm))
857+
if ((stage->costumes().size() > 0) && vm->engine()->broadcastByPtrRunning(stage->currentCostume()->broadcast(), vm))
858858
vm->stop(true, true, true);
859859
}
860860

@@ -864,7 +864,7 @@ unsigned int LooksBlocks::checkBackdropScripts(VirtualMachine *vm)
864864
unsigned int LooksBlocks::costumeNumber(VirtualMachine *vm)
865865
{
866866
if (Target *target = vm->target())
867-
vm->addReturnValue(target->currentCostume());
867+
vm->addReturnValue(target->costumeIndex() + 1);
868868
else
869869
vm->addReturnValue(0);
870870

@@ -874,7 +874,7 @@ unsigned int LooksBlocks::costumeNumber(VirtualMachine *vm)
874874
unsigned int LooksBlocks::costumeName(VirtualMachine *vm)
875875
{
876876
if (Target *target = vm->target()) {
877-
auto costume = target->costumeAt(target->currentCostume() - 1);
877+
auto costume = target->currentCostume();
878878

879879
if (costume)
880880
vm->addReturnValue(costume->name());
@@ -889,7 +889,7 @@ unsigned int LooksBlocks::costumeName(VirtualMachine *vm)
889889
unsigned int LooksBlocks::backdropNumber(VirtualMachine *vm)
890890
{
891891
if (Stage *stage = vm->engine()->stage())
892-
vm->addReturnValue(stage->currentCostume());
892+
vm->addReturnValue(stage->costumeIndex() + 1);
893893
else
894894
vm->addReturnValue(0);
895895

@@ -899,7 +899,7 @@ unsigned int LooksBlocks::backdropNumber(VirtualMachine *vm)
899899
unsigned int LooksBlocks::backdropName(VirtualMachine *vm)
900900
{
901901
if (Stage *stage = vm->engine()->stage()) {
902-
auto costume = stage->costumeAt(stage->currentCostume() - 1);
902+
auto costume = stage->currentCostume();
903903

904904
if (costume)
905905
vm->addReturnValue(costume->name());

src/blocks/sensingblocks.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ unsigned int SensingBlocks::costumeNumberOfSprite(VirtualMachine *vm)
475475
Sprite *sprite = dynamic_cast<Sprite *>(target);
476476

477477
if (sprite)
478-
vm->replaceReturnValue(sprite->currentCostume(), 1);
478+
vm->replaceReturnValue(sprite->costumeIndex() + 1, 1);
479479
else
480480
vm->replaceReturnValue(0, 1);
481481

@@ -488,7 +488,7 @@ unsigned int SensingBlocks::costumeNumberOfSpriteByIndex(VirtualMachine *vm)
488488
Sprite *sprite = dynamic_cast<Sprite *>(target);
489489

490490
if (sprite)
491-
vm->replaceReturnValue(sprite->currentCostume(), 1);
491+
vm->replaceReturnValue(sprite->costumeIndex() + 1, 1);
492492
else
493493
vm->replaceReturnValue(0, 1);
494494

@@ -501,7 +501,7 @@ unsigned int SensingBlocks::costumeNameOfSprite(VirtualMachine *vm)
501501
Sprite *sprite = dynamic_cast<Sprite *>(target);
502502

503503
if (sprite)
504-
vm->replaceReturnValue(sprite->costumeAt(sprite->currentCostume() - 1)->name(), 1);
504+
vm->replaceReturnValue(sprite->currentCostume()->name(), 1);
505505
else
506506
vm->replaceReturnValue(0, 1);
507507

@@ -514,7 +514,7 @@ unsigned int SensingBlocks::costumeNameOfSpriteByIndex(VirtualMachine *vm)
514514
Sprite *sprite = dynamic_cast<Sprite *>(target);
515515

516516
if (sprite)
517-
vm->replaceReturnValue(sprite->costumeAt(sprite->currentCostume() - 1)->name(), 1);
517+
vm->replaceReturnValue(sprite->currentCostume()->name(), 1);
518518
else
519519
vm->replaceReturnValue(0, 1);
520520

@@ -577,7 +577,7 @@ unsigned int SensingBlocks::backdropNumberOfStage(VirtualMachine *vm)
577577
Stage *stage = dynamic_cast<Stage *>(target);
578578

579579
if (stage)
580-
vm->replaceReturnValue(stage->currentCostume(), 1);
580+
vm->replaceReturnValue(stage->costumeIndex() + 1, 1);
581581
else
582582
vm->replaceReturnValue(0, 1);
583583

@@ -590,7 +590,7 @@ unsigned int SensingBlocks::backdropNumberOfStageByIndex(VirtualMachine *vm)
590590
Stage *stage = dynamic_cast<Stage *>(target);
591591

592592
if (stage)
593-
vm->replaceReturnValue(stage->currentCostume(), 1);
593+
vm->replaceReturnValue(stage->costumeIndex() + 1, 1);
594594
else
595595
vm->replaceReturnValue(0, 1);
596596

@@ -603,7 +603,7 @@ unsigned int SensingBlocks::backdropNameOfStage(VirtualMachine *vm)
603603
Stage *stage = dynamic_cast<Stage *>(target);
604604

605605
if (stage)
606-
vm->replaceReturnValue(stage->costumeAt(stage->currentCostume() - 1)->name(), 1);
606+
vm->replaceReturnValue(stage->currentCostume()->name(), 1);
607607
else
608608
vm->replaceReturnValue(0, 1);
609609

@@ -616,7 +616,7 @@ unsigned int SensingBlocks::backdropNameOfStageByIndex(VirtualMachine *vm)
616616
Stage *stage = dynamic_cast<Stage *>(target);
617617

618618
if (stage)
619-
vm->replaceReturnValue(stage->costumeAt(stage->currentCostume() - 1)->name(), 1);
619+
vm->replaceReturnValue(stage->currentCostume()->name(), 1);
620620
else
621621
vm->replaceReturnValue(0, 1);
622622

src/internal/scratch3reader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ bool Scratch3Reader::load()
216216

217217
// currentCostume
218218
READER_STEP(step, "target -> currentCostume");
219-
target->setCurrentCostume(jsonToValue(jsonTarget["currentCostume"]).toInt() + 1);
219+
target->setCostumeIndex(jsonToValue(jsonTarget["currentCostume"]).toInt());
220220

221221
// sounds
222222
READER_STEP(step, "target -> sounds");

src/scratch/sprite.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ std::shared_ptr<Sprite> Sprite::clone()
7676
for (auto list : l)
7777
clone->addList(list->clone());
7878

79-
clone->setCurrentCostume(currentCostume());
79+
clone->setCostumeIndex(costumeIndex());
8080
clone->setLayerOrder(layerOrder());
8181
clone->setVolume(volume());
8282
clone->setEngine(engine());
@@ -196,18 +196,16 @@ void Sprite::setSize(double newSize)
196196
if (impl->iface)
197197
impl->iface->onSizeChanged(impl->size);
198198

199-
// TODO: Make currentCostume() return the costume (not index)
200-
auto costume = costumeAt(currentCostume() - 1);
199+
auto costume = currentCostume();
201200

202201
if (costume)
203202
costume->setScale(newSize / 100);
204203
}
205204

206-
/*! Overrides Target#setCurrentCostume(). */
207-
void Sprite::setCurrentCostume(int newCostume)
205+
/*! Overrides Target#setCostumeIndex(). */
206+
void Sprite::setCostumeIndex(int newCostumeIndex)
208207
{
209-
// TODO: Make currentCostume() return the costume (not index)
210-
auto costume = costumeAt(newCostume - 1);
208+
auto costume = costumeAt(newCostumeIndex);
211209

212210
if (costume) {
213211
costume->setScale(impl->size / 100);
@@ -217,7 +215,7 @@ void Sprite::setCurrentCostume(int newCostume)
217215
costume->setGraphicsEffectValue(effect, value);
218216
}
219217

220-
Target::setCurrentCostume(newCostume);
218+
Target::setCostumeIndex(newCostumeIndex);
221219
}
222220

223221
/*! Returns the direction. */
@@ -276,8 +274,7 @@ std::string Sprite::rotationStyleStr() const
276274
void Sprite::setRotationStyle(RotationStyle newRotationStyle)
277275
{
278276
impl->rotationStyle = newRotationStyle;
279-
// TODO: Make currentCostume() return the costume (not index)
280-
auto costume = costumeAt(currentCostume() - 1);
277+
auto costume = currentCostume();
281278

282279
if (costume)
283280
costume->setMirrorHorizontally(newRotationStyle == RotationStyle::LeftRight);
@@ -328,8 +325,7 @@ void Sprite::setGraphicsEffectValue(IGraphicsEffect *effect, double value)
328325
{
329326
impl->graphicsEffects[effect] = value;
330327

331-
// TODO: Make currentCostume() return the costume (not index)
332-
auto costume = costumeAt(currentCostume() - 1);
328+
auto costume = currentCostume();
333329

334330
if (costume)
335331
costume->setGraphicsEffectValue(effect, value);
@@ -340,8 +336,7 @@ void Sprite::clearGraphicsEffects()
340336
{
341337
impl->graphicsEffects.clear();
342338

343-
// TODO: Make currentCostume() return the costume (not index)
344-
auto costume = costumeAt(currentCostume() - 1);
339+
auto costume = currentCostume();
345340

346341
if (costume)
347342
costume->clearGraphicsEffects();

src/scratch/sprite_p.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ void SpritePrivate::getBoundingRect(Rect *out) const
4141
{
4242
assert(out);
4343
assert(sprite);
44-
// TODO: Make currentCostume() return the costume
45-
auto costume = sprite->costumeAt(sprite->currentCostume() - 1);
44+
auto costume = sprite->currentCostume();
4645

4746
if (!costume) {
4847
out->setLeft(x);

src/scratch/target.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,23 @@ std::vector<std::shared_ptr<Block>> Target::greenFlagBlocks() const
198198
return ret;
199199
}
200200

201-
/*! Returns the ID of the current costume. */
202-
int Target::currentCostume() const
201+
/*! Returns the index of the current costume. */
202+
int Target::costumeIndex() const
203203
{
204-
return impl->currentCostume;
204+
return impl->costumeIndex;
205205
}
206206

207-
/*! Sets the ID of the current costume. */
208-
void Target::setCurrentCostume(int newCostume)
207+
/*! Sets the index of the current costume. */
208+
void Target::setCostumeIndex(int newCostumeIndex)
209209
{
210-
if (newCostume > 0 && newCostume <= costumes().size())
211-
impl->currentCostume = newCostume;
210+
if (newCostumeIndex >= 0 && newCostumeIndex < costumes().size())
211+
impl->costumeIndex = newCostumeIndex;
212+
}
213+
214+
/*! Returns the currently set costume. */
215+
std::shared_ptr<Costume> Target::currentCostume() const
216+
{
217+
return costumeAt(impl->costumeIndex);
212218
}
213219

214220
/*! Returns the list of costumes. */

src/scratch/target_p.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ struct TargetPrivate
2626
std::vector<std::shared_ptr<Variable>> variables;
2727
std::vector<std::shared_ptr<List>> lists;
2828
std::vector<std::shared_ptr<Block>> blocks;
29-
int currentCostume = 0;
29+
int costumeIndex = -1;
3030
std::vector<std::shared_ptr<Costume>> costumes;
3131
std::vector<std::shared_ptr<Sound>> sounds;
3232
int layerOrder = 0;

0 commit comments

Comments
 (0)