Initial clone in from local subversion server
This commit is contained in:
107
Animation.cpp
Executable file
107
Animation.cpp
Executable file
@@ -0,0 +1,107 @@
|
||||
#include <SDL.h>
|
||||
#include "SpriteStrip.h"
|
||||
#include "Animation.h"
|
||||
#include "Actor.h"
|
||||
#include <iostream>
|
||||
|
||||
// TODO: Animation has mysterious segfault problems when it is used static; e.g.
|
||||
//
|
||||
// Animation anim; <-- using this object will eventually cause a segfault thru the framecounters/indexers
|
||||
// ..
|
||||
// Animation *anim = new Animation() <-- ... using this one will not
|
||||
|
||||
Animation::Animation()
|
||||
{
|
||||
this->strip = NULL;
|
||||
this->timeStep = 0;
|
||||
this->fps = 0;
|
||||
this->anchor.x = 0;
|
||||
this->anchor.y = 0;
|
||||
}
|
||||
|
||||
Animation::~Animation()
|
||||
{
|
||||
}
|
||||
|
||||
int Animation::setStrip(SpriteStrip *strip, int fps, int loop, Vector anchor)
|
||||
{
|
||||
if ( strip == NULL ) {
|
||||
std::cerr << "Got NULL sprite strip\n";
|
||||
return 1;
|
||||
}
|
||||
this->loop = loop;
|
||||
this->strip = strip;
|
||||
//std::cerr << "this->strip is now " << strip << "\n";
|
||||
this->fps = fps;
|
||||
if ( this-> fps > 0 )
|
||||
this->timeStep = 1000 / fps;
|
||||
if ( anchor.x <= this->strip->width() )
|
||||
this->anchor.x = anchor.x;
|
||||
if ( anchor.y <= this->strip->height() )
|
||||
this->anchor.y = anchor.y;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// FIXME : The way this interaction works is INCREDIBLY hackish. I should look
|
||||
// at collapsing the nextFrame() functionality into Actor, and basically redoing the
|
||||
// Animation class as a structure that does nothing. For now, though, this works.
|
||||
|
||||
SDL_Surface *Animation::nextFrame(int curFrame, int lastTime, AnimatedRenderable *actorSource)
|
||||
{
|
||||
FrameCounter fc;
|
||||
if ( actorSource ) {
|
||||
fc = actorSource->getFrameCounter();
|
||||
curFrame = fc.curFrame;
|
||||
lastTime = fc.lastTime;
|
||||
}
|
||||
SDL_Surface *toRet = NULL;
|
||||
//std::cerr << "Checking for step; timeStep " << this->timeStep << " lastTime " << lastTime << "\n";
|
||||
if ( this->fps > 0 && ((SDL_GetTicks() - lastTime) >= this->timeStep) ) {
|
||||
if ( curFrame +1 >= this->strip->numFrames() && this->loop == 0 ) {
|
||||
toRet = this->strip->getFrame(0);
|
||||
//std::cerr << "Time for a step; Returning frame 0\n";
|
||||
} else if ( curFrame + 1 >= this->strip->numFrames() && this->loop == 1) {
|
||||
return NULL;
|
||||
}
|
||||
//std::cerr << "Time for a step; returning frame " << curFrame + 1 << "\n";
|
||||
toRet = this->strip->getFrame(curFrame+1);
|
||||
curFrame += 1;
|
||||
if ( actorSource ) {
|
||||
fc.curFrame += 1;
|
||||
if ( fc.curFrame >= this->strip->numFrames() && this->loop == 0 ) {
|
||||
//std::cerr << "Resetting to zero\n";
|
||||
fc.curFrame = 0;
|
||||
curFrame = 0;
|
||||
}
|
||||
fc.lastTime = SDL_GetTicks();
|
||||
fc.lastFrame = toRet;
|
||||
actorSource->setFrameCounter(fc);
|
||||
}
|
||||
} else if ( this->fps == 0 ) {
|
||||
//std::cerr << "0 FPS ; Returning frame 0\n";
|
||||
toRet = this->strip->getFrame(0);
|
||||
} else {
|
||||
//std::cerr << "Not time for a step; Returning frame " << curFrame << "\n";
|
||||
toRet = this->strip->getFrame(curFrame);
|
||||
}
|
||||
if ( toRet == NULL )
|
||||
return this->strip->getFrame(0);
|
||||
else
|
||||
return toRet;
|
||||
}
|
||||
|
||||
int Animation::numFrames()
|
||||
{
|
||||
if ( this->strip != NULL ) {
|
||||
return this->strip->numFrames();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Vector Animation::anchorAt(Vector position)
|
||||
{
|
||||
Vector newVector;
|
||||
newVector.x = position.x - this->anchor.x;
|
||||
newVector.y = position.y - this->anchor.y;
|
||||
return newVector;
|
||||
}
|
||||
Reference in New Issue
Block a user