home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 262.lha / SpriteWizard_v1.0 / SW_CDemo.c < prev    next >
C/C++ Source or Header  |  1989-06-30  |  6KB  |  249 lines

  1. /*  Demo on how to use SpriteWiz created data in C  -  By D. Visage
  2.     Written with Aztec C 3.4, but should compile with Lattice.
  3.  
  4.     To compile with Aztec C :  cc +l SW_CDemo.c
  5.     To link with Aztec C    :  ln SW_CDemo.o -lc32
  6.  
  7.     (c) 1988 Message Software
  8.     James Messa and David A. Visage
  9.     GET THE MESSAGE!                                  */
  10.  
  11. #include <stdio.h>
  12. #include <exec/types.h>
  13. #include <intuition/intuition.h>
  14. #include <graphics/sprite.h>
  15. #include "Talker.h"
  16.  
  17. #define VERSION 0      /*  Any version of intuition is cool!  */
  18.  
  19. /*  Color registers used  */
  20. #define COLOR00  0
  21. #define COLOR01  1
  22. #define COLOR02  2
  23. #define COLOR21  21
  24. #define COLOR22  22
  25. #define COLOR23  23
  26.  
  27. /*  Define certain maximum values  */
  28. #define MAX_INT     32767
  29. #define MAX_DELAY   3
  30. #define MAX_WIDTH   640
  31. #define MAX_HEIGHT  200
  32.  
  33. /*  Sprite minimum and maximum (X,Y) coordinates  */
  34. #define MIN_X   5
  35. #define MAX_X   605
  36. #define MIN_Y   10
  37. #define MAX_Y   185
  38.  
  39. /*  Defines for sprite  */
  40. #define SPRITE02    02
  41. #define SPR_HEIGHT  16
  42.  
  43. /*  Define return values for all functions used  */
  44. extern struct Window *OpenWindow();
  45. extern struct Library *OpenLibrary();
  46. extern struct Message *GetMsg();
  47. extern struct ViewPort *ViewPortAddress();
  48. extern ULONG GetSprite();
  49. extern unsigned int rand();
  50. extern int GetRand();
  51.  
  52. struct IntuitionBase *IntuitionBase;
  53. struct GfxBase *GfxBase;
  54.  
  55. struct NewWindow MyWindow;
  56. struct SimpleSprite MySprite;
  57.  
  58. /*  Pointers to various structures  */
  59. struct RastPort *Rp;
  60. struct ViewPort *Vp;
  61. struct Window  *WindowPtr;
  62. struct IntuiMessage *MessagePtr;
  63.  
  64. char *PromoStr = "Designing and animating sprites is easy with SpriteWiz!";
  65.  
  66. main()
  67. {
  68. LONG SprNum;
  69. LONG SpriteX,SpriteY;
  70. LONG TestX,TestY;
  71. WORD SpriteDX,SpriteDY;
  72. int cntr,DelayVal;
  73.  
  74. /*  Start main program  */
  75. if ( ( IntuitionBase = (struct IntuitionBase *)
  76.         OpenLibrary("intuition.library",VERSION) ) == NULL )
  77.    {
  78.    printf("Cannot find intuition library! \n");
  79.    exit(1);
  80.    };
  81.  
  82. if ( ( GfxBase = (struct GfxBase *)
  83.         OpenLibrary("graphics.library",VERSION) ) == NULL )
  84.    {
  85.    printf("Cannot find graphics library! \n");
  86.    exit(1);
  87.    };
  88.  
  89. MyWindow.LeftEdge = 0;
  90. MyWindow.TopEdge = 0;
  91. MyWindow.Width = MAX_WIDTH;
  92. MyWindow.Height = MAX_HEIGHT;
  93. MyWindow.DetailPen = COLOR00;
  94. MyWindow.BlockPen = COLOR01;
  95. MyWindow.Flags = WINDOWCLOSE | SMART_REFRESH | ACTIVATE;
  96. MyWindow.IDCMPFlags = CLOSEWINDOW;
  97. MyWindow.Title = (UBYTE *) "Sprite Wizard C demo - By D. Visage ";
  98. MyWindow.MinWidth = MyWindow.MinHeight = 0;
  99. MyWindow.MaxWidth = MyWindow.MaxHeight = 0;
  100. MyWindow.Type = WBENCHSCREEN;
  101.  
  102. if ( ( WindowPtr = OpenWindow(&MyWindow) ) == NULL )
  103.    {
  104.    printf("Cannot open your window! \n");
  105.    exit(1);
  106.    };
  107.  
  108. /*  Get needed ViewPort and RastPort  */
  109. Vp = ViewPortAddress(WindowPtr);
  110. Rp = WindowPtr->RPort;
  111.  
  112. SetRGB4(Vp,COLOR00,0x0,0x0,0x0);         /*  Background black  */
  113. SetRGB4(Vp,COLOR01,0xf,0xf,0xf);         /*  Borders white     */
  114. SetRGB4(Vp,COLOR02,0xf,0x0,0x0);         /*  All else is red   */
  115.  
  116. /*  Get Promo string up there  */
  117. SetAPen(Rp,COLOR01);
  118. Move(Rp,100,100);
  119. Text(Rp,PromoStr,(LONG) strlen(PromoStr));
  120.  
  121. SetSeed();         /*  Seed random number generator  */
  122.  
  123. /*  Allocate a sprite to play with  */
  124. if ( ( SprNum = GetSprite(&MySprite,SPRITE02) ) == - 1 )
  125.    {
  126.    printf("Could not allocate a sprite! \n");
  127.    exit(1);
  128.    };
  129.  
  130. /*  Initialize the sprite  */
  131. MySprite.num = SprNum;
  132. MySprite.height = SPR_HEIGHT;
  133. MySprite.x = MIN_X + GetRand(MAX_X - MIN_X);
  134. MySprite.y = MIN_Y + GetRand(MAX_Y - MIN_Y);
  135.  
  136. /*  Place holders for current (X,Y)  */
  137. SpriteX = MySprite.x;
  138. SpriteY = MySprite.y;
  139.  
  140. /*  Get random DX direction  */
  141. if ( GetRand(2) == 0 )
  142.    SpriteDX = 1;
  143. else
  144.    SpriteDX = - 1;
  145.  
  146. /*  Get random DY direction  */
  147. if ( GetRand(2) == 0 )
  148.    SpriteDY = 1;
  149. else
  150.    SpriteDY = - 1;
  151.  
  152. cntr = NUM_SPRITES - 1;
  153. DelayVal = 0;
  154. while ( TRUE )
  155.   {
  156.   MessagePtr = (struct IntuiMessage *) GetMsg(WindowPtr->UserPort);
  157.   if ( MessagePtr != NULL )
  158.      {
  159.      ReplyMsg(MessagePtr);
  160.      if ( MessagePtr->Class == CLOSEWINDOW )
  161.         {
  162.         FreeSprite(SprNum);
  163.         CloseWindow(WindowPtr);
  164.         exit(0);
  165.         };
  166.      };
  167.  
  168.   /*  Next (X,Y) position is current (X,Y) + current DX,DY  */
  169.   TestX = SpriteX + SpriteDX;
  170.   TestY = SpriteY + SpriteDY;
  171.  
  172.   /*  Check if sprite is within bounds  */
  173.   if ( TestX <= MIN_X || TestX >= MAX_X )
  174.      SpriteDX = - (SpriteDX);
  175.   if ( TestY <= MIN_Y || TestY >= MAX_Y )
  176.      SpriteDY = - (SpriteDY);
  177.  
  178.   /*  Add DX,DY to current sprite (X,Y)  */
  179.   SpriteX += SpriteDX;
  180.   SpriteY += SpriteDY;
  181.  
  182.   /*  Move that puppy  */
  183.   MoveSprite(Vp,&MySprite,SpriteX,SpriteY);
  184.   Delay(1);
  185.  
  186.   /*  Pause a bit before flipping images  */
  187.   if ( DelayVal == 0 )
  188.      {
  189.      DelayVal = MAX_DELAY;
  190.      if ( cntr == (NUM_SPRITES - 1) )      /*  Max sprites reached?  */
  191.         cntr = 0;
  192.      else
  193.         cntr++;
  194.  
  195.      /*  Change colors of current sprite image  */
  196.      SetPackedRGB(Vp,MySprInfo[cntr].SprColor1,COLOR21);
  197.      SetPackedRGB(Vp,MySprInfo[cntr].SprColor2,COLOR22);
  198.      SetPackedRGB(Vp,MySprInfo[cntr].SprColor3,COLOR23);
  199.  
  200.      /*  Change sprite imagry to next in animation sequence  */
  201.      ChangeSprite(Vp,&MySprite,&MySprInfo[cntr].SpriteData[0]);
  202.      }
  203.   else
  204.      DelayVal--; 
  205.   };                     /*  while (TRUE)  */
  206. }
  207.  
  208.  
  209. /*  Set a ViewPort color register from a Packed UWORD  */
  210. SetPackedRGB(VPortPtr,ColorVal,ColorReg)
  211. struct ViewPort *VPortPtr;
  212. UWORD ColorVal;
  213. ULONG ColorReg;
  214. {
  215. ULONG RedBits,GreenBits,BlueBits;
  216.  
  217. RedBits = (ColorVal >> 8) & 0xf;
  218. GreenBits = (ColorVal >> 4) & 0xf;
  219. BlueBits = ColorVal & 0xf;
  220. SetRGB4(VPortPtr,ColorReg,RedBits,GreenBits,BlueBits);
  221. }
  222.  
  223.  
  224. /*  Get a random number between 0 and (MaxRange - 1)  */
  225. GetRand(MaxRange)
  226. int MaxRange;
  227. {
  228. int Divisor,Value;
  229.  
  230. Divisor = MAX_INT/MaxRange;
  231. Value = rand()/Divisor;
  232. return(Value);
  233. }
  234.  
  235.  
  236. /*  Seed random number generator based on the current time  */
  237. SetSeed()
  238. {
  239. ULONG Seconds,MicroSeconds;
  240. unsigned int IntSeconds;
  241.  
  242. CurrentTime(&Seconds,&MicroSeconds);
  243. IntSeconds = (unsigned int) Seconds;
  244. srand(IntSeconds);
  245. }
  246.  
  247.  
  248.  
  249.