hgeanim.cpp
资源名称:hge181.rar [点击查看]
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:3k
源码类别:
游戏引擎
开发平台:
Visual C++
- /*
- ** Haaf's Game Engine 1.7
- ** Copyright (C) 2003-2007, Relish Games
- ** hge.relishgames.com
- **
- ** hgeAnimation helper class implementation
- */
- #include "....includehgeanim.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);
- }