#include #include #include #include #include "pad.h" #define BRICK_TIM 0x80090000 #define END_OF_DATA 0x800900ac #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 256 #define OT_LEN 12 #define MAX_PACKETS (192*1024) long SIN[360] = { 0, 71, 142, 214, 285, 356, 428, 499, 570, 640, 711, 781, 851, 921, 990, 1060, 1129, 1197, 1265, 1333, 1400, 1467, 1534, 1600, 1665, 1731, 1795, 1859, 1922, 1985, 2047, 2109, 2170, 2230, 2290, 2349, 2407, 2465, 2521, 2577, 2632, 2687, 2740, 2793, 2845, 2896, 2946, 2995, 3043, 3091, 3137, 3183, 3227, 3271, 3313, 3355, 3395, 3435, 3473, 3510, 3547, 3582, 3616, 3649, 3681, 3712, 3741, 3770, 3797, 3823, 3848, 3872, 3895, 3917, 3937, 3956, 3974, 3991, 4006, 4020, 4033, 4045, 4056, 4065, 4073, 4080, 4086, 4090, 4093, 4095, 4096, 4095, 4093, 4090, 4086, 4080, 4073, 4065, 4056, 4045, 4033, 4020, 4006, 3991, 3974, 3956, 3937, 3917, 3895, 3872, 3848, 3823, 3797, 3770, 3741, 3712, 3681, 3649, 3616, 3582, 3547, 3510, 3473, 3435, 3395, 3355, 3313, 3271, 3227, 3183, 3137, 3091, 3043, 2995, 2946, 2896, 2845, 2793, 2740, 2687, 2632, 2577, 2521, 2465, 2407, 2349, 2290, 2230, 2170, 2109, 2047, 1985, 1922, 1859, 1795, 1731, 1665, 1600, 1534, 1467, 1400, 1333, 1265, 1197, 1129, 1060, 990, 921, 851, 781, 711, 640, 570, 499, 428, 356, 285, 214, 142, 71, 0, -71, -142, -214, -285, -356, -428, -499, -570, -640, -711, -781, -851, -921, -990, -1060, -1129, -1197, -1265, -1333, -1400, -1467, -1534, -1600, -1665, -1731, -1795, -1859, -1922, -1985, -2047, -2109, -2170, -2230, -2290, -2349, -2407, -2465, -2521, -2577, -2632, -2687, -2740, -2793, -2845, -2896, -2946, -2995, -3043, -3091, -3137, -3183, -3227, -3271, -3313, -3355, -3395, -3435, -3473, -3510, -3547, -3582, -3616, -3649, -3681, -3712, -3741, -3770, -3797, -3823, -3848, -3872, -3895, -3917, -3937, -3956, -3974, -3991, -4006, -4020, -4033, -4045, -4056, -4065, -4073, -4080, -4086, -4090, -4093, -4095, -4096, -4095, -4093, -4090, -4086, -4080, -4073, -4065, -4056, -4045, -4033, -4020, -4006, -3991, -3974, -3956, -3937, -3917, -3895, -3872, -3848, -3823, -3797, -3770, -3741, -3712, -3681, -3649, -3616, -3582, -3547, -3510, -3473, -3435, -3395, -3355, -3313, -3271, -3227, -3183, -3137, -3091, -3043, -2995, -2946, -2896, -2845, -2793, -2740, -2687, -2632, -2577, -2521, -2465, -2407, -2349, -2290, -2230, -2170, -2109, -2048, -1985, -1922, -1859, -1795, -1731, -1665, -1600, -1534, -1467, -1400, -1333, -1265, -1197, -1129, -1060, -990, -921, -851, -781, -711, -640, -570, -499, -428, -356, -285, -214, -142, -71 }; //-------------------------------------------------------------- typedef signed long flt; #define FIXED_POINT 16 #define FLT_ONE ((flt) (1 << FIXED_POINT)) #define FLT(x) ((flt) ((x) * FLT_ONE)) #define FLT2INT(x) (((int) (x)) >> FIXED_POINT) #define INT2FLT(x) (((flt) (x)) << FIXED_POINT) //-------------------------------------------------------------- typedef enum { IMPCTFNT_SPRITE = 0, BRICK_SPRITE, NUM_SPRITES } SPRITE_DATA; //-------------------------------------------------------------- PACKET out_packet[2][MAX_PACKETS]; GsOT othWorld[2]; GsOT_TAG otWorld[2][1< px; rect.y = tim1 -> py; rect.w = tim1 -> pw; rect.h = tim1 -> ph; LoadImage (&rect, tim1 -> pixel); if ((tim1 -> pmode>>3) & 0x01) { rect.x = tim1 -> cx; rect.y = tim1 -> cy; rect.w = tim1 -> cw; rect.h = tim1 -> ch; LoadImage(&rect, tim1 -> clut); } if ((tim1 -> pmode & 3) == 0) tim1 -> pw *= 4; else if ((tim1 -> pmode & 3) == 1) tim1 -> pw *= 2; DrawSync (0); return 0; } //-------------------------------------------------------------- void Init() { GetPadBuf(&bb0, &bb1); SetVideoMode (MODE_PAL); GsInitGraph (SCREEN_WIDTH, SCREEN_HEIGHT, GsNONINTER|GsOFSGPU, 0, 0); GsDefDispBuff (0, 0, 0, SCREEN_HEIGHT); GsDISPENV.screen.x = 0; GsDISPENV.screen.y = 20; GsDISPENV.screen.w = SCREEN_WIDTH; GsDISPENV.screen.h = SCREEN_HEIGHT; othWorld[0].length = OT_LEN; othWorld[1].length = OT_LEN; othWorld[0].org = otWorld[0]; othWorld[1].org = otWorld[1]; GsClearOt (0,0,&othWorld[0]); GsClearOt (0,0,&othWorld[1]); LoadTIM (BRICK_TIM, &spritedata [BRICK_SPRITE]); } //-------------------------------------------------------------- void SetDefaultSpriteData (GsSPRITE * sprite, int data) { sprite -> u = spritedata [data].px % 64; sprite -> v = spritedata [data].py % 256; sprite -> w = spritedata [data].pw; sprite -> h = spritedata [data].ph; sprite -> cx = spritedata [data].cx; sprite -> cy = spritedata [data].cy; if ((spritedata [data].pmode & 3) == 0) sprite -> u *= 4; else if ((spritedata [data].pmode & 3) == 1) sprite -> u *= 2; sprite -> tpage = GetTPage (spritedata [data].pmode, 0, spritedata [data].px, spritedata [data].py); sprite -> attribute = ((spritedata [data].pmode & 3)<< 24); sprite -> mx = 0; sprite -> my = 0; sprite -> scalex = ONE; sprite -> scaley = ONE; sprite -> rotate = 0; sprite -> r = 128; sprite -> g = 128; sprite -> b = 128; } //-------------------------------------------------------------- #define TOWER_WIDTH 100 #define BRICK_GAP 12 int DrawTower(int rot) { int a; int y; int ot; int count; GsSPRITE sprite; SetDefaultSpriteData (&sprite, BRICK_SPRITE); for (sprite.y = 0; sprite.y < (SCREEN_HEIGHT - sprite.h); sprite.y += sprite.h) { for (count = 0; count < 360; count += BRICK_GAP) { a = count + rot + sprite.y % ( sprite.h * 3); if ((a > 90) && (a < 270)) { sprite.x = (SCREEN_WIDTH / 2) + (SIN [a] / (ONE / TOWER_WIDTH)); ot = (SCREEN_WIDTH / 2) - sprite.x; if (ot < 0) { ot = -ot; } sprite.b = sprite.y; sprite.g = 0; sprite.r = (sprite.x/2); GsSortFastSprite (&sprite, &othWorld [buffer], ot); } } } rot = (rot + 1) %BRICK_GAP; return rot; } //-------------------------------------------------------------- int main() { int rot; RECT vram = {0,0,1024,512}; ClearImage (&vram, 0,0,0); Init(); rot = 0; while (!(PADstatus & PADselect)) { FrameStart(0); rot = DrawTower (rot); FrameEnd(); } ClearImage (&vram, 0,0,0); ResetGraph (3); return 0; }