[Scummvm-cvs-logs] SF.net SVN: scummvm:[42114] scummvm/branches/gsoc2009-draci/engines/draci

dkasak13 at users.sourceforge.net dkasak13 at users.sourceforge.net
Sun Jul 5 05:24:46 CEST 2009


Revision: 42114
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42114&view=rev
Author:   dkasak13
Date:     2009-07-05 03:24:46 +0000 (Sun, 05 Jul 2009)

Log Message:
-----------
* API change for Animation and AnimObj; AnimObj is now a proper class and each instance handles its own animation. Animation handles adding, fetching and deleting of AnimObjs (probably needs a namechange).
* Implemented actual animation (previously only the first frame was display)
* Implemented animation starting, stoping, looping
* Loaded looping dragon animation as a test

Modified Paths:
--------------
    scummvm/branches/gsoc2009-draci/engines/draci/animation.cpp
    scummvm/branches/gsoc2009-draci/engines/draci/animation.h
    scummvm/branches/gsoc2009-draci/engines/draci/game.cpp

Modified: scummvm/branches/gsoc2009-draci/engines/draci/animation.cpp
===================================================================
--- scummvm/branches/gsoc2009-draci/engines/draci/animation.cpp	2009-07-05 01:16:53 UTC (rev 42113)
+++ scummvm/branches/gsoc2009-draci/engines/draci/animation.cpp	2009-07-05 03:24:46 UTC (rev 42114)
@@ -28,111 +28,224 @@
 
 namespace Draci {
 
-void Animation::addAnimation(uint id, uint z, bool playing) {
+AnimObj::AnimObj(DraciEngine *vm) : _vm(vm) {
+	_id = kUnused;
+	_z = 0;
+	_playing = false;
+	_looping = false;
+	_delay = 0;
+	_tick = _vm->_system->getMillis();
+	_currentFrame = 0;
+}	
+
+AnimObj::~AnimObj() {
+	deleteFrames();
+}
+
+bool AnimObj::isLooping() {
+	return _looping;
+}
+
+void AnimObj::setLooping(bool looping) {
+	_looping = looping;
+}
+
+void AnimObj::setDelay(uint delay) {
+	_delay = delay;
+}
+
+void AnimObj::nextFrame(bool force) {
+
+	// If there's only one or no frames, return
+	if (getFramesNum() < 2)
+		return;
+
+	Common::Rect frameRect = _frames[_currentFrame]->getRect();
+
+	// If we are at the last frame and not looping, stop the animation
+	// The animation is also restarted to frame zero
+	if ((_currentFrame == nextFrameNum() - 1) && !_looping) {
+		_currentFrame = 0;
+		_playing = false;
+		return;
+	}
+
+	if (force || (_tick + _delay <= _vm->_system->getMillis())) {
+		_vm->_screen->getSurface()->markDirtyRect(frameRect);
+		_currentFrame = nextFrameNum();
+		_tick = _vm->_system->getMillis();
+	}
+
+	debugC(6, kDraciAnimationDebugLevel, 
+	"tick=%d delay=%d tick+delay=%d currenttime=%d frame=%d framenum=%d", 
+	_tick, _delay, _tick + _delay, _vm->_system->getMillis(), _currentFrame, _frames.size());
+}
+
+uint AnimObj::nextFrameNum() {
+
+	if ((_currentFrame == getFramesNum() - 1) && _looping)
+		return 0;
+	else
+		return _currentFrame + 1;
+}
+
+void AnimObj::drawFrame(Surface *surface) {
 	
-	AnimObj *obj = new AnimObj();
-	obj->_id = id;
-	obj->_z = z;
-	obj->_currentFrame = 0;
-	obj->_playing = playing;
+	if (_frames.size() == 0)
+		return;
 
-	insertAnimation(*obj);
+	if (_id == kOverlayImage) {			
+		_frames[_currentFrame]->draw(surface, false);
+	}
+	else {
+		_frames[_currentFrame]->draw(surface, true);
+	}
 }
 
-void Animation::play(uint id) {
+void AnimObj::setID(int id) {
+	
+	_id = id;
+}
 
-	AnimObj &obj = *getAnimation(id);
+int AnimObj::getID() {
+	
+	return _id;
+}
 
-	obj._playing = true;
+void AnimObj::setZ(uint z) {
+
+	_z = z;
 }
 
-void Animation::stop(uint id) {
+uint AnimObj::getZ() {
+	
+	return _z;
+}
 
-	AnimObj &obj = *getAnimation(id);
+bool AnimObj::isPlaying() {
 
-	obj._playing = false;
+	return _playing;
 }
 
-Common::List<AnimObj>::iterator Animation::getAnimation(uint id) {
+void AnimObj::setPlaying(bool playing) {
 	
-	Common::List<AnimObj>::iterator it;
+	_playing = playing;
+}
 
+void AnimObj::addFrame(Drawable *frame) {
+	
+	_frames.push_back(frame);	
+}
+
+uint AnimObj::getFramesNum() {
+	
+	return _frames.size();
+}
+
+void AnimObj::deleteFrames() {
+	
+	for (uint i = 0; i < getFramesNum(); ++i) {		
+		delete _frames[i];
+		_frames.pop_back();	
+	}
+}
+
+AnimObj *Animation::addAnimation(int id, uint z, bool playing) {
+	
+	AnimObj *obj = new AnimObj(_vm);
+	obj->setID(id);
+	obj->setZ(z);
+	obj->setPlaying(playing);
+	obj->setLooping(false);
+
+	insertAnimation(obj);
+
+	return obj;
+}
+
+void Animation::play(int id) {
+
+	AnimObj *obj = getAnimation(id);
+
+	obj->setPlaying(true);
+}
+
+void Animation::stop(int id) {
+
+	AnimObj *obj = getAnimation(id);
+
+	obj->setPlaying(false);
+}
+
+AnimObj *Animation::getAnimation(int id) {
+	
+	Common::List<AnimObj *>::iterator it;
+
 	for (it = _animObjects.begin(); it != _animObjects.end(); ++it) {
-		if (it->_id == id) {
-			return it;
+		if ((*it)->getID() == id) {
+			return *it;
 		}
 	}
 
-	return _animObjects.end();
+	return *_animObjects.end();
 }
 
-void Animation::insertAnimation(AnimObj &animObj) {
+void Animation::insertAnimation(AnimObj *animObj) {
 	
-	Common::List<AnimObj>::iterator it;	
+	Common::List<AnimObj *>::iterator it;	
 
 	for (it = _animObjects.begin(); it != _animObjects.end(); ++it) {
-		if (animObj._z < it->_z) 
+		if (animObj->getZ() < (*it)->getZ()) 
 			break;
 	}
 
 	_animObjects.insert(it, animObj);
 }
 
-void Animation::addFrame(uint id, Drawable *frame) {
-	
-	Common::List<AnimObj>::iterator it = getAnimation(id);
-
-	it->_frames.push_back(frame);	
-}
-
 void Animation::addOverlay(Drawable *overlay, uint z) {
-	AnimObj *obj = new AnimObj();
-	obj->_id = kOverlayImage;
-	obj->_z = z;
-	obj->_currentFrame = 0;
-	obj->_playing = true;
-	obj->_frames.push_back(overlay);
+	AnimObj *obj = new AnimObj(_vm);
+	obj->setID(kOverlayImage);
+	obj->setZ(z);
+	obj->setPlaying(true);
+	obj->addFrame(overlay);
 
-	insertAnimation(*obj);
+	insertAnimation(obj);
 }
 
 void Animation::drawScene(Surface *surf) {
 	
-	Common::List<AnimObj>::iterator it;
+	Common::List<AnimObj *>::iterator it;
 
 	for (it = _animObjects.begin(); it != _animObjects.end(); ++it) {
-		if (!it->_playing) {
+		if (! ((*it)->isPlaying()) ) {
 			continue;
 		}	
 	
-		if (it->_id == kOverlayImage) {			
-			it->_frames[it->_currentFrame]->draw(surf, false);
-		}
-		else {
-			it->_frames[it->_currentFrame]->draw(surf, true);
-		}
+		(*it)->nextFrame();
+		(*it)->drawFrame(surf);
 	}
 }
 
-void Animation::deleteAnimation(uint id) {
+void Animation::deleteAnimation(int id) {
 	
-	Common::List<AnimObj>::iterator it = getAnimation(id);
+	Common::List<AnimObj *>::iterator it;
 
-	for (uint i = 0; i < it->_frames.size(); ++i) {		
-		delete it->_frames[i];
+	for (it = _animObjects.begin(); it != _animObjects.end(); ++it) {
+		if ((*it)->getID() == id)
+			break;
 	}
+	
+	(*it)->deleteFrames();
 
 	_animObjects.erase(it);
 }
 	
 void Animation::deleteAll() {
 	
-	Common::List<AnimObj>::iterator it;
+	Common::List<AnimObj *>::iterator it;
 
 	for (it = _animObjects.begin(); it != _animObjects.end(); ++it) {
-		for (uint i = 0; i < it->_frames.size(); ++i) {		
-			delete it->_frames[i];
-		}	
+		(*it)->deleteFrames();	
 	}
 
 	_animObjects.clear();

Modified: scummvm/branches/gsoc2009-draci/engines/draci/animation.h
===================================================================
--- scummvm/branches/gsoc2009-draci/engines/draci/animation.h	2009-07-05 01:16:53 UTC (rev 42113)
+++ scummvm/branches/gsoc2009-draci/engines/draci/animation.h	2009-07-05 03:24:46 UTC (rev 42114)
@@ -30,44 +30,81 @@
 
 namespace Draci {
 
-enum { kOverlayImage = -1 };
+enum { kOverlayImage = -1, kUnused = -2 };
 
 class DraciEngine;
 
-struct AnimObj {
-	uint _id;	
+class AnimObj {
+public:
+	AnimObj(DraciEngine *vm);
+	~AnimObj();	
+	
+	uint getZ();
+	void setZ(uint z);
+	
+	void setID(int id);
+	int getID();
+
+	void setDelay(uint delay);
+
+	void nextFrame(bool force = false);
+	void drawFrame(Surface *surface);
+
+	void addFrame(Drawable *frame);
+	uint getFramesNum();
+	void deleteFrames();
+
+	bool isPlaying();
+	void setPlaying(bool playing);
+
+	bool isLooping();
+	void setLooping(bool looping);
+
+
+private:
+	
+	uint nextFrameNum();
+
+	int _id;	
 	uint _currentFrame;
 	uint _z;
-	bool _playing;	
+	uint _delay;
+	uint _tick;
+	bool _playing;
+	bool _looping;
 	Common::Array<Drawable*> _frames;
+
+	DraciEngine *_vm;
 };
 
+// TODO: Probably needs a namechange to AnimationManager or similar since AnimObj now
+// acts as an animation object
+
 class Animation {
 
 public:
 	Animation(DraciEngine *vm) : _vm(vm) {};
 	~Animation() { deleteAll(); }
 
-	void addAnimation(uint id, uint z, bool playing = false);
-	void addFrame(uint id, Drawable *frame);
+	AnimObj *addAnimation(int id, uint z, bool playing = false);
 	void addOverlay(Drawable *overlay, uint z);
 	
-	void play(uint id);
-	void stop(uint id);
+	void play(int id);
+	void stop(int id);
 
-	void deleteAnimation(uint id);
+	void deleteAnimation(int id);
 	void deleteAll();
 
 	void drawScene(Surface *surf);
 
-	Common::List<AnimObj>::iterator getAnimation(uint id);
+	AnimObj *getAnimation(int id);
 
 private:
 	
-	void insertAnimation(AnimObj &animObj);
+	void insertAnimation(AnimObj *animObj);
 
 	DraciEngine *_vm;
-	Common::List<AnimObj> _animObjects;
+	Common::List<AnimObj *> _animObjects;
 };
 
 }

Modified: scummvm/branches/gsoc2009-draci/engines/draci/game.cpp
===================================================================
--- scummvm/branches/gsoc2009-draci/engines/draci/game.cpp	2009-07-05 01:16:53 UTC (rev 42113)
+++ scummvm/branches/gsoc2009-draci/engines/draci/game.cpp	2009-07-05 03:24:46 UTC (rev 42114)
@@ -189,7 +189,7 @@
 	animationReader.readByte(); // Cyclic field, not used
 	animationReader.readByte(); // Relative field, not used
 
-	_vm->_anims->addAnimation(animNum, 254, false);
+	AnimObj *obj = _vm->_anims->addAnimation(animNum, 254, false);
 	
 	for (uint i = 0; i < numFrames; ++i) {
 		uint spriteNum = animationReader.readUint16LE() - 1;
@@ -202,8 +202,7 @@
 		uint freq = animationReader.readUint16LE();
 		uint delay = animationReader.readUint16LE();
 
-		// TODO: implement Animation::setDelay()
-		//_vm->_anims->setDelay(animNum, delay*10);
+		obj->setDelay(delay * 10);
 
 		BAFile *spriteFile = _vm->_spritesArchive->getFile(spriteNum);
 
@@ -212,7 +211,10 @@
 		if (mirror) 
 			sp->setMirrorOn();
 
-		_vm->_anims->addFrame(animNum, sp);
+		// HACK: This is only for testing
+		obj->setLooping(true);
+
+		obj->addFrame(sp);
 	}
 
 	return animNum;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list