Просмотр исходного кода

Sprites now reload automatically in the screen editor if changed

Ivan Safrin 12 лет назад
Родитель
Сommit
a440d67722

+ 19 - 0
Core/Contents/Include/PolyScreenSprite.h

@@ -27,6 +27,8 @@ THE SOFTWARE.
 
 namespace Polycode {
 
+class ScreenSpriteResourceEntry;
+
 class _PolyExport SpriteAnimation {
 	public:
 		Number speed;
@@ -111,6 +113,8 @@ class _PolyExport ScreenSprite : public ScreenShape
 		void recalculateSpriteDimensions();
 	
 		bool loadFromFile(const String& fileName);
+		
+		void reloadSprite();
 	
 		/**
 		* Pauses or unpauses the current sprite animation.
@@ -127,6 +131,8 @@ class _PolyExport ScreenSprite : public ScreenShape
 		
 		void updateSprite();
 		
+		ScreenSpriteResourceEntry *getResourceEntry();
+		
 	protected:
 	
 		String fileName;
@@ -139,6 +145,8 @@ class _PolyExport ScreenSprite : public ScreenShape
 		bool playingOnce;
 		Number lastTick;
 		
+		ScreenSpriteResourceEntry *resourceEntry;
+		
 		Number spriteUVWidth;
 		Number spriteUVHeight;
 		int currentFrame;
@@ -146,5 +154,16 @@ class _PolyExport ScreenSprite : public ScreenShape
 		
 		std::vector<SpriteAnimation*> animations;
 };
+
+class ScreenSpriteResourceEntry : public Resource {
+	public:
+		ScreenSpriteResourceEntry(ScreenSprite *sprite);
+		virtual ~ScreenSpriteResourceEntry();		
+		ScreenSprite *getSprite();
+		void reloadResource();
+		
+	protected:
+		ScreenSprite* sprite;
+};
 	
 }

+ 41 - 0
Core/Contents/Source/PolyScreenSprite.cpp

@@ -30,6 +30,23 @@
 using std::vector;
 using namespace Polycode;
 
+ScreenSpriteResourceEntry::ScreenSpriteResourceEntry(ScreenSprite *sprite)  : Resource(Resource::RESOURCE_SCREEN_ENTITY_INSTANCE) {
+	this->sprite = sprite;
+}
+
+ScreenSpriteResourceEntry::~ScreenSpriteResourceEntry() {
+
+}
+
+ScreenSprite *ScreenSpriteResourceEntry::getSprite() {
+	return sprite;
+}
+
+void ScreenSpriteResourceEntry::reloadResource() {
+	sprite->reloadSprite();
+	Resource::reloadResource();
+}
+
 ScreenSprite* ScreenSprite::ScreenSpriteFromImageFile(const String& fileName, Number spriteWidth, Number spriteHeight) {
 	return new ScreenSprite(fileName, spriteWidth, spriteHeight);
 }
@@ -40,7 +57,10 @@ ScreenSprite::ScreenSprite(const String& fileName) : ScreenShape(ScreenShape::SH
 	currentAnimation = NULL;	
 	paused = false;
 
+	resourceEntry = new ScreenSpriteResourceEntry(this);		
 	loadFromFile(fileName);
+	resourceEntry->setResourceName(fileName);
+	resourceEntry->setResourcePath(fileName);	
 }
 
 Entity *ScreenSprite::Clone(bool deepClone, bool ignoreEditorOnly) const {
@@ -123,6 +143,27 @@ SpriteAnimation *ScreenSprite::getAnimationAtIndex(unsigned int index) {
 	}
 }
 
+void ScreenSprite::reloadSprite() {
+	
+	String _animName = "";
+	int _currentFrame;
+	bool _playingOnce;
+	
+	if(currentAnimation) {
+		_animName = currentAnimation->name;
+		_currentFrame = currentFrame;
+		_playingOnce = playingOnce;
+	}
+	loadFromFile(fileName);
+	
+	if(_animName != "") {
+		playAnimation(_animName, _currentFrame, _playingOnce);
+	}
+}
+
+ScreenSpriteResourceEntry *ScreenSprite::getResourceEntry() {
+	return resourceEntry;
+}
 
 ScreenSprite::ScreenSprite(const String& fileName, Number spriteWidth, Number spriteHeight) : ScreenShape(ScreenShape::SHAPE_RECT, spriteWidth, spriteHeight) {
 	this->spriteWidth = spriteWidth;

+ 2 - 3
IDE/Contents/Include/PolycodeProps.h

@@ -597,9 +597,8 @@ class ScreenSpriteSheet : public PropSheet {
 				
 		ScreenSprite *sprite;	
 		ScreenSpriteProp *spriteProp;
-		ComboProp *defaultAnimationProp;
-		
-		ScreenSprite *lastAnimationCheck;
+		ComboProp *defaultAnimationProp;		
+		ScreenSprite *lastSprite;
 		
 };
 

+ 12 - 8
IDE/Contents/Source/PolycodeProps.cpp

@@ -1030,7 +1030,6 @@ void ScreenSpriteProp::setPropData(PolycodeEditorPropActionData* data) {
 void ScreenSpriteProp::set(String fileName) {
 
 	if(fileName != previewSprite->getFileName()) {
-		printf("%s != %s\n", fileName.c_str(), previewSprite->getFileName().c_str());
 		if(previewSprite) {
 			propContents->removeChild(previewSprite);
 			delete previewSprite;
@@ -2720,7 +2719,7 @@ void ScreenImageSheet::Update() {
 
 ScreenSpriteSheet::ScreenSpriteSheet() : PropSheet("SCREEN SPRITE", "ScreenSprite") {
 	sprite = NULL;
-	lastAnimationCheck = NULL;
+	lastSprite = NULL;
 	
 	spriteProp = new ScreenSpriteProp("Sprite");
 	spriteProp->addEventListener(this, Event::CHANGE_EVENT);
@@ -2741,6 +2740,12 @@ void ScreenSpriteSheet::handleEvent(Event *event) {
 	if(!sprite)
 		return;
 
+	if(event->getDispatcher() == sprite->getResourceEntry()) {
+		spriteProp->previewSprite->reloadSprite();
+		sprite->getResourceEntry()->removeAllHandlersForListener(this);
+		lastSprite = NULL;
+	}
+
 	if(event->getDispatcher() == defaultAnimationProp) {
 		sprite->playAnimation(defaultAnimationProp->comboEntry->getSelectedItem()->label, 0, false);
 		spriteProp->previewSprite->playAnimation(defaultAnimationProp->comboEntry->getSelectedItem()->label, 0, false);
@@ -2759,9 +2764,8 @@ void ScreenSpriteSheet::handleEvent(Event *event) {
 }
 
 void ScreenSpriteSheet::Update() {
-	if(sprite) {
-	
-		if(lastAnimationCheck != sprite) {
+	if(sprite) {	
+		if(lastSprite != sprite) {
 			defaultAnimationProp->comboEntry->clearItems();
 			for(int i=0; i < sprite->getNumAnimations(); i++) {
 				defaultAnimationProp->comboEntry->addComboItem(sprite->getAnimationAtIndex(i)->name);
@@ -2772,11 +2776,11 @@ void ScreenSpriteSheet::Update() {
 					}
 				}
 			}
-			lastAnimationCheck = sprite;
-		}
-	
+			lastSprite = sprite;
+		}	
 		enabled = true;	
 		spriteProp->set(sprite->getFileName());
+		sprite->getResourceEntry()->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
 	} else {
 		enabled = false;
 	}

+ 12 - 4
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -361,7 +361,8 @@ PolycodeScreenEditorMain::PolycodeScreenEditorMain(PolycodeEditor *editor) {
 	previewSprite->setPositionMode(ScreenEntity::POSITION_CENTER);	
 	placingPreviewEntity->addChild(previewSprite);
 	previewSprite->setColor(1.0, 1.0, 1.0, 0.5);
-	
+	previewSprite->getResourceEntry()->reloadOnFileModify = true;
+		
 	previewImage = new ScreenImage("default.png");
 	previewImage->setPositionMode(ScreenEntity::POSITION_CENTER);
 	placingPreviewEntity->addChild(previewImage);
@@ -375,7 +376,8 @@ PolycodeScreenEditorMain::PolycodeScreenEditorMain(PolycodeEditor *editor) {
 	previewInstance->getResourceEntry()->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
 	
 	CoreServices::getInstance()->getResourceManager()->addResource(previewInstance->getResourceEntry());	
-
+	CoreServices::getInstance()->getResourceManager()->addResource(previewSprite->getResourceEntry());	
+	
 	grid = false;
 	setGrid(16);
 	
@@ -1553,7 +1555,8 @@ void PolycodeScreenEditorMain::handleMouseDown(Vector2 position) {
 				placingSprite->id = "ScreenSprite."+String::IntToString(placementCount);
 				placingSprite->blockMouseInput = true;
 				placingSprite->getTexture()->reloadOnFileModify = true;
-				
+				placingSprite->getResourceEntry()->reloadOnFileModify = true;
+								
 				if(previewSprite->getCurrentAnimation()) {
 						placingSprite->playAnimation(previewSprite->getCurrentAnimation()->name, 0, false);
 				}
@@ -2936,8 +2939,13 @@ void PolycodeScreenEditorMain::applyEditorProperties(ScreenEntity *entity) {
 			instance->getResourceEntry()->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
 			CoreServices::getInstance()->getResourceManager()->addResource(instance->getResourceEntry());
 		}
+	} else if(dynamic_cast<ScreenSprite*>(entity)) {	
+		ScreenSprite *sprite = (((ScreenSprite*)entity));	
+		sprite->getResourceEntry()->reloadOnFileModify = true;
+		if(!CoreServices::getInstance()->getResourceManager()->hasResource(sprite->getResourceEntry())) { 
+			CoreServices::getInstance()->getResourceManager()->addResource(sprite->getResourceEntry());
+		}		
 	} else if(dynamic_cast<ScreenShape*>(entity)) {
-	
 	} else if(dynamic_cast<ScreenImage*>(entity)) {
 	} else if(dynamic_cast<ScreenLabel*>(entity)) {