home *** CD-ROM | disk | FTP | other *** search
- ///--------------------------------------------------------------------------------------
- // Stars.c
- //
- // By Vern Jensen. Created 9/2/96
- ///--------------------------------------------------------------------------------------
-
-
- #include <SWFPSReport.h>
- #include <SWIncludes.h>
- #include <SWGameUtils.h>
-
- #include "SWApplication.h"
- #include "Stars.h"
-
-
- #define kFullScreenWindow true // Try me full screen!
- #define kWorldRectInset 0 // Make the SpriteWorld smaller?
- #define kSyncToVBL true // Sync SpriteWorld to VBL?
- #define kMaxFPS 0 // Set to 0 for unrestricted speed
-
- #define kNumStars 150
- #define kMinStarSpeed 1
- #define kMaxStarSpeed 3
-
- #define kNumSprites 2
- #define kBaseSpriteMoveDelta 2
-
-
- ///--------------------------------------------------------------------------------------
- // Globals
- ///--------------------------------------------------------------------------------------
-
- SpriteWorldPtr gSpriteWorldP;
- WindowPtr gWindowP;
- StarArray gStarArray[kNumStars];
-
- SpritePtr gSimpleSpriteArray[kNumSprites];
-
-
- ///--------------------------------------------------------------------------------------
- // Main
- ///--------------------------------------------------------------------------------------
-
- void main( void )
- {
- Initialize(kNumberOfMoreMastersCalls);
- Randomize();
-
- if ( SWHasSystem7() )
- {
- AllowKeyUpEvents(); // Part of SWGameUtils.c
- SetCursor(*GetCursor(watchCursor));
-
- CreateSpriteWorld();
- CreateSprites();
-
- SetCursor(&qd.arrow);
- HideCursor();
-
- RunAnimation();
- ShutDown();
-
- RestoreEventMask(); // Make sure to call this after calling AllowKeyUpEvents
- }
- else
- {
- CantRunOnThisMachine();
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSpriteWorld
- ///--------------------------------------------------------------------------------------
-
- void CreateSpriteWorld( void )
- {
- Rect worldRect, windRect;
- RgnHandle mBarUpdateRgn;
- OSErr err;
-
- gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
-
- if (gWindowP != NULL)
- {
- if ( GetDepthFromWindow(gWindowP) != 8 )
- {
- SetCursor(&qd.arrow);
- StopAlert(130, NULL);
- ExitToShell();
- }
-
-
- if (kFullScreenWindow == true)
- {
- SizeWindow(gWindowP, qd.screenBits.bounds.right,
- qd.screenBits.bounds.bottom, false);
- MoveWindow(gWindowP, 0, 0, false);
- }
- else
- {
- // Center window in screen
- windRect = gWindowP->portRect;
- CenterRect(&windRect, &qd.screenBits.bounds);
- MoveWindow(gWindowP, windRect.left, windRect.top, false);
- }
-
- ShowWindow(gWindowP);
- SetPort(gWindowP);
- mBarUpdateRgn = SWHideMenuBar(gWindowP); // Must be done *after* showing window!
- EraseRgn(mBarUpdateRgn);
-
- ForeColor(blackColor);
- BackColor(whiteColor);
- }
- else
- CantFindResource();
-
-
- err = SWEnterSpriteWorld();
- FatalError(err);
-
-
- worldRect = gWindowP->portRect;
- InsetRect(&worldRect, kWorldRectInset, kWorldRectInset);
-
-
- // Create the sprite world
- err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP,
- &worldRect, NULL, 0);
- FatalError(err);
-
-
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixie8BitRectDrawProc);
- SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BlitPixie8BitRectDrawProc);
-
-
- SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
- SWSyncSpriteWorldToVBL(gSpriteWorldP, kSyncToVBL);
- SWSetCleanUpSpriteWorld(gSpriteWorldP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSprites
- ///--------------------------------------------------------------------------------------
-
- void CreateSprites( void )
- {
- SpriteLayerPtr spriteLayerP;
- SpritePtr simpleSpriteP;
- short spriteNum;
- OSErr err;
-
-
- err = SWCreateSpriteLayer(&spriteLayerP);
- FatalError(err);
-
- err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &simpleSpriteP, NULL,
- 128, 1, kFatMask);
- FatalError(err);
-
- if (gSpriteWorldP->pixelDepth == 8)
- SWCompileSprite(simpleSpriteP);
-
- gSimpleSpriteArray[0] = simpleSpriteP;
-
- for (spriteNum = 1; spriteNum < kNumSprites; spriteNum++)
- {
- err = SWCloneSprite(simpleSpriteP, &gSimpleSpriteArray[spriteNum], NULL);
- FatalError(err);
- }
-
-
- for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
- {
- simpleSpriteP = gSimpleSpriteArray[spriteNum];
-
- SWAddSprite(spriteLayerP, simpleSpriteP);
- SWSetSpriteMoveBounds(simpleSpriteP, &gSpriteWorldP->backRect);
- SWSetSpriteMoveProc(simpleSpriteP, BallSpriteMoveProc);
- SWSetSpriteMoveDelta(simpleSpriteP, kBaseSpriteMoveDelta + spriteNum,
- kBaseSpriteMoveDelta + spriteNum);
- SWSetSpriteLocation(simpleSpriteP, spriteNum * 60, spriteNum * 60);
- SWSetSpriteDrawProc(simpleSpriteP, CompiledSprite8BitDrawProc);
- }
-
- SWAddSpriteLayer(gSpriteWorldP, spriteLayerP);
- SWLockSpriteWorld(gSpriteWorldP);
-
- SWSetPortToBackground(gSpriteWorldP);
- PaintRect(&gSpriteWorldP->backRect);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // RunAnimation
- ///--------------------------------------------------------------------------------------
-
- void RunAnimation( void )
- {
- unsigned long frames;
-
- SetUpStars();
- SWUpdateSpriteWorld(gSpriteWorldP, true);
- SWAnimate8BitStarField(gSpriteWorldP, gStarArray, kNumStars, 255);
-
- frames = 0;
- StartTimer();
-
- FatalError( SWStickyError() ); // Make sure no errors got past us during setup
-
- while (!Button())
- {
- SWProcessSpriteWorld(gSpriteWorldP);
- FatalError( SWStickyError() ); // Make sure no errors occurred during a MoveProc, etc.
- SWAnimateSpriteWorld(gSpriteWorldP);
-
- if (gSpriteWorldP->frameHasOccurred)
- {
- MoveStars();
- SWAnimate8BitStarField(gSpriteWorldP, gStarArray, kNumStars, 255);
-
- frames++;
- }
- }
-
-
- SWShowMenuBar(gWindowP);
- ShowResults(frames);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // ShutDown (clean up and dispose of the SpriteWorld)
- ///--------------------------------------------------------------------------------------
-
- void ShutDown( void )
- {
- SWDisposeSpriteWorld(&gSpriteWorldP);
- SWExitSpriteWorld();
-
- FlushEvents(everyEvent, 0);
- ShowCursor();
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BallSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void BallSpriteMoveProc(SpritePtr ballSpriteP)
- {
- SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
- (void)SWBounceSprite(ballSpriteP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SetUpStars
- ///--------------------------------------------------------------------------------------
-
- void SetUpStars( void )
- {
- short curStar;
- Rect windRect = gSpriteWorldP->windowFrameP->frameRect;
-
- for (curStar = 0; curStar < kNumStars; curStar++)
- {
- gStarArray[curStar].horizLoc = GetRandom(windRect.left, windRect.right-1);
- gStarArray[curStar].vertLoc = GetRandom(windRect.top, windRect.bottom-1);
- gStarArray[curStar].oldHorizLoc = gStarArray[curStar].horizLoc;
- gStarArray[curStar].oldVertLoc = gStarArray[curStar].vertLoc;
- gStarArray[curStar].horizSpeed = GetRandom(kMinStarSpeed, kMaxStarSpeed);
- gStarArray[curStar].color = 0;
-
- // Uncomment this line to make the stars different colors
- // gStarArray[curStar].color = GetRandom(0, 254);
-
- /*
- // Uncomment this to make the stars different brightnesses
- gStarArray[curStar].color = GetRandom(244, 254);
- if ( gStarArray[curStar].color == 244 )
- gStarArray[curStar].color = 0;
- */
- // Since the star hasn't been drawn yet, it doesn't need to be erased.
- gStarArray[curStar].needsToBeErased = false;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // MoveStars
- ///--------------------------------------------------------------------------------------
-
- void MoveStars( void )
- {
- short curStar;
- Rect* windRectP = &gSpriteWorldP->windowFrameP->frameRect;
-
- for (curStar = 0; curStar < kNumStars; curStar++)
- {
- // Save the old position
- gStarArray[curStar].oldHorizLoc = gStarArray[curStar].horizLoc;
- gStarArray[curStar].oldVertLoc = gStarArray[curStar].vertLoc;
-
- gStarArray[curStar].horizLoc += gStarArray[curStar].horizSpeed;
- if (gStarArray[curStar].horizLoc > windRectP->right)
- {
- gStarArray[curStar].vertLoc = GetRandom( windRectP->top, windRectP->bottom-1 );
- gStarArray[curStar].horizLoc -= (windRectP->right - windRectP->left);
- }
-
- /*
- // Change star color (try uncommenting this for a neat effect)
- gStarArray[curStar].color++;
- if (gStarArray[curStar].color >= 255)
- gStarArray[curStar].color -= 255;
- */
- }
- }
-
-