PA_Sprite.h

Aller à la documentation de ce fichier.
00001 #ifndef _PA_Sprite
00002 #define _PA_Sprite
00003 
00004 #ifdef __cplusplus
00005 extern "C" {
00006 #endif
00007 
00014 #include "PA_Math.h"
00015 
00016 
00017 #define EWRAM_DATA   __attribute__((section(".ewram")))
00018 #define EWRAM_BSS    __attribute__((section(".sbss")))
00019 #define PA_Cos(angle) PA_SIN[((angle) + 128)&511]
00020 #define PA_Sin(angle) PA_SIN[((angle))&511]
00021 extern const s16 PA_SIN[512]; 
00022 
00023 #define MAX_DRAW 16  // Maximum 16 sprites dessinables...
00024 
00025 
00027 // Système de sprites
00029 
00030 
00031 #define OBJ_SIZE_8X8      0,0
00032 #define OBJ_SIZE_16X16    0,1
00033 #define OBJ_SIZE_32X32    0,2
00034 #define OBJ_SIZE_64X64    0,3
00035 #define OBJ_SIZE_16X8     1,0
00036 #define OBJ_SIZE_32X8     1,1
00037 #define OBJ_SIZE_32X16    1,2
00038 #define OBJ_SIZE_64X32    1,3
00039 #define OBJ_SIZE_8X16     2,0
00040 #define OBJ_SIZE_8X32     2,1
00041 #define OBJ_SIZE_16X32    2,2
00042 #define OBJ_SIZE_32X64    2,3
00043 
00044 typedef struct {
00045        u8 lx, ly;
00046 } PA_sizes;
00047 
00048 extern const PA_sizes PA_size[3][4];
00049 
00050 
00051 #define BITS_16 65535
00052 #define ALL_BUT(ATR) (BITS_16 - ATR)
00053 
00054 #define PA_OBJ_X 511 //511, debugging...
00055 #define PA_OBJ_Y 255
00056 #define OBJ_ROT 256
00057 #define ALL_BUT_ROTSET 49663  // Numéro du rotset
00058 #define ALL_BUT_PAL 4095
00059 
00060 #define DBLSIZE 512
00061 #define N_COLORS (1 << 13)
00062 #define OBJ_MODE 3072
00063 #define OBJ_MOSAIC 4096
00064 #define OBJ_HFLIP 4096
00065 #define OBJ_VFLIP 8192
00066 
00067 #define OBJ_GFX 1023
00068 #define OBJ_PRIO 3072
00069 
00070 #define COLORS_256 1
00071 #define COLORS_16 0
00072 
00073 
00074 
00075 #define MEM_DECAL 5
00076 #define NUMBER_DECAL 7
00077 
00078 
00079 
00080 // Mémoire gfx
00081 typedef struct {
00082    u16 mem_block;  // Emplacement en mémoire, de 0 à 1023
00083    u16 free; // Doonées libres en ce point
00084 } mem_usage;
00085 
00086 extern u16 n_free_mem[2]; // nombre d'emplacements libres
00087 extern u8 used_mem[2][1024]; // Note la quantité de mémoire utilisée en chaque point de la mémoire pour pouvoir effacer les gfx...
00088 extern u8 obj_per_gfx[2][1024]; // Nombre de sprites utilisant un gfx donné...
00089 extern mem_usage free_mem[2][1024];
00090 
00091 extern u16 FirstGfx[2];
00092 
00093 extern const u16 PA_obj_sizes[4][3];
00094 
00095 typedef struct {
00096    u16 atr0, atr1, atr2, atr3;
00097 }obj_inf;
00098 extern obj_inf PA_obj[2][128];  // Les 128 premiers pour l'écran du haut, et encore 128 pour l'écran du bas...
00099 
00100 extern u8 PA_SpritePrio[2][128]; // Set the sprite priorities...
00101 
00102 // Infos pour dessiner sur les sprites
00103 /*
00104 typedef struct {
00105        u8 screen; // Ecran
00106        u8 sprite;           // Numéro du sprite
00107        u8 wasdrawing; // Si on dessinait dessus ou pas avant
00108        s8 x, y;  // Position x et y d'avant
00109        u8 hsize, vsize; // Tailles
00110        u8 n_colors; // Nombre de couleurs
00111        u8 drawsize;
00112        u32 *gfxpointer; // Pour dessiner à l'écran directement
00113 } PA_DrawSprites;
00114 */
00115 
00116 
00117 //extern PA_DrawSprites PA_DrawSprite[MAX_DRAW];
00118 
00119 // Pour le dessin sur sprite
00120 extern unsigned char *PA_SpriteBuffer[MAX_DRAW]; // Pointeurs vers les buffers  que l'on créera à la volée
00121 
00122 extern u16 *PA_SpriteAnimP[2][1024];
00123 
00124 
00125 #define ANIM_LOOP 0 // loop around
00126 #define ANIM_UPDOWN 1 // back and forth animation
00127 
00128 #define ANIM_ONESHOT ANIM_LOOP, 1
00129 #define ANIM_INFINITE ANIM_LOOP, -1
00130 
00131 
00132 
00133 extern s16 nspriteanims; // Number of animated sprites currently...
00134 typedef struct{
00135        s32 firstframe, lastframe, currentframe; // frames...
00136        s8 framechange; // 1 by default, -1 to go back...
00137        s32 time; // Time...
00138        u8 lx, ly; // Sprite sizes
00139        u8 colors; 
00140        s16 speed;
00141        u8 play;
00142        u16 *gfx; // gfx pointer
00143        u8 type;
00144        s32 ncycles;
00145        u32 HideX;
00146 //     bool exists; //
00147 } spriteanim;
00148 extern spriteanim spriteanims[2][128]; // Init the array on PAlib init...
00149 
00150 //#define spriteanimsize 40
00151 
00152 
00153 
00154 extern u8 PA_SpriteExtPrio;
00155 
00156 
00157 
00158 
00159 
00160 
00161 #define OAM0 0x07000000
00162 #define OAM1 0x07000400
00163 
00164 
00177 #define PA_UpdateOAM0() DMA_Copy((void*)PA_obj, (void*)OAM0, 256, DMA_32NOW)
00178 
00184 #define PA_UpdateOAM1() DMA_Copy((void*)PA_obj + 256, (void*)OAM1, 256, DMA_32NOW)
00185 
00186 
00187 
00188 
00189 
00190 
00197 void PA_UpdateOAM(void);
00198 
00199 
00221 u16 PA_CreateGfx(u8 screen, void* obj_data, u8 obj_shape, u8 obj_size, u8 color_mode);
00222 
00231 void PA_ResetSpriteSysScreen(u8 screen);
00232 
00233 
00239 void PA_ResetSpriteSys(void);
00240 
00241 
00242 
00275 extern inline void PA_CreateSprite(u8 screen, u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, s16 x, s16 y) {
00276    PA_obj[screen][obj_number].atr2 = PA_CreateGfx(screen, obj_data, obj_shape, obj_size, color_mode) + (palette << 12);
00277    PA_obj[screen][obj_number].atr0 = (y&PA_OBJ_Y) + (color_mode << 13) + (obj_shape << 14);
00278    PA_obj[screen][obj_number].atr1 = (x & PA_OBJ_X) + (obj_size << 14);
00279 };
00280 
00331 extern inline void PA_CreateSpriteEx(u8 screen, u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, u8 obj_mode, u8 mosaic, u8 hflip, u8 vflip, u8 prio, u8 dblsize, s16 x, s16 y) {
00332    PA_obj[screen][obj_number].atr2 = PA_CreateGfx(screen, obj_data, obj_shape, obj_size, color_mode) + (prio << 10) + (palette << 12);
00333    PA_obj[screen][obj_number].atr0 = (y&PA_OBJ_Y) + (dblsize << 9) + (obj_mode << 10) + (mosaic << 12) + ((color_mode) << 13) + (obj_shape << 14);
00334    PA_obj[screen][obj_number].atr1 = (x & PA_OBJ_X) + (hflip << 12) + (vflip << 13) + (obj_size << 14);
00335 };
00336 
00337 
00338 
00339 
00340 
00382 extern inline void PA_Create16bitSpriteEx(u8 screen, u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, u8 mosaic, u8 hflip, u8 vflip, u8 prio, u8 dblsize, s16 x, s16 y){
00383    PA_obj[screen][obj_number].atr2 = PA_CreateGfx(screen, obj_data, obj_shape, obj_size, 2) + (prio << 10);// + (15 << 12);
00384    PA_obj[screen][obj_number].atr0 = (y&PA_OBJ_Y) + (dblsize << 9) + (3 << 10) + (mosaic << 12) + (0 << 13) + (obj_shape << 14);
00385    PA_obj[screen][obj_number].atr1 = (x & PA_OBJ_X) + (hflip << 12) + (vflip << 13) + (obj_size << 14);
00386 }
00387 
00388 
00389 
00390 
00417 extern inline void PA_Create16bitSpriteFromGfx(u8 screen, u8 obj_number, u16 gfx, u8 obj_shape, u8 obj_size, s16 x, s16 y){
00418    PA_obj[screen][obj_number].atr2 = gfx + (15 << 12);
00419    PA_obj[screen][obj_number].atr0 = (y&PA_OBJ_Y) + (3 << 10) + (obj_shape << 14);
00420    PA_obj[screen][obj_number].atr1 = (x & PA_OBJ_X) + (obj_size << 14);
00421 }
00422 
00423 
00424 
00425 
00426 
00453 extern inline void PA_Create16bitSprite(u8 screen, u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, s16 x, s16 y){
00454 PA_Create16bitSpriteEx(screen, obj_number, obj_data, obj_shape, obj_size, 0, 0, 0, 0, 0, x, y);
00455 }
00456 
00457 
00458 
00459 
00492 extern inline void PA_CreateSpriteFromGfx(u8 screen, u8 obj_number, u16 obj_gfx, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, s16 x, s16 y) {
00493    PA_obj[screen][obj_number].atr2 = obj_gfx + (palette << 12);
00494    PA_obj[screen][obj_number].atr0 = (y&PA_OBJ_Y) + (color_mode << 13) + (obj_shape << 14);
00495    PA_obj[screen][obj_number].atr1 = (x & PA_OBJ_X) + (obj_size << 14);
00496    ++obj_per_gfx[screen][obj_gfx];
00497 };
00498 
00549 extern inline void PA_CreateSpriteExFromGfx(u8 screen, u8 obj_number, u16 obj_gfx, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, u8 obj_mode, u8 mosaic, u8 hflip, u8 vflip, u8 prio, u8 dblsize, s16 x, s16 y) {
00550    PA_obj[screen][obj_number].atr2 = obj_gfx + (prio << 10) + (palette << 12);
00551    PA_obj[screen][obj_number].atr0 = (y&PA_OBJ_Y) + (dblsize << 9) + (obj_mode << 10) + (mosaic << 12) + (color_mode << 13) + (obj_shape << 14);
00552    PA_obj[screen][obj_number].atr1 = (x & PA_OBJ_X) + (hflip << 12) + (vflip << 13) + (obj_size << 14);
00553    ++obj_per_gfx[screen][obj_gfx];
00554 };
00555 
00556 
00571 #define PA_UpdateSpriteGfx(screen, obj_number, obj_data) PA_UpdateGfx(screen, PA_GetSpriteGfx(screen, obj_number), obj_data)
00572 
00590 extern inline void PA_UpdateGfx(u8 screen, u16 gfx_number, void *obj_data) {
00591        DMA_Copy((obj_data), (void*)(SPRITE_GFX1 + (0x200000 *  (screen)) + ((gfx_number) << NUMBER_DECAL)), (used_mem[screen][gfx_number] << (MEM_DECAL+1)), DMA_16NOW);
00592 //     PA_OutputText(1, 25, PA_Rand()&15, "%dgfx   ", gfx_number);
00593 }
00594 
00595 
00611 extern inline void PA_UpdateGfxAndMem(u8 screen, u8 gfx_number, void *obj_data){
00612        DMA_Copy((obj_data), (void*)(SPRITE_GFX1 + (0x200000 *  (screen)) + ((gfx_number) << NUMBER_DECAL)), (used_mem[screen][gfx_number] << MEM_DECAL), DMA_32NOW);
00613        PA_SpriteAnimP[screen][gfx_number] = (u16*)obj_data; // mémorise la source de l'image...
00614 }
00615 
00616 
00617 
00618 
00630 void PA_DeleteGfx(u8 screen, u16 obj_gfx);
00631 
00632 
00644 void PA_DeleteSprite(u8 screen, u8 obj_number);
00645 
00646 
00662 #define PA_SetSpriteRotEnable(screen, sprite, rotset) {PA_obj[screen][sprite].atr0 |= OBJ_ROT;  PA_obj[screen][sprite].atr1 = (PA_obj[screen][sprite].atr1 & ALL_BUT_ROTSET) + ((rotset) << 9);}
00663 
00675 #define PA_SetSpriteRotDisable(screen, sprite) {PA_obj[screen][sprite].atr0 &= ALL_BUT(OBJ_ROT);  PA_obj[screen][sprite].atr1 &= ALL_BUT_ROTSET;}
00676 
00677 
00699 extern inline void PA_SetRotset(u8 screen, u8 rotset, s16 angle, u16 zoomx, u16 zoomy) {
00700 u8 obj_num = (rotset << 2);
00701        PA_obj[screen][obj_num].atr3 = (PA_Cos(angle) * zoomx) >> 8;
00702        PA_obj[screen][obj_num + 1].atr3 = (-PA_Sin(angle) * zoomy) >> 8;
00703        PA_obj[screen][obj_num + 2].atr3 = (PA_Sin(angle) * zoomx) >> 8;
00704        PA_obj[screen][obj_num + 3].atr3 = (PA_Cos(angle) * zoomy) >> 8;
00705 }
00706 
00721 extern inline void PA_SetRotsetNoZoom(u8 screen, u8 rotset, s16 angle)   {
00722 u8 obj_num = (rotset << 2);
00723        PA_obj[screen][obj_num].atr3 = PA_Cos(angle);
00724        PA_obj[screen][obj_num + 1].atr3 = -PA_Sin(angle);
00725        PA_obj[screen][obj_num + 2].atr3 = PA_Sin(angle);
00726        PA_obj[screen][obj_num + 3].atr3 = PA_Cos(angle);
00727 }
00728 
00746 extern inline void PA_SetRotsetNoAngle(u8 screen, u8 rotset, u16 zoomx, u16 zoomy) {
00747 u8 obj_num = (rotset << 2);
00748        PA_obj[screen][obj_num].atr3 = zoomx;
00749        PA_obj[screen][obj_num + 1].atr3 = 0;
00750        PA_obj[screen][obj_num + 2].atr3 = 0;
00751        PA_obj[screen][obj_num + 3].atr3 = zoomy;
00752 }
00753 
00754 
00755 
00756 
00757 
00758 
00759 
00776 #define PA_SetSpriteX(screen, obj, x) PA_obj[screen][obj].atr1 = (PA_obj[screen][obj].atr1 & ALL_BUT(PA_OBJ_X)) + ((x) & PA_OBJ_X)
00777 
00790 #define PA_GetSpriteX(screen, obj) (PA_obj[screen][obj].atr1 & (PA_OBJ_X))
00791 
00792 
00807 #define PA_SetSpriteY(screen, obj, y) PA_obj[screen][obj].atr0 = (PA_obj[screen][obj].atr0 & ALL_BUT(PA_OBJ_Y)) + ((y) & PA_OBJ_Y)
00808 
00821 #define PA_GetSpriteY(screen, obj) (PA_obj[screen][obj].atr0 & PA_OBJ_Y)
00822 
00823 
00824 
00842 extern inline void PA_SetSpriteXY(u8 screen, u8 sprite, s16 x, s16 y) {
00843        PA_SetSpriteX(screen, sprite, x); 
00844        PA_SetSpriteY(screen, sprite, y);
00845 }
00846 
00847 
00848 
00863 #define PA_SetSpritePal(screen, obj, pal) PA_obj[screen][obj].atr2 = (PA_obj[screen][obj].atr2 & ALL_BUT_PAL) + ((pal) << 12)
00864 
00876 #define PA_GetSpritePal(screen, obj) (PA_obj[screen][obj].atr2 >> 12)
00877 
00878 
00893 #define PA_SetSpriteDblsize(screen, obj, dblsize) PA_obj[screen][obj].atr0 = (PA_obj[screen][obj].atr0 & ALL_BUT(DBLSIZE)) + ((dblsize) << 9)
00894 
00906 #define PA_GetSpriteDblsize(screen, obj) ((PA_obj[screen][obj].atr0 & DBLSIZE) >> 9)
00907 
00908 
00923 #define PA_SetSpriteColors(screen, sprite, n_colors) PA_obj[screen][sprite].atr0 = (PA_obj[screen][sprite].atr0 & ALL_BUT(N_COLORS)) + ((n_colors) << 13)
00924 
00936 #define PA_GetSpriteColors(screen, sprite) ((PA_obj[screen][sprite].atr0 & N_COLORS) >> 13)
00937 
00938 
00939 
00954 #define PA_SetSpriteMode(screen, sprite, obj_mode) PA_obj[screen][sprite].atr0 = (PA_obj[screen][sprite].atr0 & ALL_BUT(OBJ_MODE)) + ((obj_mode) << 10)
00955 
00967 #define PA_GetSpriteMode(screen, obj) ((PA_obj[screen][obj].atr0 & OBJ_MODE) >> 10)
00968 
00969 
00984 #define PA_SetSpriteMosaic(screen, obj, mosaic) PA_obj[screen][obj].atr0 = (PA_obj[screen][obj].atr0 & ALL_BUT(OBJ_MOSAIC)) + ((mosaic) << 12)
00985 
00997 #define PA_GetSpriteMosaic(screen, obj) ((PA_obj[screen][obj].atr0 & OBJ_MOSAIC) >> 12)
00998 
00999 
01000 
01015 #define PA_SetSpriteHflip(screen, obj, hflip) PA_obj[screen][obj].atr1 = (PA_obj[screen][obj].atr1 & ALL_BUT(OBJ_HFLIP)) + ((hflip) << 12)
01016 
01028 #define PA_GetSpriteHflip(screen, obj) ((PA_obj[screen][obj].atr1 & OBJ_HFLIP) >> 12)
01029 
01030 
01045 #define PA_SetSpriteVflip(screen, obj, vflip) PA_obj[screen][obj].atr1 = (PA_obj[screen][obj].atr1 & ALL_BUT(OBJ_VFLIP)) + ((vflip) << 13)
01046 
01058 #define PA_GetSpriteVflip(screen, obj) ((PA_obj[screen][obj].atr1 & OBJ_VFLIP) >> 13)
01059 
01060 
01075 #define PA_SetSpriteGfx(screen, obj, gfx) PA_obj[screen][obj].atr2 = (PA_obj[screen][obj].atr2 & ALL_BUT(OBJ_GFX)) + ((gfx) & OBJ_GFX)
01076 
01088 #define PA_GetSpriteGfx(screen, obj) (PA_obj[screen][obj].atr2 & OBJ_GFX)
01089 
01090 
01091 
01106 #define PA_SetSpritePrio(screen, obj, prio) PA_obj[screen][obj].atr2 = (PA_obj[screen][obj].atr2 & ALL_BUT(OBJ_PRIO)) + ((prio) << 10)
01107 
01119 #define PA_GetSpritePrio(screen, obj) ((PA_obj[screen][obj].atr2 & OBJ_PRIO) >> 10)
01120 
01121 
01133 #define PA_GetSpriteLx(screen, sprite) PA_size[PA_obj[screen][sprite].atr0 >> 14][PA_obj[screen][sprite].atr1 >> 14].lx
01134 
01135 
01147 #define PA_GetSpriteLy(screen, sprite)PA_size[PA_obj[screen][sprite].atr0 >> 14][PA_obj[screen][sprite].atr1 >> 14].ly
01148 
01149 
01164 #define PA_CloneSprite(screen, obj, target) {PA_obj[screen][obj].atr0 = PA_obj[screen][target].atr0; PA_obj[screen][obj].atr1 = PA_obj[screen][target].atr1; PA_obj[screen][obj].atr2 = PA_obj[screen][target].atr2; ++obj_per_gfx[screen][PA_GetSpriteGfx(screen, target)];}
01165 
01166 
01167 
01168 
01169 
01170 
01171 
01172 
01196 extern inline void PA_SetSpriteAnimEx(u8 screen, u8 sprite, u8 lx, u8 ly, u8 ncolors, s16 animframe){
01197        u16 gfx = PA_GetSpriteGfx(screen, sprite);
01198        //PA_OutputText(1, 0, PA_Rand()&15, "%03d - %03d   ", gfx, sprite);
01199        PA_UpdateGfx(screen, gfx, (void*)(PA_SpriteAnimP[screen][gfx] + (animframe * (lx * ly) >> (2 - ncolors))));
01200 }
01201 
01216 extern inline void PA_SetSpriteAnim(u8 screen, u8 sprite, s16 animframe){
01217        PA_SetSpriteAnimEx(screen, sprite, PA_GetSpriteLx(screen, sprite), PA_GetSpriteLy(screen, sprite), PA_GetSpriteColors(screen, sprite), animframe);
01218 }
01219 
01220 
01221 
01248 void PA_StartSpriteAnimEx(u8 screen, u8 sprite, s16 firstframe, s16 lastframe, s16 speed, u8 type, s16 ncycles);
01249 
01250 
01251 
01252 
01273 extern inline void PA_StartSpriteAnim(u8 screen, u8 sprite, s16 firstframe, s16 lastframe, s16 speed){
01274        PA_StartSpriteAnimEx(screen, sprite, firstframe, lastframe, speed, ANIM_INFINITE);
01275 }
01276 
01277 
01278 
01279 
01291 extern inline void PA_StopSpriteAnim(u8 screen, u8 sprite)
01292 {
01293        if (spriteanims[screen][sprite].play) nspriteanims--;
01294        spriteanims[screen][sprite].play = 0;
01295 }
01296 
01311 extern inline void PA_SetSpriteAnimFrame(u8 screen, u8 sprite, u16 frame)
01312 {
01313        if(spriteanims[screen][sprite].currentframe != frame){
01314               PA_SetSpriteAnimEx(screen, sprite, spriteanims[screen][sprite].lx, spriteanims[screen][sprite].ly, spriteanims[screen][sprite].colors, spriteanims[screen][sprite].currentframe);
01315               spriteanims[screen][sprite].currentframe = frame;
01316        }
01317 }
01318 
01319 
01331 extern inline u16 PA_GetSpriteAnimFrame(u8 screen, u8 sprite)
01332 {
01333        return spriteanims[screen][sprite].currentframe;
01334 }
01335 
01336 
01337 
01352 extern inline void PA_SetSpriteAnimSpeed(u8 screen, u8 sprite, s16 speed)
01353 {
01354        spriteanims[screen][sprite].speed = speed;
01355 }
01356 
01368 extern inline u16 PA_GetSpriteAnimSpeed(u8 screen, u8 sprite)
01369 {
01370        return spriteanims[screen][sprite].speed;
01371 }
01372 
01373 
01388 extern inline void PA_SetSpriteNCycles(u8 screen, u8 sprite, s16 NCycles)
01389 {
01390        spriteanims[screen][sprite].ncycles = NCycles;
01391 }
01392 
01393 
01394 
01406 extern inline u16 PA_GetSpriteNCycles(u8 screen, u8 sprite)
01407 {
01408        return spriteanims[screen][sprite].speed;
01409 }
01410 
01411 
01412 
01413 
01414 
01429 extern inline void PA_SpriteAnimPause(u8 screen, u8 sprite, u8 pause)
01430 {
01431        if (pause&&spriteanims[screen][sprite].play) nspriteanims--;
01432        else if ((!pause)&&(!spriteanims[screen][sprite].play)) nspriteanims++;
01433        spriteanims[screen][sprite].play = !pause;
01434 }
01435 
01436 
01437 
01438 
01439 
01440 
01461 extern inline void PA_SetSpritePixel(u8 screen, u8 sprite, u8 x, u8 y, u8 color){
01462 u8 hsize = spriteanims[screen][sprite].lx>>3;
01463 
01464        s32 pos = (x >> 3) + ((y >> 3) * hsize);
01465        x&=7; y&=7;
01466        
01467        pos = (pos << 5) + (x >> 1) + (y << 2);
01468        
01469        u16 pixel = spriteanims[screen][sprite].gfx[pos];
01470        
01471        if (x&1){
01472               spriteanims[screen][sprite].gfx[pos] = (color << 8) | (pixel&0x00FF);               
01473        }
01474        else {
01475               spriteanims[screen][sprite].gfx[pos] = color | (pixel&0xFF00); 
01476        }
01477 }
01478 
01479 
01497 extern inline u8 PA_GetSpritePixel(u8 screen, u8 sprite, u8 x, u8 y) {
01498 u8 hsize = spriteanims[screen][sprite].lx>>3;
01499 
01500        s32 pos = (x >> 3) + ((y >> 3) * hsize);
01501        x&=7; y&=7;
01502        
01503        pos = (pos << 5) + (x >> 1) + (y << 2);
01504        
01505        u16 pixel = spriteanims[screen][sprite].gfx[pos];
01506        
01507        if (x&1){
01508               return ((pixel>>8)&255);                  
01509        }
01510        else {
01511               return (pixel&255);
01512        }
01513 }
01514 
01532 extern inline u8 PA_GetSprite16cPixel(u8 screen, u8 sprite, u8 x, u8 y) {
01533        u8 hsize = spriteanims[screen][sprite].lx>>3;
01534 
01535        s32 pos = (x >> 3) + ((y >> 3) * hsize);
01536        x&=7; y&=7;
01537        
01538        pos = (pos << 4) + (x >> 2) + (y << 1);
01539        
01540        u16 pixel = spriteanims[screen][sprite].gfx[pos];
01541        return ((pixel>>(4*(x&3)))&15);    
01542 }
01543 
01544 
01545 
01557 void PA_InitSpriteDraw(u8 screen, u8 sprite);
01558 
01559 
01560 
01566 extern inline void PA_InitAllSpriteDraw(void){
01567 u8 i, j;
01568 for (j = 0; j < 2; j++)
01569        for (i = 0; i < 128; i++)
01570               PA_InitSpriteDraw(j, i);
01571 }
01572 
01573 
01574 
01575 
01584 void PA_InitSpriteExtPrio(u8 SpritePrio);
01585 
01586 extern inline void PA_SetSpriteExtPrio(u8 screen, u8 sprite, u8 prio){
01587        PA_SpritePrio[screen][sprite] = prio;
01588 }
01589 
01590 
01591 
01592  // end of Sprite
01594 
01595 
01596 
01597 
01598 
01599 void PA_UpdateSpriteAnims(void);
01600 
01601 
01602 
01603 
01604 
01605 
01606 #ifdef __cplusplus
01607 }
01608 #endif
01609 
01610 
01611 
01612 
01613 #endif
01614 
01615 

Généré le Tue Jan 30 23:10:49 2007 pour PAlib par  doxygen 1.3.9.1