📄 sprite2d.h
字号:
/*
* BREW Extension Library
* Copyright (c) 2003-2005 ANYSOFT.CN
* All Rights Reserved.
*/
/*!-----------------------------------
@file
@brief [Sprite2D]2D精灵工厂
对Sprite接口的封装,采用精灵模型+动作脚本模式(visitor模式)实现
快速动画制作。动作脚本采用将复杂动作分解为动作元的方式实现动作
的合成。
-----------------------------------*/
/*!
@defgroup Sprite2D Sprite2D Module/2D动画功能模块
*/
#ifndef _BEL_SPRITE2D_H_
#define _BEL_SPRITE2D_H_
#include "AEESprite.h"
#include "Bel.h"
#include "AEEAppGen.h"
#include "Helper.h"
#define SPRITEDEF 100
#define FUNC SPRITEDEF + 1
#define TABLE SPRITEDEF + 2
#define MOVETO SPRITEDEF + 3
#define TILE SPRITEDEF + 11
#define SPRITE SPRITEDEF + 12
#define SPRITE_AND_TILE SPRITEDEF + 13
#define SPRMGR_MAX_RES 8
//-------------add by liudibo-------------
//旋转的默认中心
#define DEFAULTCENTER 1000
typedef enum SpriteType { ME, PERSON, OBJECT, NONE };
//-------------add by liudibo-------------
typedef enum SpriteResType {SPRITE_BITMAP = 10, SPRITE_PNG = 11, TILE_BITMAP = 12, TILE_PNG = 13};
typedef AEEPoint (*DISPLACEMENTFUNC)(int16 t,void* pArg);
class SpriteMgr;
class SpriteAction;
class ActionElement;
class Displacement;
class FaceChange;
class Rotation;
/*!
@ingroup Sprite2D
@brief 瓷砖地图类
对应ISprite接口的AEETileMap结构类,实现对地图的绘制。
*/
class TileMap:public BREWObj
{
public:
TileMap();
virtual ~TileMap();
void SetManager(SpriteMgr * psmgr);
void RegisterProperty(uint16* mapArray,int16 x,int16 y,uint16 w,uint16 h,uint8 size = TILE_SIZE_16X16,uint32 Flags = 0);
void ChangeMap(uint16* mapArray);
void ChangeSize(uint16 w,uint16 h);
void SetWrap(boolean isWraping);
void WrapToPos(int16 x,int16 y);
AEETileMap GetProperty();
protected:
void DepictMap();
protected:
uint16 index;
AEETileMap property;
SpriteMgr * pSMgr;
};
/*!
@ingroup Sprite2D
@brief 精灵模型类
对应ISprite接口的AEESpriteCmd结构类,建立小精灵模型。
*/
class SpriteModel:public BREWObj
{
public:
SpriteModel();
virtual ~SpriteModel();
void Retire();
void SetManager(SpriteMgr * psmgr);
void ModifyInternalIndex(uint16 i);
void Hide();
void Reveal(uint8 layer);
void RegisterProperty(int16 x,int16 y,uint8 stripIndex,uint8 layer = 0,uint8 size = SPRITE_SIZE_16X16,uint8 composite = 0, uint8 group = 0);
void MoveToPos(int16 x, int16 y);
void MoveToLayer(uint8 layer);
void ModifyStripIndex(int index, int group = 0);
void ModifyShape(int16 angle,int16 zoom);
AEESpriteCmd GetProperty();
protected:
void DepictModel();
protected:
uint16 index;
AEESpriteCmd property;
SpriteMgr * pSMgr;
friend class SpriteMgr;
friend class Displacement;
friend class FaceChange;
friend class Rotation;
};
/*!
@ingroup Sprite2D
@brief 扩展精灵模型类
扩展小精灵模型,加入占位矩形,占位类型。
*/
class SpriteModelEx : public SpriteModel
{
public:
SpriteModelEx();
virtual ~SpriteModelEx();
void SetManager(SpriteMgr* psmgr);
void SetOtherProperty(uint8 Width, uint8 Height, uint8 Left, uint8 Bottom, SpriteType Stype);
void ModifyInternalIndex(uint16 i);
public:
uint8 Occupy_Width, Occupy_Height;
uint8 Occupy_Left, Occupy_Bottom;
SpriteType type;
uint16 order;
};
/*!
@ingroup Sprite2D
@brief 装配工类
关联一个精灵模型与一个动作组(SpriteAction)的节点类,是表演队列的元素。
*/
class Assembler:public BREWObj
{
public:
Assembler();
virtual ~Assembler();
protected:
SpriteModel *pspritemodel;
SpriteAction*pspriteaction;
int16 currCycle;
int16 currLoop;
boolean IsActing;
friend class SpriteMgr;
};
/*!
@ingroup Sprite2D
@brief 动画管理类
实现对地图、精灵、动作的管理与组合,维护了表演队列,并负责渲染屏幕的工作。
*/
class SpriteMgr:public BREWObj
{
public:
int16 originX;
int16 originY;
AEEApplet* pApp;
AEESpriteCmd* roles;
AEETileMap* maps;
AEETransformMatrix* transform;
protected:
PtrList performList;
ISprite* pISprite;
int16 spriteNum;
int16 tileNum;
int16 sCounter;
int16 tCounter;
int16 groupCounter[4][SPRMGR_MAX_RES];
public:
SpriteMgr(AEEApplet *app);
virtual ~SpriteMgr();
void Perform();
void MakeUp(SpriteModel *pspritemodel,SpriteAction *pspriteaction);
AppResult RegisterSprite(int16 num);
AppResult RegisterTile(int16 num);
AppResult RegisterTrans();
AppResult LoadScene(uint8 nsize, int16 nID, const char *szResFile, const int type);
AppResult LoadScene(uint8 nsize, int16 nIDs[], uint8 num, const char *szResFile, const int type);
void CopyModel(SpriteModel *pDest,SpriteModel *pScr);
void CopyProperty(SpriteModel *pDest, SpriteModel *pScr);
void RenderScene();
void Clear();
void Dismiss(SpriteModel *pspritemodel);
//--------Add by liudibo-------------
void ChangeRegSpriteNum(int16 num);
//--------Add by liudibo-------------
uint8 ActualIndex(uint8 size, uint8 index, uint8 group);
friend class SpriteModel;
friend class SpriteModelEx;
friend class TileMap;
};
/*!
@ingroup Sprite2D
@brief 动作元素基类
是预定义的几种基本动作的基类,负责对时间轴、起始点、轴方向等基本
属性的定义。
*/
class ActionElement:public BREWObj
{
public:
ActionElement();
virtual ~ActionElement();
virtual void ModifySprite(SpriteModel* pmodel) = 0;
void Enable();
void Disable();
void Reverse();
void SetLoop(int16 loop);
void SetStartAt(int16 start);
protected:
int16 totalCycle;
int16 totalLoop;
// int16 currCycle;
// int16 currLoop;
int16 timeAxis;
int16 startAt;
int8 direction;
friend class SpriteAction;
};
/*!
@ingroup Sprite2D
@brief 精灵动作类
该类是各种基本动作元素的承载。维护动作列表,从而实现动作的组合。
*/
class SpriteAction:public BREWObj
{
public:
SpriteAction();
virtual ~SpriteAction();
boolean Act(SpriteModel* pmodel,int16 *cycle,int16 *loop);
void Add(ActionElement *paelement);
void Clear();
protected:
PtrList actionList;
};
/*!
@ingroup Sprite2D
@brief 位移动作元素类
该类定义了基本动作元素,位移。可以通过指定位移方程、设定单步位移坐标
或者指定位移点的方式实现位移动作。
*/
class Displacement:public ActionElement
{
public:
Displacement();
virtual ~Displacement();
void SetDisplacementFunc(DISPLACEMENTFUNC df,void* parg);
void SetTimeAxis(int16 totalcycle,int8 dir);
void SetDisplacementTable(int16 dt[]);
void SetAbsolute(boolean be);
AEEPoint GetCurrPosition();
AEEPoint GetPrevPosition();
void MoveTo(int16 fromX,int16 fromY,int16 toX,int16 toY);
virtual void ModifySprite(SpriteModel* pmodel);
protected:
int16 dX;
int16 dY;
DISPLACEMENTFUNC func;
void* pArg;
int16* table;
int16 mvX;
int16 mvY;
uint8 funcMode;
boolean isAbsolute;
};
/*!
@ingroup Sprite2D
@brief 图片切换动作元素类
该类定义了基本动作元素,图片切换。可以通过设定图片切换表,或者指定单
步切换图片的方式实现图片的切换。可以实现图形的变化动作。
*/
class FaceChange:public ActionElement
{
public:
FaceChange();
virtual ~FaceChange();
virtual void ModifySprite(SpriteModel* pmodel);
void SetFaceTable(uint8 ft[],uint8 totalcycle,uint8 totalface);
void ChangeTo(uint8 face);
uint8 GetCurrFace();
protected:
uint8 * facetable;
uint8 totalFaces;
boolean singleFrame;
uint8 singleFace;
};
/*!
@ingroup Sprite2D
@brief 旋转动作元素类
该类定义了基本动作元素,旋转。可以通过设定旋转角度来完成旋转图像的
动作。也可以实现图像的比例缩放。该类的使用应该结合SpriteMgr中的
RegisterTrans()方法。
*/
class Rotation:public ActionElement
{
public:
Rotation();
virtual ~Rotation();
virtual void ModifySprite(SpriteModel* pmodel);
int16 GetCurrAngle();
void SetRotation(int16 angle,int16 time,int16 zm);
protected:
int16 tAngle;
int16 zoom;
//private:
// static int16 Sin(int16 angle);
};
/*!
@ingroup Sprite2D(Add by liudibo)
@brief 精灵组合Character类
Character类实现对Sprite的封装,即同时使多个Sprite同样的工作,精灵的注册与现实
仍然调用原来的SpriteModel中的方法
*/
class Character:public BREWObj
{
protected:
PtrList SpriteList, LayerList, FaceList;
boolean ActionEnd;
uint8 *m_NowPlayArray, *m_EndArray;
uint8 m_Width, m_Height;
uint8 m_SpriteNum;
int m_x, m_y;
int FaceNum, LoopNum;
public:
Character();
virtual ~Character();
//实现Character模型的一些基本操作,包括创建、移动等
void CreateCharacter(int x, int y, uint8 Width, uint8 Height);
void InsertSprite(SpriteModelEx *Model);
void InsertSprite(SpriteModelEx *Model, SpriteMgr *Mgr, uint8 Layer, uint8 *SpriteArray, uint8 Size);
void DeleteSprite(SpriteModelEx *Model);
void ChangeSpritePos(SpriteModelEx *Model, int x_Offset, int y_Offset);
void ChangeSpriteFace(uint8 SpriteIndex, uint8 FaceIndex);
void ChangeCharFace(uint8 *SpriteArray);
void CharHide();
void CharReveal();
void MoveToPos(int x, int y);
void CharMoveOffset(int16 x_Offset, int16 y_Offset);
void CharMoveToLayer(uint8 layer);
void DestroyCharacter();
void GetXY(AEEPoint *LeftUp = NULL, AEEPoint *RightDown = NULL);
uint8 GetSpriteNum();
void GetSpriteList(PtrList *ptrlist);
void ReOrderSprites();
void Retire();
//实现Character模型按照指定函数轨迹移动,配合Perform()
void SetMoveFunc(DISPLACEMENTFUNC df, SpriteMgr *Mgr, SpriteAction *Action, Displacement *Place, int16 totalcycle, int8 dir);
void SetMoveTable(int16 dt[], SpriteMgr *Mgr, SpriteAction *Action, Displacement *Place, int16 totalcycle, int8 dir);
//实现随时间变换Character模型的样子
void AddFace(uint8 *SpriteArray);
void SetLoopProperty(int16 Loop, uint8 *StartSpriteArray = NULL, uint8 *EndSpriteArray = NULL);
void ChangeAct();
void ChangeStop();
void ClearFace();
//实现Character模型的缩放与旋转
void CharModifyShape(int16 Angle = 0, int16 Zoom = 256, int16 CenterX = DEFAULTCENTER, int16 CenterY = DEFAULTCENTER);
void SetOtherProperty(uint8 Width, uint8 Height, uint8 Left, uint8 Bottom, SpriteType Stype);
public:
uint8 Occupy_Width, Occupy_Height;
uint8 Occupy_Left, Occupy_Bottom;
SpriteType type;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -