You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
6.5 KiB
C++
202 lines
6.5 KiB
C++
//
|
|
// G A M E.O.N.E - LOW LEVEL LIB V1.0
|
|
// Copyright (C) 2001 LEVEL ONE ENTERTAINMENT,
|
|
// Licensed under the terms of LGPL.
|
|
//:---------------------------------------------------------------------------
|
|
//:Description
|
|
//
|
|
// Complex universal Animation class
|
|
// supports frames in topdown singles files (hybridfile)
|
|
// and sequences frames in numbered files
|
|
// Support for direction,loop,step,onframe msg,virtual frame 1
|
|
//
|
|
// CAnim : CFrame
|
|
//
|
|
|
|
|
|
#ifndef _ANIM_H
|
|
#define _ANIM_H
|
|
|
|
#include "../lib_base.h"
|
|
#include "llfrm_actor.h"
|
|
|
|
|
|
class CAnim //: public CActor
|
|
{
|
|
public:
|
|
typedef enum {
|
|
HOLD_NONE, //Nach abspielen der Animation wird kein frame angezeigt
|
|
HOLD_LOOP, //Kein hold, animation wiederholen
|
|
HOLD_FIRST, //Nach abspielen der Animation wird frame1 angezeigt
|
|
HOLD_LAST, //Nach abspielen der Animation wird das letzte frame angezeigt
|
|
HOLD_STARTFRAME, //Nach abspielen der Animation wird das Startframe angezeigt
|
|
HOLD_ENDFRAME, //Nach abspielen der Animation wird das letzt angezeigte Frame angezeigt
|
|
HOLD_CURRENT, //Das aktuelle Frame wird bei Ende der Animation weiterhin gezeigt (Step, unkompletter Durchgang)
|
|
DIRECTION_UP, //von aktuell zum letzten frame
|
|
DIRECTION_DOWN, //von aktuell zum ersten frame
|
|
SINGLE_BUFFER, //Hintergrundupdate=off (Colorkeyframe1=off)
|
|
DOUBLE_BUFFER, //Hintergrundupdate=off (Colorkeyframe1=off)
|
|
UNI_BUFFER, //Hintergrundupdate=on, UNIBUFFER kann rückwärts vorwärts abspielen
|
|
HYBRID_FILE, //File ist ein Hybrid
|
|
SEQUENCE_FILE, //Frames als einzelbilder gespeichert
|
|
} MODE;
|
|
|
|
CAnim();
|
|
virtual ~CAnim();
|
|
|
|
virtual void Action(float delta);
|
|
virtual void Draw(llgfx_id dstgfx);
|
|
virtual void Play();
|
|
virtual void Step();
|
|
virtual void Stop();
|
|
virtual void Update();
|
|
|
|
|
|
void SetBufferType(CAnim::MODE buffertype);
|
|
void SetFileType(CAnim::MODE filetype);
|
|
void SetFile(char *fname);
|
|
void SetAnimTime(float time);
|
|
void SetColorKey(TxU32 colorkey);
|
|
void EnableColorKey(bool yesno);
|
|
void EnableColorKeyFrame1(bool yesno);
|
|
void EnableLoop(bool yesno);
|
|
void EnableToggle(bool yesno);
|
|
void EnableSrcAlpha(bool yesno);
|
|
void SetXPos(int x);
|
|
void SetYPos(int y);
|
|
void SetWidth(int w);
|
|
void SetHeight(int h);
|
|
void SetVirtualFrame1(bool yesno);
|
|
void SetHoldMode(CAnim::MODE holdmode);
|
|
void SetDirection(CAnim::MODE direction);
|
|
void SetFrame(int x); //setzt aktuelles frame
|
|
void SetFrameCount(int x); //setzt anzahl frames, notwendig bei einer sequenz
|
|
void SetCache(bool yesno); //wenn true werden sequenzfiles nicht freigegeben
|
|
void SetName(char *name);
|
|
void SetName(const char *fname);
|
|
void SetStep(bool yesno);
|
|
|
|
bool GetStep();
|
|
char * GetName();
|
|
bool GetCache();
|
|
CAnim::MODE GetBufferType();
|
|
CAnim::MODE GetFileType();
|
|
char * GetFile();
|
|
float GetAnimTime();
|
|
TxU32 GetColorKey();
|
|
int GetXPos();
|
|
int GetYPos();
|
|
int GetWidth();
|
|
int GetHeight();
|
|
bool GetColorKeyEnable();
|
|
bool GetColorKeyFrame1Enable();
|
|
bool GetVirtualFrame1();
|
|
CAnim::MODE GetHoldMode();
|
|
CAnim::MODE GetDirection();
|
|
bool GetLoopEnable();
|
|
bool GetToggleEnable();
|
|
bool GetSrcAlphaEnable();
|
|
int GetFrame(); //return wert = aktuelles (anzuzeigendes Frame)
|
|
int GetFrameCount(); //Anzahl der eingelesenen Frames (inklusive virutellem Frame1)
|
|
int GetState(); //-1, Animfertig, Position = Start
|
|
//-2, Animfertig, Position = Ende
|
|
//0 Animation aktiv, bzw nicht fertig
|
|
//0< Animation aktiv, aktuelles Frame
|
|
|
|
|
|
bool Message(const char *arg); //Messages zum Setzen von werten
|
|
void GetBoundingRect(llgfx_sRECT *rect);
|
|
|
|
|
|
private:
|
|
class CFrame
|
|
{
|
|
public:
|
|
CFrame();
|
|
~CFrame();
|
|
|
|
char* m_path; //pfad zum einzelfile ( xxxx-001.xx )
|
|
int m_gfxnum; //geladene grafiknummer
|
|
bool m_srcalpha; //true wenn geladen mit srcalpha
|
|
};
|
|
|
|
CFrame *GetSequenceFile(int sequnum); //ladet entsprechendes Sequenzfile
|
|
void GetSequenceFileName(char *buf, int frame);
|
|
void ReleaseAllGfx(); //gibt alle Grafiken frei und setzt grafikzeiger auf 0
|
|
void ReleaseGfx(int &gfx); //gibt eine Grafik frei unter berücksichtigung des m_cache flags
|
|
bool GetNextFrame(char &dir, int &frame); //gibt die framenummer der Animation + Time1 zurück
|
|
void LoadCurrentFrame(); //versorgt, ladet m_cur_frame in gfxnum.
|
|
void ReleaseFrame(CFrame *Frame); // gibt frame grafik frei
|
|
void MessageON(const char *arg); // ON <frame> DO <msg>
|
|
void MessageCurFrame(const char *arg); // setzt cur_frame, bleibt immer zwischen 0 und m_frame_cnt
|
|
|
|
protected:
|
|
char * m_Name;
|
|
char * m_EndMsg; //Wird am ende einer animation gesendet
|
|
char * m_StartMsg; //Wird beim start einer animation gesendet
|
|
char * m_Fr1Msg; //Wird bei erreichen von Frame 1 gesendet
|
|
char * m_FrXMsg; //Wird bei erreichen des letzten Frames gesendet
|
|
|
|
// Bestimmte Msg bei einem Frame
|
|
// ON x DO
|
|
queue<char> m_OnFrame; //
|
|
|
|
char *m_argFilename; //name der animationsdatei aus dem SetFile - Parameter
|
|
char *m_gfxFilename; //name der animationsdatei
|
|
char *m_gfxExtension; //sequence
|
|
char *m_PositionList; //name der positionsdatei bei einem Hybridfile
|
|
llgfx_sRECT *m_positions; //Zeiger auf positionrect array
|
|
|
|
bool m_cache; //wenn true werden sequenzefiles nicht released (freigegeben)
|
|
bool m_stepflag; //wenn true wird jede nur ein Frame gespielt
|
|
|
|
MODE m_buffertype; //single, double, uni buffer
|
|
MODE m_holdmode;
|
|
MODE m_filetype; //MODE_SEQUNCE, MODE_HYBRID_FILE
|
|
|
|
int m_seqlen; //Anzahl der ziffern der nummer der sequenz
|
|
int m_seqnum; //beginn der nummer
|
|
|
|
int m_xpos; //xposition dstrect
|
|
int m_ypos;
|
|
int m_xoffset;
|
|
int m_yoffset;
|
|
|
|
bool m_loop; //true wenn loop modus eingeschaltet ist
|
|
bool m_toggle; //true wenn bei loop modus die richtung gewechselt wird (POING)
|
|
bool m_state; //true wenn animation im gang
|
|
bool m_ckEnable; //true wenn colorkey enabled
|
|
TxU32 m_colorkey; //colorkey farbe
|
|
bool m_virtFrame1; //wenn true, dann ist frame1 virtuell und daher nicht gezeichnet oder geladen
|
|
//z.B Frame1 entspricht dem Hintergrund
|
|
bool m_ckFrame1Enable; //Colorkey für frame1 ein/aus. Nur bei nicht virtuellen Frame1 notwendig.
|
|
|
|
llgfx_sRECT m_dstrect;
|
|
llgfx_sRECT m_srcrect;
|
|
|
|
int m_frame_width;
|
|
int m_frame_height;
|
|
int m_frame_cnt;
|
|
int m_first_frame; //frame nummer bei beginn der animation
|
|
|
|
//Animationsvariablen
|
|
int m_cur_frame; //aktuelles frame
|
|
float m_AnimTime; //Zeit für die gesamte Animation
|
|
float m_time; //aktuelle animzeit
|
|
float m_oldtime; //delta-merker
|
|
char m_direction; //Up Down Toggle
|
|
|
|
CFrame *m_current; //aktuell zum zeichnen
|
|
queue<CFrame> m_frames;
|
|
|
|
|
|
|
|
bool m_bMenuActive; //true, dann wird das menu angezeigt
|
|
public:
|
|
llgfx_sBLITFX m_blitfx;
|
|
int m_blitflags;
|
|
|
|
};
|
|
|
|
#endif
|