88#include < scratchcpp/costume.h>
99#include < scratchcpp/rect.h>
1010#include < cassert>
11+ #include < iostream>
1112
1213#include " sprite_p.h"
1314
@@ -20,25 +21,6 @@ Sprite::Sprite() :
2021{
2122}
2223
23- /* ! Destroys the Sprite object. */
24- Sprite::~Sprite ()
25- {
26- if (isClone ()) {
27- IEngine *eng = engine ();
28-
29- if (eng) {
30- eng->deinitClone (this );
31-
32- auto children = allChildren ();
33- for (auto child : children)
34- eng->deinitClone (child.get ());
35- }
36-
37- assert (impl->cloneParent );
38- impl->cloneParent ->impl ->removeClone (this );
39- }
40- }
41-
4224/* ! Sets the sprite interface. */
4325void Sprite::setInterface (ISpriteHandler *newInterface)
4426{
@@ -55,13 +37,13 @@ std::shared_ptr<Sprite> Sprite::clone()
5537 if (eng && (eng->cloneLimit () == -1 || eng->cloneCount () < eng->cloneLimit ())) {
5638 std::shared_ptr<Sprite> clone = std::make_shared<Sprite>();
5739
58- if (impl->cloneRoot == nullptr )
59- clone->impl ->cloneRoot = this ;
60- else
61- clone-> impl -> cloneRoot = impl-> cloneRoot ;
62-
63- clone-> impl ->cloneParent = this ;
64- impl-> childClones . push_back (clone);
40+ if (impl->cloneSprite == nullptr ) {
41+ clone->impl ->cloneSprite = this ;
42+ impl-> clones . push_back (clone);
43+ } else {
44+ clone-> impl -> cloneSprite = impl-> cloneSprite ;
45+ impl-> cloneSprite -> impl ->clones . push_back (clone) ;
46+ }
6547
6648 // Copy data
6749 clone->setName (name ());
@@ -91,7 +73,7 @@ std::shared_ptr<Sprite> Sprite::clone()
9173 clone->setEngine (engine ());
9274
9375 // Call "when I start as clone" scripts
94- eng->initClone (clone. get () );
76+ eng->initClone (clone);
9577
9678 if (impl->visible )
9779 eng->requestRedraw ();
@@ -108,42 +90,43 @@ std::shared_ptr<Sprite> Sprite::clone()
10890 return nullptr ;
10991}
11092
111- /* ! Returns true if this is a clone. */
112- bool Sprite::isClone () const
93+ /* ! Deletes this clone ( if the sprite is a clone) . */
94+ void Sprite::deleteClone ()
11395{
114- return (impl->cloneParent != nullptr );
115- }
96+ assert (isClone ());
11697
117- /* ! Returns the sprite this clone was created from, or nullptr if this isn't a clone. */
118- Sprite *Sprite::cloneRoot () const
119- {
120- return impl->cloneRoot ;
98+ if (isClone ()) {
99+ IEngine *eng = engine ();
100+
101+ if (eng)
102+ eng->deinitClone (shared_from_this ());
103+
104+ assert (impl->cloneSprite );
105+ impl->cloneDeleted = true ;
106+ impl->cloneSprite ->impl ->removeClone (this );
107+ }
121108}
122109
123- /* ! Returns the sprite or clone this clone was created from, or nullptr if this isn't a clone. */
124- Sprite * Sprite::cloneParent () const
110+ /* ! Returns true if this is a clone. */
111+ bool Sprite::isClone () const
125112{
126- return impl->cloneParent ;
113+ return ( impl->cloneSprite != nullptr ) ;
127114}
128115
129- /* ! Returns list of child clones . */
130- const std::vector<std::shared_ptr< Sprite>> & Sprite::children () const
116+ /* ! Returns the sprite this clone was created from, or nullptr if this isn't a clone . */
117+ Sprite * Sprite::cloneSprite () const
131118{
132- return impl->childClones ;
119+ return impl->cloneSprite ;
133120}
134121
135- /* ! Returns list of child clones and their children (recursive) . */
136- std::vector<std::shared_ptr<Sprite>> Sprite::allChildren () const
122+ /* ! Returns list of clones of the sprite . */
123+ const std::vector<std::shared_ptr<Sprite>> & Sprite::clones () const
137124{
138- std::vector<std::shared_ptr<Sprite>> ret;
139-
140- for (auto clone : impl->childClones ) {
141- ret.push_back (clone);
142- auto children = clone->allChildren ();
143- ret.insert (ret.end (), children.begin (), children.end ());
144- }
145-
146- return ret;
125+ if (isClone ()) {
126+ assert (impl->cloneSprite );
127+ return impl->cloneSprite ->impl ->clones ;
128+ } else
129+ return impl->clones ;
147130}
148131
149132/* ! Returns true if the sprite is visible. */
@@ -419,7 +402,7 @@ void Sprite::clearGraphicsEffects()
419402
420403Target *Sprite::dataSource () const
421404{
422- return impl->cloneRoot ;
405+ return impl->cloneSprite ;
423406}
424407
425408void Sprite::setXY (double x, double y)
0 commit comments