/* ** Haaf's Game Engine 1.7 ** Copyright (C) 2003-2007, Relish Games ** hge.relishgames.com ** ** hgeAnimation helper class implementation */ #include "hgeanim.h" hgeAnimation::hgeAnimation(HTEXTURE tex, int nframes, float FPS, float x, float y, float w, float h) : hgeSprite(tex, x, y, w, h) { orig_width = hge->Texture_GetWidth(tex, true); fSinceLastFrame=-1.0f; fSpeed=1.0f/FPS; bPlaying=false; nFrames=nframes; Mode=HGEANIM_FWD | HGEANIM_LOOP; nDelta=1; SetFrame(0); } hgeAnimation::hgeAnimation(const hgeAnimation & anim) : hgeSprite(anim) { // Copy hgeAnimation parameters: this->orig_width = anim.orig_width; this->bPlaying = anim.bPlaying; this->fSpeed = anim.fSpeed; this->fSinceLastFrame = anim.fSinceLastFrame; this->Mode = anim.Mode; this->nDelta = anim.nDelta; this->nFrames = anim.nFrames; this->nCurFrame = anim.nCurFrame; } void hgeAnimation::SetMode(int mode) { Mode=mode; if(mode & HGEANIM_REV) { nDelta = -1; SetFrame(nFrames-1); } else { nDelta = 1; SetFrame(0); } } void hgeAnimation::Play() { bPlaying=true; fSinceLastFrame=-1.0f; if(Mode & HGEANIM_REV) { nDelta = -1; SetFrame(nFrames-1); } else { nDelta = 1; SetFrame(0); } } void hgeAnimation::Update(float fDeltaTime) { if(!bPlaying) return; if(fSinceLastFrame == -1.0f) fSinceLastFrame=0.0f; else fSinceLastFrame += fDeltaTime; while(fSinceLastFrame >= fSpeed) { fSinceLastFrame -= fSpeed; if(nCurFrame + nDelta == nFrames) { switch(Mode) { case HGEANIM_FWD: case HGEANIM_REV | HGEANIM_PINGPONG: bPlaying = false; break; case HGEANIM_FWD | HGEANIM_PINGPONG: case HGEANIM_FWD | HGEANIM_PINGPONG | HGEANIM_LOOP: case HGEANIM_REV | HGEANIM_PINGPONG | HGEANIM_LOOP: nDelta = -nDelta; break; } } else if(nCurFrame + nDelta < 0) { switch(Mode) { case HGEANIM_REV: case HGEANIM_FWD | HGEANIM_PINGPONG: bPlaying = false; break; case HGEANIM_REV | HGEANIM_PINGPONG: case HGEANIM_REV | HGEANIM_PINGPONG | HGEANIM_LOOP: case HGEANIM_FWD | HGEANIM_PINGPONG | HGEANIM_LOOP: nDelta = -nDelta; break; } } if(bPlaying) SetFrame(nCurFrame+nDelta); } } void hgeAnimation::SetFrame(int n) { float tx1, ty1, tx2, ty2; bool bX, bY, bHS; int ncols = int(orig_width) / int(width); n = n % nFrames; if(n < 0) n = nFrames + n; nCurFrame = n; // calculate texture coords for frame n ty1 = ty; tx1 = tx + n*width; if(tx1 > orig_width-width) { n -= int(orig_width-tx) / int(width); tx1 = width * (n%ncols); ty1 += height * (1 + n/ncols); } tx2 = tx1 + width; ty2 = ty1 + height; tx1 /= tex_width; ty1 /= tex_height; tx2 /= tex_width; ty2 /= tex_height; quad.v[0].tx=tx1; quad.v[0].ty=ty1; quad.v[1].tx=tx2; quad.v[1].ty=ty1; quad.v[2].tx=tx2; quad.v[2].ty=ty2; quad.v[3].tx=tx1; quad.v[3].ty=ty2; bX=bXFlip; bY=bYFlip; bHS=bHSFlip; bXFlip=false; bYFlip=false; SetFlip(bX,bY,bHS); }