// *********************************************************************************** // Programs written by R.Swan - rs108@mdx.ac.uk - www.netyaroze-europe.com/~middex2 // MAIN routine // *********************************************************************************** #include #include "header.h" #include "stdlib.h" // **** Global #defines #define TIM_HEADING (0x80090000) #define TIM_DOT (0x80091000) // **** Global variables and structures GsSPRITE TextSprite; // instance of a sprite u_long GameRunning = true; u_long JustMoved = 0; // STRUCTRE HOLDING INFORMATION FOR EACH STAR typedef struct { long x, y; long dx; } StarStruct; // CREATE 300 STRUCTURES, ONE FOR EACH STAR StarStruct Stars[300]; // CREATE ONLY ONE INSTANCE OF GSSPRITE FOR ALL THE STARS GsSPRITE StarSprite; // **** Function prototypes void UpdateWorld(); void RenderWorld(); void ProcessJoyPad(); // *********************************************************************************** // MAIN FUNCTION // *********************************************************************************** void main() { u_long tTemp; InitialiseScreen(); InitialiseJoyPad(); LoadTIMData(TIM_HEADING); LoadTIMData(TIM_DOT); SetSpriteInfo(&TextSprite, TIM_HEADING, 160, 220); SetSpriteInfo(&StarSprite, TIM_DOT, 0, 0); TextSprite.attribute += (1<<30) + (1<<28); // ROUTINE FOR MOVING STARS for (tTemp=0; tTemp<300; tTemp++) { Stars[tTemp].x = (rand() % 320) << 8; // SET THE RANDOM X POSITION Stars[tTemp].y = (rand() % 240) << 8; // SET THE RANDOM Y POSITION Stars[tTemp].dx = rand() % ((1<<8) * 3) + (1<<7); // SET RANDOM AMOUNT // BY WHICH STAR MOVES } while (GameRunning == true) { ProcessJoyPad(); UpdateWorld(); RenderWorld(); } ResetGraph(3); } // *********************************************************************************** // Function Definitions // *********************************************************************************** // **** Update everything in the world before drawing void UpdateWorld() { u_long tTemp; FntPrint(FntOne, "Speed - %d/280\n", VerticalSync); // ROUTINE FOR MOVING STARS for (tTemp=0; tTemp<300; tTemp++) { Stars[tTemp].x -= Stars[tTemp].dx; // UPDATE THE X POSITION if (Stars[tTemp].x < 0) Stars[tTemp].x += 320<<8; // MOVE TO RIGHT IF // THEY GO OFF LEFT } } // **** Register everything that needs to be drawn and then draw it void RenderWorld() { u_long tTemp; RenderPrepare(); DrawSprite(&TextSprite, 0); DrawColouredBox(160-120, 220-13, 160+120, 220+13, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255); // ROUTINE FOR MOVING STARS // NOTE THAT I HAVE ONLY THE ONE GSSPRITE, BUT I UDPATE ITS POSITION, // DRAW IT, THEN ALTER IT AGAIN, THEN DRAW IT, ETC. THIS IS PERFECTLY // LEGAL! for (tTemp=0; tTemp<320; tTemp++) { StarSprite.x = (short) (Stars[tTemp].x >> 8); // SET SPRITES X POSITION StarSprite.y = (short) (Stars[tTemp].y >> 8); // SET SPRITES Y POSITION DrawSprite(&StarSprite, 1); // DRAW SPRITE } RenderFinish(); } // **** Respond to user input from joypad 1 void ProcessJoyPad() { u_long PAD = ReadJoyPad(); if ((PAD& PADselect) && (PAD& PADstart)) GameRunning = false; } // *********************************************************************************** // MAIN FUNCTION // ***********************************************************************************