// // 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 DO 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 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 m_frames; bool m_bMenuActive; //true, dann wird das menu angezeigt public: llgfx_sBLITFX m_blitfx; int m_blitflags; }; #endif