// *********************************************************************************** // Programs written by R.Swan - rs108@mdx.ac.uk - www.netyaroze-europe.com/~middex2 // General Screen functions // *********************************************************************************** #include #include "header.h" // **** Global variables and structures #define TIM_TEXT (0x80090000) #define TIM_BALL (0x80094000) // **** Global variables and structures u_long GameRunning = true; // flag used to quit float CurrentDepth = 0; typedef struct { GsSPRITE Sred; GsSPRITE Sblue; long x; long y; float depth; } sprite3D; sprite3D mySprite[9]; sprite3D Ball[5]; // **** Function prototypes void UpdateWorld(); void RenderWorld(); void ProcessJoyPad(); void Set3DspriteInfo(sprite3D *tSprite, u_long tAddress, long tX, long tY, float tDepth); void Draw3Dsprite(sprite3D *tSprite, u_long tPriority); // *********************************************************************************** // MAIN FUNCTION // *********************************************************************************** void main() { u_long tTemp; InitialiseScreen(); InitialiseJoyPad(); LoadTIMData(TIM_TEXT); LoadTIMData(TIM_BALL); for (tTemp=0; tTemp<9; tTemp++) { Set3DspriteInfo(&mySprite[tTemp], TIM_TEXT, 320, tTemp*22+30, tTemp*2 - 9); mySprite[tTemp].Sred.rotate = mySprite[tTemp].Sblue.rotate = ONE * (tTemp-4); } for (tTemp=0; tTemp<5; tTemp++) { Set3DspriteInfo(&Ball[tTemp], TIM_BALL, 320 - (tTemp-2)*96, 118, 0); } while (GameRunning == true) { ProcessJoyPad(); UpdateWorld(); RenderWorld(); } ResetGraph(3); } // *********************************************************************************** // Function Definitions // *********************************************************************************** // **** Update everything in the world before drawing void UpdateWorld() { long tTemp; FntPrint(FntOne, "Speed - %d/280\n", VerticalSync); FntPrint(FntOne, "Up / Down - alter depth\n"); FntPrint(FntOne, "Start + Select - quit\n"); for (tTemp=0; tTemp<9; tTemp++) { mySprite[tTemp].depth = CurrentDepth * (tTemp - 4); } for (tTemp=0; tTemp<5; tTemp++) { Ball[tTemp].depth = CurrentDepth * (tTemp - 2) * 2; } } // **** Register everything that needs to be drawn and then draw it void RenderWorld() { u_long tTemp; RenderPrepare(); for (tTemp=0; tTemp<10; tTemp++) if (tTemp!=4) Draw3Dsprite(&mySprite[tTemp], 0); for (tTemp=0; tTemp<5; tTemp++) Draw3Dsprite(&Ball[tTemp], 0); RenderFinish(); } // **** Respond to user input from joypad 1 void ProcessJoyPad() { u_long PAD = ReadJoyPad(); if ((PAD& PADselect) && (PAD& PADstart)) GameRunning = false; if ((PAD& PADup) && (CurrentDepth < 5.00)) CurrentDepth += 0.1; if ((PAD& PADdown) && (CurrentDepth > -5.00)) CurrentDepth -= 0.1; if (PAD& PADcross) { while (PAD!=0) { PAD = ReadJoyPad(); } } } // **** Initialise a 3d sprite void Set3DspriteInfo(sprite3D *tSprite, u_long tAddress, long tX, long tY, float tDepth) { SetSpriteInfo(&tSprite->Sred, tAddress, tX, tY); SetSpriteInfo(&tSprite->Sblue, tAddress, tX, tY); tSprite->depth = tDepth; tSprite->Sred.r = 47; tSprite->Sred.g = tSprite->Sred.b = 0; tSprite->Sblue.r = 0; tSprite->Sblue.g = 0; tSprite->Sblue.b = 97; tSprite->Sred.attribute = tSprite->Sblue.attribute += (1<<30) + (1<<28); } // **** Draw a 3D sprite void Draw3Dsprite(sprite3D *tSprite, u_long tPriority) { float tOriginalPosition = tSprite->Sred.x; tSprite->Sred.x -= tSprite->depth; tSprite->Sblue.x += tSprite->depth; tSprite->Sred.scalex = ONE*2 - tSprite->depth * 80; tSprite->Sred.scaley = ONE - tSprite->depth * 40; tSprite->Sblue.scalex = ONE*2 - tSprite->depth * 80; tSprite->Sblue.scaley = ONE - tSprite->depth * 40; DrawSprite(&tSprite->Sred, tPriority); DrawSprite(&tSprite->Sblue, tPriority); tSprite->Sred.x = tOriginalPosition; tSprite->Sblue.x = tOriginalPosition; }