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++

//
// 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