⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sprite2d.h

📁 用VC在BREW平台上开发的手机游戏Superball的源代码
💻 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 + -