home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1999 Spring / macformat-077.iso / Shareware Plus / Development / SpriteWorld 2.2 / SpriteWorld files / Headers / SpriteWorld.h < prev    next >
Encoding:
Text File  |  1999-01-12  |  11.0 KB  |  344 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. //    SpriteWorld.h
  3. //
  4. //    Portions are copyright: © 1991-94 Tony Myles, All rights reserved worldwide.
  5. //
  6. //    Description:    constants, structures, and prototypes for sprite worlds
  7. ///--------------------------------------------------------------------------------------
  8.  
  9.  
  10. #ifndef __SPRITEWORLD__
  11. #define __SPRITEWORLD__
  12.  
  13. #ifndef __SWCOMMON__
  14. #include "SWCommonHeaders.h"
  15. #endif
  16.  
  17. #ifndef __SPRITELAYER__
  18. #include "SpriteLayer.h"
  19. #endif
  20.  
  21. #ifndef __SPRITEFRAME__
  22. #include "SpriteFrame.h"
  23. #endif
  24.  
  25. #ifndef __SPRITE__
  26. #include "Sprite.h"
  27. #endif
  28.  
  29. #ifndef __TILING__
  30. #include "Tiling.h"
  31. #endif
  32.  
  33.  
  34. #ifdef __cplusplus
  35. extern "C" {
  36. #endif
  37.  
  38. #if PRAGMA_ALIGN_SUPPORTED
  39. #pragma options align=mac68k
  40. #endif
  41.  
  42. ///--------------------------------------------------------------------------------------
  43. //    sprite world error constants
  44. ///--------------------------------------------------------------------------------------
  45.  
  46. enum
  47. {
  48.     kSystemTooOldErr = 100,        // < System 7.0
  49.     kMaxFramesErr,                // attempt to exceed maximum number of frames for a sprite
  50.     kInvalidFramesIndexErr,        // frame index out of range
  51.     kNotCWindowErr,                // attempt to make a SpriteWorld from non-color WindowPtr
  52.     kNilParameterErr,            // nil SpritePtr, FramePtr, etc.
  53.     kWrongDepthErr,    // 105        // invalid pixel size for attempted function
  54.     kWrongMaskErr,                // invalid mask type for attempted function
  55.     kOutOfRangeErr,                // tileID, tileMap, or other value out of bounds
  56.     kTilingNotInitialized,        // tiling hasn't been initialized
  57.     kTilingAlreadyInitialized,    // tiling already initialized; can't be initialized again
  58.     kNullTileMapErr, // 110        // no TileMap has ever been created/loaded
  59.     kTileMapNotLockedErr,        // the TileMap is not locked and can't be used until it is
  60.     kAlreadyCalledErr,            // the function was already called and can't be called again
  61.     kSpriteNotCompiledErr,        // the sprite must be compiled before drawProc can be set
  62.     kBadParameterErr, // 114    // a parameter that was passed to the function is invalid
  63.     kSpriteAlreadyInLayer,        // the Sprite is already in a Layer, and can't be added to another
  64.     kNilFrameErr,                // the Frame this function acts on is NIL
  65.     kNotLockedErr                // a structure that must be locked is not
  66. };
  67.  
  68.  
  69. ///--------------------------------------------------------------------------------------
  70. //    UpdateRectStruct data structure
  71. ///--------------------------------------------------------------------------------------
  72. typedef struct UpdateRectStruct UpdateRectStruct;
  73. typedef UpdateRectStruct *UpdateRectStructPtr;
  74.  
  75. struct UpdateRectStruct
  76. {
  77.     Rect                 updateRect;            // this rect
  78.     UpdateRectStructPtr nextRectStructP;    // next rect struct
  79. };
  80.  
  81.  
  82. ///--------------------------------------------------------------------------------------
  83. //    sprite world type definitions
  84. ///--------------------------------------------------------------------------------------
  85.  
  86. typedef SW_FUNC void (*WorldMoveProcPtr)(
  87.     SpriteWorldPtr spriteWorldP,
  88.     SpritePtr followSpriteP);
  89.  
  90. typedef SW_FUNC void (*CallBackPtr)(
  91.     SpriteWorldPtr spriteWorldP);
  92.  
  93. typedef SW_FUNC void (*DoubleDrawProcPtr)(
  94.     FramePtr srcFrameP,
  95.     FramePtr dstFrameP, 
  96.     Rect *srcRectA,
  97.     Rect *dstRectA,
  98.     Rect *srcRectB,
  99.     Rect *dstRectB);
  100.  
  101.  
  102. ///--------------------------------------------------------------------------------------
  103. //    sprite world data structure
  104. ///--------------------------------------------------------------------------------------
  105.  
  106. struct SpriteWorldRec
  107. {
  108.     SpriteLayerPtr headSpriteLayerP;    // head of the sprite layer linked list
  109.     SpriteLayerPtr tailSpriteLayerP;    // tail of the sprite layer linked list
  110.     SpriteLayerPtr deadSpriteLayerP;    // where SWRemoveSpriteFromAnimation puts Sprites
  111.     
  112.     UpdateRectStructPtr headUpdateRectP; // used by SWFlagRectAsChanged
  113.     
  114.     FramePtr extraBackFrameP;            // used when adding a background behind tiles
  115.     FramePtr backFrameP;                // frame for the background
  116.     FramePtr workFrameP;                // work, or "mixing" frame
  117.     FramePtr windowFrameP;                // frame for drawing to the screen
  118.     
  119.     DrawProcPtr offscreenDrawProc;        // callback for erasing sprites offscreen
  120.     DrawProcPtr screenDrawProc;            // callback for drawing sprite pieces onscreen
  121.     DoubleDrawProcPtr doubleRectDrawProc; // callback for updating screen when scrolling
  122.     
  123.     CallBackPtr postEraseCallBack;        // called after erasing sprites
  124.     CallBackPtr postDrawCallBack;        // called after drawing sprites
  125.     
  126.     Rect    windRect;                    // holds windowFrameP->frameRect for easier access
  127.     Rect    backRect;                    // holds backFrameP->frameRect for easier access
  128.     Rect    originalWindRect;            // used by SWChangeWorldRect and SWRestoreWindRect
  129.     Rect    originalBackRect;            // used by SWChangeWorldRect and SWRestoreWindRect
  130.     
  131.     Rect    visScrollRect;                // rect that is copied to screen when scrolling
  132.     Rect    oldVisScrollRect;            // visScrollRect from last frame
  133.     Rect    offscreenScrollRect;        // same as visScrollRect, but local to offscreen
  134.     short    horizScrollRectOffset;        // offset from offscreenScrollRect to visScrollRect
  135.     short    vertScrollRectOffset;        // offset from offscreenScrollRect to visScrollRect
  136.     short    horizScrollDelta;            // horizontal scrolling delta
  137.     short    vertScrollDelta;            // vertical scrolling delta
  138.     Rect    scrollRectMoveBounds;        // move bounds for visScrollRect
  139.     
  140.     WorldMoveProcPtr worldMoveProc;        // pointer to the scrolling world move procedure
  141.     SpritePtr followSpriteP;            // pointer to the "follow sprite", or NULL
  142.     
  143.     TileMapStructPtr *tileLayerArray;     // an array of all the tileMap layers
  144.     short        lastActiveTileLayer;    // the last active tile layer
  145.     Boolean        tilingIsInitialized;    // has the tiling been initialized yet?
  146.     Boolean        tilingIsOn;                // are the tiling routines turned on?
  147.     short        **tilingCache;            // two-dimensional tiling cache
  148.     short        numTilingCacheRows;        // number of rows in tilingCache array
  149.     short        numTilingCacheCols;        // number of cols in tilingCache array
  150.     FramePtr    *tileFrameArray;        // array of tile framePtrs
  151.     short        *curTileImage;            // array specifying the current frame of each tile
  152.     short        maxNumTiles;            // number of elements in tileFrameArray
  153.     short        tileWidth;                // width of each tile
  154.     short        tileHeight;                // height of each tile
  155.     long        numTilesChanged;        // number of rects in changedTiles array to update
  156.     Rect        *changedTiles;            // array of rects of tiles that changed
  157.     long        changedTilesArraySize;    // number of elements in changedTiles array
  158.     TileChangeProcPtr tileChangeProc;    // pointer to tile frame changing procedure
  159.     TileRectDrawProcPtr tileRectDrawProc; // pointer to the function that draws tiles in a rect
  160.     DrawProcPtr tileMaskDrawProc;        // drawProc for drawing masked tiles in tile layers
  161.     DrawProcPtr partialMaskDrawProc;    // drawProc for drawing partialMask tiles above sprites
  162.     
  163.     GDHandle     mainSWGDH;                // GDH of SpriteWorld's window
  164.     short         pixelDepth;                // SpriteWorld's depth
  165.     
  166.     short             fpsTimeInterval;    // milliseconds per frame of animation (1000/fps)
  167.     unsigned long    runningTimeCount;    // running total time in milliseconds
  168.     UnsignedWide     lastMicroseconds;    // value of previous Microseconds() call
  169.     unsigned long     timeOfLastFrame;    // time (from runningTimeCount) of last frame
  170.     VBLTaskRec         vblTaskRec;            // extended VBLTask record
  171.     Boolean         usingVBL;            // is the VBL task installed?
  172.     Boolean         frameHasOccurred;    // Has the SpriteWorld been processed?
  173.  
  174.     short            pad1;                // (note: Boolean is the same as an unsigned char)
  175.         
  176.     long userData;                        // reserved for user
  177. };
  178.  
  179.  
  180. ///--------------------------------------------------------------------------------------
  181. //    sprite world function prototypes
  182. ///--------------------------------------------------------------------------------------
  183.  
  184.  
  185. SW_FUNC OSErr SWEnterSpriteWorld(void);
  186.  
  187. SW_FUNC void SWExitSpriteWorld(void);
  188.  
  189. SW_FUNC OSErr SWCreateSpriteWorld(
  190.     GDHandle         mainGDH,
  191.     SpriteWorldPtr     *spriteWorldP,
  192.     FramePtr         windowFrameP,
  193.     FramePtr         backFrameP,
  194.     FramePtr         workFrameP,
  195.     short             maxDepth);
  196.  
  197. SW_FUNC OSErr SWCreateSpriteWorldFromWindow(
  198.     SpriteWorldPtr*    spriteWorldP,
  199.     CWindowPtr        srcWindowP,
  200.     Rect*            worldRectP,
  201.     Rect*            offscreenRectP,
  202.     short             maxDepth);
  203.  
  204. SW_FUNC void SWDisposeSpriteWorld(
  205.     SpriteWorldPtr    *spriteWorldPP);
  206.  
  207. SW_FUNC void SWAddSpriteLayer(
  208.     SpriteWorldPtr spriteWorldP,
  209.     SpriteLayerPtr spriteLayerP);
  210.  
  211. SW_FUNC void SWRemoveSpriteLayer(
  212.     SpriteWorldPtr spriteWorldP,
  213.     SpriteLayerPtr spriteLayerP);
  214.  
  215. SW_FUNC void SWSwapSpriteLayer(
  216.     SpriteWorldPtr spriteWorldP,
  217.     SpriteLayerPtr srcSpriteLayerP,
  218.     SpriteLayerPtr dstSpriteLayerP);
  219.  
  220. SW_FUNC SpriteLayerPtr SWGetNextSpriteLayer(
  221.     SpriteWorldPtr spriteWorldP,
  222.     SpriteLayerPtr curSpriteLayerP);
  223.  
  224. SW_FUNC void SWLockSpriteWorld(
  225.     SpriteWorldPtr spriteWorldP);
  226.  
  227. SW_FUNC void SWUnlockSpriteWorld(
  228.     SpriteWorldPtr spriteWorldP);
  229.  
  230. SW_FUNC void SWSetPortToBackground(
  231.     SpriteWorldPtr spriteWorldP);
  232.  
  233. SW_FUNC void SWSetPortToWorkArea(
  234.     SpriteWorldPtr    spriteWorldP);
  235.  
  236. SW_FUNC void SWSetPortToWindow(
  237.     SpriteWorldPtr spriteWorldP);
  238.  
  239. SW_FUNC OSErr SWSetSpriteWorldOffscreenDrawProc(
  240.     SpriteWorldPtr spriteWorldP,
  241.     DrawProcPtr offscreenProc);
  242.  
  243. SW_FUNC OSErr SWSetSpriteWorldScreenDrawProc(
  244.     SpriteWorldPtr spriteWorldP,
  245.     DrawProcPtr drawProc);
  246.  
  247. SW_FUNC void SWSetPostEraseCallBack(
  248.     SpriteWorldPtr    spriteWorldP,
  249.     CallBackPtr        callBack);
  250.     
  251. SW_FUNC void SWSetPostDrawCallBack(
  252.     SpriteWorldPtr    spriteWorldP,
  253.     CallBackPtr        callBack);
  254.     
  255. SW_FUNC void SWStdWorldDrawProc(
  256.     FramePtr srcFrameP,
  257.     FramePtr dstFrameP,
  258.     Rect* srcRect,
  259.     Rect* dstRect);
  260.  
  261. SW_FUNC void SWCopyBackgroundToWorkArea(
  262.     SpriteWorldPtr spriteWorldP);
  263.  
  264. SW_FUNC OSErr SWChangeWorldRect(
  265.     SpriteWorldPtr spriteWorldP, 
  266.     Rect* newWorldRect,
  267.     Boolean changeOffscreenAreas);
  268.  
  269. SW_FUNC void SWRestoreWorldRect(
  270.     SpriteWorldPtr spriteWorldP);
  271.  
  272. SW_FUNC void SWWindowMoved( 
  273.     SpriteWorldPtr spriteWorldP);
  274.  
  275. SW_FUNC void SWWindowFrameMoved(
  276.     FramePtr windowFrameP,
  277.     Rect *frameRect);
  278.  
  279. SW_FUNC void SWUpdateWindow(
  280.     SpriteWorldPtr spriteWorldP);
  281.  
  282. SW_FUNC void SWUpdateSpriteWorld(
  283.     SpriteWorldPtr spriteWorldP,
  284.     Boolean updateWindow);
  285.  
  286. SW_FUNC void SWProcessSpriteWorld(
  287.     SpriteWorldPtr spriteWorldP);
  288.  
  289. SW_FUNC void SWAnimateSpriteWorld(
  290.     SpriteWorldPtr spriteWorldP);
  291.  
  292. SW_FUNC void  SWCheckIdleSpriteOverlap(
  293.     SpriteWorldPtr            spriteWorldP,
  294.     register SpritePtr        idleSpriteP,
  295.     SpritePtr                headActiveSpriteP);
  296.  
  297. SW_FUNC void SWCheckIdleSpritesWithTiles(
  298.     SpriteWorldPtr    spriteWorldP,
  299.     SpritePtr        headIdleSpriteP);
  300.  
  301. SW_FUNC void SWCheckIdleSpritesWithRects(
  302.     SpriteWorldPtr    spriteWorldP,
  303.     SpritePtr        headIdleSpriteP);
  304.  
  305. SW_FUNC void SWFindSpritesToBeRemoved(
  306.     SpriteWorldPtr spriteWorldP );
  307.  
  308. SW_FUNC OSErr SWFlagRectAsChanged(
  309.     SpriteWorldPtr spriteWorldP,
  310.     Rect*    theChangedRect);
  311.  
  312. SW_FUNC OSErr SWFlagScrollingRectAsChanged(
  313.     SpriteWorldPtr spriteWorldP,
  314.     Rect*    theChangedRect);
  315.     
  316. SW_FUNC void SWSetSpriteWorldMaxFPS(
  317.     SpriteWorldPtr spriteWorldP,
  318.     short framesPerSec);
  319.  
  320. SW_FUNC OSErr SWSyncSpriteWorldToVBL(
  321.     SpriteWorldPtr    spriteWorldP,
  322.     Boolean            syncingOn);
  323.     
  324. void SWSetCleanUpSpriteWorld(SpriteWorldPtr spriteWorldP);
  325.  
  326. SW_FUNC unsigned long SWGetSpriteWorldVersion( void );
  327.  
  328.  
  329. #if GENERATINGCFM
  330. void        SWVBLTask(VBLTaskRecPtr vblTaskPtr);/* Under CFM, we're passed the VBL task pointer */
  331. #else
  332. void        SWVBLTask(void);                    /* Otherwise, we'll have to get it out of register A0 */ 
  333. #endif
  334.  
  335.  
  336. #if PRAGMA_ALIGN_SUPPORTED
  337. #pragma options align=reset
  338. #endif
  339.  
  340. #ifdef __cplusplus
  341. }
  342. #endif
  343.  
  344. #endif /* __SPRITEWORLD__ */