sgdk
sprite_eng.h
Go to the documentation of this file.
00001 
00012 #if     !LEGACY_SPRITE_ENGINE
00013 
00014 #ifndef _SPRITE_ENG_H_
00015 #define _SPRITE_ENG_H_
00016 
00017 #include "vdp_tile.h"
00018 #include "vdp_spr.h"
00019 #include "pal.h"
00020 #include "pool.h"
00021 
00022 
00027 #define COLLISION_TYPE_NONE     0
00028 
00032 #define COLLISION_TYPE_BOX      1
00033 
00037 #define COLLISION_TYPE_CIRCLE   2
00038 
00044 #define SPR_FLAG_INSERT_HEAD                    0x4000
00045 
00051 #define SPR_FLAG_DISABLE_ANIMATION_LOOP         0x2000
00052 
00058 #define SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE   0x1000
00059 
00063 #define SPR_FLAG_AUTO_VRAM_ALLOC                0x0800
00064 
00068 #define SPR_FLAG_AUTO_TILE_UPLOAD               0x0400
00069 
00073 #define SPR_FLAG_AUTO_VISIBILITY                0x0200
00074 
00080 #define SPR_FLAG_FAST_AUTO_VISIBILITY           0x0100
00081 
00086 #define SPR_FLAG_MASK                           (SPR_FLAG_INSERT_HEAD | SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE | SPR_FLAG_AUTO_VRAM_ALLOC | SPR_FLAG_AUTO_TILE_UPLOAD | SPR_FLAG_AUTO_VISIBILITY | SPR_FLAG_FAST_AUTO_VISIBILITY)
00087 
00092 #define SPR_MIN_DEPTH       (-0x8000)
00093 
00097 #define SPR_MAX_DEPTH       0x7FFF
00098 
00103 typedef enum
00104 {
00105     VISIBLE,        
00106     HIDDEN,         
00107     AUTO_FAST,      
00108     AUTO_SLOW,      
00109 } SpriteVisibility;
00110 
00124 typedef struct
00125 {
00126     s8 x;
00127     s8 y;
00128     u8 w;
00129     u8 h;
00130 } BoxCollision;
00131 
00143 typedef struct
00144 {
00145     s8 x;
00146     s8 y;
00147     u16 ray;
00148 } CircleCollision;
00149 
00170 typedef struct _collision
00171 {
00172     u8 typeHit;
00173     u8 typeAttack;
00174     union
00175     {
00176         BoxCollision box;
00177         CircleCollision circle;
00178     } hit;
00179     union
00180     {
00181         BoxCollision box;
00182         CircleCollision circle;
00183     } attack;
00184 } Collision;
00185 
00203 typedef struct
00204 {
00205     u8 offsetY;          // respect VDP sprite field order, may help
00206     u8 offsetYFlip;
00207     u8 size;
00208     u8 offsetX;
00209     u8 offsetXFlip;
00210     u8 numTile;
00211 }  FrameVDPSprite;
00212 
00228 typedef struct
00229 {
00230     u8 numSprite;
00231     u8 timer;
00232     TileSet* tileset;                   // TODO: have a tileset per VDP sprite --> probably not a good idea performance wise
00233     Collision* collision;               // Require many DMA queue operations and fast DMA flush as well, also bring extra computing in calculating delayed update
00234     FrameVDPSprite frameVDPSprites[];
00235 } AnimationFrame;
00236 
00248 typedef struct
00249 {
00250     u8 numFrame;
00251     u8 loop;
00252     AnimationFrame** frames;
00253 } Animation;
00254 
00276 typedef struct
00277 {
00278     u16 w;
00279     u16 h;
00280     Palette* palette;
00281     u16 numAnimation;
00282     Animation** animations;
00283     u16 maxNumTile;
00284     u16 maxNumSprite;
00285 } SpriteDefinition;
00286 
00327 typedef struct Sprite
00328 {
00329     u16 status;
00330     u16 visibility;
00331     const SpriteDefinition* definition;
00332     void (*onFrameChange)(struct Sprite* sprite);
00333     Animation* animation;
00334     AnimationFrame* frame;
00335     s16 animInd;
00336     s16 frameInd;
00337     u16 timer;
00338     s16 x;
00339     s16 y;
00340     s16 depth;
00341     u16 attribut;
00342     u32 data;
00343     struct Sprite* prev;
00344     struct Sprite* next;
00345 } Sprite;
00346 
00358 typedef void FrameChangeCallback(Sprite* sprite);
00359 
00363 extern Pool* spritesPool;
00367 extern Sprite* firstSprite;
00371 extern Sprite* lastSprite;
00375 extern u16 spriteVramSize;
00376 
00377 
00388 void SPR_init(void);
00403 void SPR_initEx(u16 vramSize);
00411 void SPR_end(void);
00416 bool SPR_isInitialized(void);
00417 
00424 void SPR_reset(void);
00425 
00470 Sprite* SPR_addSpriteEx(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 flag);
00495 Sprite* SPR_addSprite(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut);
00538 Sprite* SPR_addSpriteExSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 flag);
00561 Sprite* SPR_addSpriteSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut);
00562 
00574 void SPR_releaseSprite(Sprite* sprite);
00579 u16 SPR_getNumActiveSprite(void);
00584 u16 SPR_getUsedVDPSprite(void);
00589 u16 SPR_getFreeVRAM(void);
00594 u16 SPR_getLargestFreeVRAMBlock(void);
00595 
00606 void SPR_enableVDPSpriteChecking();
00615 void SPR_disableVDPSpriteChecking();
00620 void SPR_defragVRAM(void);
00649 u16** SPR_loadAllFrames(const SpriteDefinition* sprDef, u16 index, u16* totalNumTile);
00650 
00665 bool SPR_setDefinition(Sprite* sprite, const SpriteDefinition* spriteDef);
00670 s16 SPR_getPositionX(Sprite* sprite);
00675 s16 SPR_getPositionY(Sprite* sprite);
00687 void SPR_setPosition(Sprite* sprite, s16 x, s16 y);
00697 void SPR_setHFlip(Sprite* sprite, bool value);
00707 void SPR_setVFlip(Sprite* sprite, bool value);
00717 void SPR_setPalette(Sprite* sprite, u16 value);
00727 void SPR_setPriority(Sprite* sprite, bool value);
00732 #define SPR_setPriorityAttribut(sprite, value)      _Pragma("GCC error \"This method is deprecated, use SPR_setPriority(..) instead.\"")
00733 
00745 void SPR_setDepth(Sprite* sprite, s16 value);
00750 void SPR_setZ(Sprite* sprite, s16 value);
00760 void SPR_setAlwaysOnTop(Sprite* sprite);
00770 void SPR_setAlwaysAtBottom(Sprite* sprite);
00771 
00783 void SPR_setAnimAndFrame(Sprite* sprite, s16 anim, s16 frame);
00793 void SPR_setAnim(Sprite* sprite, s16 anim);
00803 void SPR_setFrame(Sprite* sprite, s16 frame);
00811 void SPR_nextFrame(Sprite* sprite);
00812 
00826 void SPR_setAnimationLoop(Sprite* sprite, bool value);
00836 bool SPR_getAnimationDone(Sprite* sprite);
00837 
00852 bool SPR_setVRAMTileIndex(Sprite* sprite, s16 value);
00863 void SPR_setAutoTileUpload(Sprite* sprite, bool value);
00876 void SPR_setDelayedFrameUpdate(Sprite* sprite, bool value);
00892 void SPR_setFrameChangeCallback(Sprite* sprite, FrameChangeCallback* callback);
00893 
00912 SpriteVisibility SPR_getVisibility(Sprite* sprite);
00930 bool SPR_isVisible(Sprite* sprite, bool recompute);
00931 
00955 void SPR_setVisibility(Sprite* sprite, SpriteVisibility value);
00959 #define SPR_setAlwaysVisible(sprite, value)     _Pragma("GCC error \"This method is deprecated, use SPR_setVisibility(..) instead.\"")
00960 
00963 #define SPR_setNeverVisible(sprite, value)      _Pragma("GCC error \"This method is deprecated, use SPR_setVisibility(..) instead.\"")
00964 
00967 #define SPR_computeVisibility(sprite)           _Pragma("GCC error \"This method is deprecated, use SPR_isVisible(sprite, TRUE) instead.\"")
00968 
00976 void SPR_clear(void);
00986 void SPR_update(void);
00987 
00992 void SPR_logProfil(void);
00997 void SPR_logSprites(void);
00998 
00999 
01000 #endif // _SPRITE_ENG_H_
01001 
01002 #endif
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines