home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 647.lha / shotSTAR / shotSTAR.c < prev    next >
C/C++ Source or Header  |  1992-06-10  |  5KB  |  166 lines

  1. /*
  2.    shotSTAR v2.0 for AmigaDOS, by Aaron Holmes.
  3.    This program is available in three forms for three operating systems;
  4.    Macintosh, MS-DOS, and, with this latest release: AmigaDOS. This simple
  5.    demo uses the trigonometric ratios sine and cosine to create dazzling
  6.    string-art-like images. No two are exactly alike! (FPU RECOMMENDED!)
  7. */
  8.  
  9. #include <intuition/intuition.h>
  10. #include <math.h>
  11.  
  12. #define _X 320
  13. #define _Y 200
  14. #define MaxR _X
  15. #define MaxT 6.283185307   /* slightly exaggerated */
  16. #define MaxI 32768
  17.  
  18. void SetUP(void);
  19. void TakeDOWN(void);
  20.  
  21. struct TextAttr TopazFont = { "topaz.font", 8, FS_NORMAL, FPB_ROMFONT };
  22.  
  23. /* in COLOR!!! */
  24. UWORD OurPalette[4] = { 0x0000, 0x000F, 0x0F00, 0x0000 };
  25.  
  26. UWORD chip BlankPointer[] =
  27. {
  28.    0x0000, 0x0000,   /* no screen burn-in */
  29.    0x0000, 0x0000,
  30.    0x0000, 0x0000
  31. };
  32.  
  33. struct NewScreen OSDef =
  34. {
  35.    0, 0, 640, 400, 2,   /* left top wide high deep */
  36.    0, 0,                /* detail 'n' block pens */
  37.    HIRES | LACE,        /* flags (res junk) */
  38.    CUSTOMSCREEN | SCREENBEHIND | SCREENQUIET,   /* type */
  39.    &TopazFont,          /* font (let's be creative) */
  40.    "shotSTAR v2.0",     /* title... ok, so it's invisible */
  41.    NULL,                /* gadgets */
  42.    NULL                 /* custom bitmap */
  43. };
  44.  
  45. struct NewWindow OWDef =
  46. {
  47.    0, 0, 640, 400,   /* left top wide high */
  48.    0, 0,             /* detail 'n' block pens */
  49.    MOUSEBUTTONS,     /* IDCMP flags */
  50.    SMART_REFRESH | GIMMEZEROZERO | BORDERLESS |
  51.    RMBTRAP | ACTIVATE,   /* misc. flags */
  52.    NULL,             /* gadgets */
  53.    NULL,             /* checkmark */
  54.    NULL,             /* title */
  55.    NULL,             /* screen */
  56.    NULL,             /* superbitmap */
  57.    0, 0, 0, 0,       /* no resizing this bugger */
  58.    CUSTOMSCREEN      /* on a what? */
  59. };
  60.  
  61. struct IntuitionBase *IntuitionBase;
  62. struct GfxBase *GfxBase;
  63. struct Screen *OurScreen;
  64. struct Window *OurWindow;
  65.  
  66. /******************** the MAIN function ********************/
  67.  
  68. main()
  69. {
  70.    struct IntuiMessage *OurMessage;
  71.    struct RastPort *RP;
  72.    
  73.    double Theta, Rad2Add;
  74.    
  75.    int i, x[320], y[320], r;
  76.    
  77.    unsigned t;
  78.    
  79.    SetUP();   /* get all SetUP */
  80.    
  81.    RP = OurWindow->RPort;   /* save ourselves some time */
  82.    SetDrMd(RP, JAM1);       /* make sure we're in the right mode */
  83.    
  84.    time(&t);
  85.    srand(t);   /* not THAT pseudo */
  86.      
  87.    FOREVER
  88.    {
  89.       Rad2Add = rand();   /* draw a random number */
  90.       if(!Rad2Add == 0)
  91.          Rad2Add = Rad2Add * MaxT / MaxI;   /* limit it to 6.28 */
  92.       
  93.       Theta = 0;   /* set these to starting values */
  94.       r = 0;
  95.       
  96.       SetAPen(RP, 2);   /* select RED from our palette */
  97.       
  98.       do
  99.       {
  100.          if(OurMessage = (struct IntuiMessage *)
  101.          GetMsg(OurWindow->UserPort))   /* got a message? */
  102.          {
  103.             ReplyMsg(OurMessage);
  104.             TakeDOWN();   /* time to quit */
  105.          }
  106.          
  107.          x[r] = _X + r * cos(Theta);   /* our next move */
  108.          y[r] = _Y + r * sin(Theta);
  109.          
  110.          Theta += Rad2Add;                  /* offset Theta */
  111.          if(Theta >= MaxT) Theta -= MaxT;   /* back 360 */
  112.          
  113.          Move(RP, r * 2, 0);   /* start thermometer line */
  114.          Draw(RP, r * 2, 5);   /* finish it */
  115.          
  116.          r++;   /* expand */
  117.       }
  118.       while(r <= MaxR);
  119.       
  120.       SetRast(RP, 0);              /* clear the screen */
  121.       SetAPen(RP, 1);              /* select BLUE */
  122.       Move(RP, _X, _Y);            /* move to the center */
  123.       for(i = 1; i <= MaxR; i++)   /* loop 320 times */
  124.       {
  125.          Draw(RP, x[i], y[i]);   /* draw all the lines */
  126.       }
  127.    }
  128. }
  129.  
  130. /******************** the SetUP function ********************/
  131.  
  132. void SetUP()
  133. {
  134.    /* try opening the libraries and our screen */ 
  135.    IntuitionBase = (struct IntuitionBase *)
  136.    OpenLibrary("intuition.library", 0);
  137.    GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0);
  138.    OurScreen = (struct Screen *)OpenScreen(&OSDef);
  139.    /* I hope it worked */
  140.    if((!IntuitionBase) || (!GfxBase) || (!OurScreen)) TakeDOWN();
  141.    
  142.    OWDef.Screen = OurScreen;   /* the window is ours */
  143.    
  144.    /* and now, our window */
  145.    OurWindow = (struct Window *)OpenWindow(&OWDef);
  146.    /* I hope it worked */
  147.    if(!OurWindow) TakeDOWN();
  148.    
  149.    LoadRGB4(&OurScreen->ViewPort, OurPalette, 4);      /* set palette */
  150.    SetPointer(OurWindow, &BlankPointer, 1, 1, 0, 0);   /* no arrow */
  151.    ScreenToFront(OurScreen);                           /* we're here */
  152. }
  153.  
  154. /******************** the TakeDOWN function ********************/
  155.  
  156. void TakeDOWN()
  157. {
  158.    if(OurWindow) CloseWindow(OurWindow);   /* close what we opened */
  159.    if(OurScreen) CloseScreen(OurScreen);
  160.    if(GfxBase) CloseLibrary(GfxBase);
  161.    if(IntuitionBase) CloseLibrary(IntuitionBase);
  162.    
  163.    /* we're outta here... adios AMIGA */
  164.    exit(TRUE);
  165. }
  166.