Browse Source

Entity editor will no longer crash if a sprite or sprite state that is in use is removed in the sprite editor

Ivan Safrin 11 years ago
parent
commit
adfe0ee6bd

+ 2 - 1
Core/Contents/Include/PolySceneSprite.h

@@ -167,8 +167,9 @@ namespace Polycode {
         SpriteSet *getSpriteSet();
         SpriteSet *getSpriteSet();
         Sprite *getCurrentSprite();
         Sprite *getCurrentSprite();
         
         
-        void setSpriteSet(SpriteSet *spriteSet);
+        void handleEvent(Event *event);
         
         
+        void setSpriteSet(SpriteSet *spriteSet);
         void setSpriteByName(String spriteName);
         void setSpriteByName(String spriteName);
         
         
         void setCurrentFrame(unsigned int frameIndex);
         void setCurrentFrame(unsigned int frameIndex);

+ 61 - 1
Core/Contents/Source/PolySceneSprite.cpp

@@ -34,6 +34,7 @@ using namespace Polycode;
 SceneSprite::SceneSprite(SpriteSet *spriteSet) : SceneMesh(Mesh::QUAD_MESH) {
 SceneSprite::SceneSprite(SpriteSet *spriteSet) : SceneMesh(Mesh::QUAD_MESH) {
     currentSprite = NULL;
     currentSprite = NULL;
     currentSpriteState = NULL;
     currentSpriteState = NULL;
+    this->spriteSet = NULL;
     setSpriteSet(spriteSet);
     setSpriteSet(spriteSet);
     defaultMesh = mesh;
     defaultMesh = mesh;
     currentFrame = 0;
     currentFrame = 0;
@@ -104,13 +105,31 @@ void SceneSprite::setSpriteByName(String spriteName) {
 }
 }
 
 
 void SceneSprite::setSprite(Sprite *spriteEntry) {
 void SceneSprite::setSprite(Sprite *spriteEntry) {
-    setSpriteSet(spriteEntry->getParentSpriteSet());
+    
+    if(currentSprite){
+        currentSprite->removeAllHandlersForListener(this);
+    }
+    
+    if(spriteEntry) {
+        setSpriteSet(spriteEntry->getParentSpriteSet());
+    }
     currentSprite = spriteEntry;
     currentSprite = spriteEntry;
     currentSpriteState = NULL;
     currentSpriteState = NULL;
+    
+    if(currentSprite) {
+        currentSprite->addEventListener(this, Event::CHANGE_EVENT);
+    }
 }
 }
 
 
 void SceneSprite::setSpriteSet(SpriteSet *spriteSet) {
 void SceneSprite::setSpriteSet(SpriteSet *spriteSet) {
+    
+    if(this->spriteSet) {
+        this->spriteSet->removeAllHandlersForListener(this);
+    }
+    
     this->spriteSet = spriteSet;
     this->spriteSet = spriteSet;
+    spriteSet->addEventListener(this, Event::CHANGE_EVENT);
+    
     setTexture(spriteSet->getTexture());
     setTexture(spriteSet->getTexture());
     
     
     if(getLocalShaderOptions()) {
     if(getLocalShaderOptions()) {
@@ -122,6 +141,43 @@ void SceneSprite::setSpriteSet(SpriteSet *spriteSet) {
     currentSpriteState = NULL;
     currentSpriteState = NULL;
 }
 }
 
 
+void SceneSprite::handleEvent(Event *event) {
+    if(event->getDispatcher() == spriteSet) {
+        if(event->getEventCode() == Event::CHANGE_EVENT) {
+            
+            bool hasSprite = false;
+            for(int i=0; i < spriteSet->getNumSpriteEntries(); i++) {
+                if(currentSprite == spriteSet->getSpriteEntry(i)) {
+                    hasSprite = true;
+                    break;
+                }
+            }
+            if(!hasSprite) {
+                if(spriteSet->getNumSpriteEntries() > 0) {
+                    setSprite(spriteSet->getSpriteEntry(0));
+                } else {
+                    setSprite(NULL);
+                }
+            }
+        }
+    } else if(event->getDispatcher() == currentSprite) {
+        bool hasState = false;
+        for(int i=0; i < currentSprite->getNumStates(); i++) {
+            if(currentSprite->getState(i) == currentSpriteState) {
+                hasState = true;
+                break;
+            }
+        }
+        if(!hasState) {
+            if(currentSprite->getNumStates() > 0) {
+                setSpriteState(currentSprite->getState(0), 0, playOnce);
+            } else {
+                setSpriteState(NULL, 0, playOnce);
+            }
+        }
+    }
+}
+
 void SceneSprite::setSpriteStateByName(String name, unsigned int startingFrame, bool playOnce) {
 void SceneSprite::setSpriteStateByName(String name, unsigned int startingFrame, bool playOnce) {
     if(!currentSprite) {
     if(!currentSprite) {
         return;
         return;
@@ -387,6 +443,7 @@ SpriteState *Sprite::getStateByName(const String &name) {
 
 
 void Sprite::addSpriteState(SpriteState *state) {
 void Sprite::addSpriteState(SpriteState *state) {
     states.push_back(state);
     states.push_back(state);
+    dispatchEvent(new Event(), Event::CHANGE_EVENT);
 }
 }
 
 
 Sprite::Sprite(String name) : Resource(Resource::RESOURCE_SPRITE){
 Sprite::Sprite(String name) : Resource(Resource::RESOURCE_SPRITE){
@@ -406,6 +463,7 @@ void Sprite::removeSpriteState(SpriteState *state) {
     for(int i=0; i < states.size(); i++) {
     for(int i=0; i < states.size(); i++) {
         if(states[i] == state) {
         if(states[i] == state) {
             states.erase(states.begin() + i);
             states.erase(states.begin() + i);
+            dispatchEvent(new Event(), Event::CHANGE_EVENT);            
             return;
             return;
         }
         }
     }
     }
@@ -582,6 +640,7 @@ void SpriteSet::removeSprite(Sprite *sprite) {
         if(sprites[i] == sprite) {
         if(sprites[i] == sprite) {
             removeResource(sprites[i]);
             removeResource(sprites[i]);
             sprites.erase(sprites.begin()+i);
             sprites.erase(sprites.begin()+i);
+            dispatchEvent(new Event(), Event::CHANGE_EVENT);
             return;
             return;
         }
         }
     }
     }
@@ -659,6 +718,7 @@ void SpriteSet::addSpriteEntry(Sprite *newEntry) {
     addResource(newEntry);
     addResource(newEntry);
     newEntry->setParentSpritSet(this);
     newEntry->setParentSpritSet(this);
     sprites.push_back(newEntry);
     sprites.push_back(newEntry);
+    dispatchEvent(new Event(), Event::CHANGE_EVENT);
 }
 }
 
 
 unsigned int SpriteSet::getNumSpriteEntries() const {
 unsigned int SpriteSet::getNumSpriteEntries() const {