home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-12-04 | 4.7 KB | 173 lines | [TEXT/EDIT] |
- /* Written 12:00 pm Jul 16, 1985 by sdh@joevax.UUCP in uiucdcs:net.sources.mac */
- /* ---------- "Source to 3D maze display" ---------- */
-
- This is the source code for the maze display program. It was done in
- Aztec C version 1.06D. Note: the tabs should be set to 4 spaces.
-
- Steve Hawley
- {joevax,mouton,alice}!sdh
- Date: 16 July 1985 1131-EDT (Tuesday)
-
-
- #include <quickdraw.h>
- #include <window.h>
- #include <inits.h>
- #include <event.h>
- #include <menu.h>
- #include <osutil.h>
-
- /* Program to display a 2D maze in 3D with hidden lines and limited shading */
- /* Steve Hawley 7/15/85. Written in Aztec C, version 1.06D */
-
-
-
- WindowRecord wRecord;
- WindowPtr myWindow;
- EventRecord myEvent;
-
- static char maze[22][17] ={ {1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1},
- {1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1},
- {1,0,1,1,1,0,1,1,0,1,0,1,1,0,1,1,1},
- {1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1},
- {1,1,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1},
- {1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1},
- {1,0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,1},
- {1,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,1},
- {1,1,0,0,0,1,1,1,0,1,0,1,1,1,0,1,1},
- {1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1},
- {1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1},
- {1,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1},
- {1,0,1,1,1,1,1,1,0,1,0,1,0,0,0,1,1},
- {1,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,1},
- {1,0,1,1,0,1,1,1,0,1,0,1,1,1,1,0,1},
- {1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1},
- {1,0,1,1,0,1,0,1,0,1,1,1,1,1,1,0,1},
- {1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1},
- {1,0,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1},
- {1,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1},
- {1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1},
- {1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1}};
- /* the maze. 1's = blocks, 0's = space */
-
- sqre3d (col, row)
- int col, row;
- /* Displays a given block from the maze. Decides on which side of center the block is found, and */
- /* draws the visible faces, which are defined as polygons. The faces are projected using the */
- /* formulae: x' = x/z; y' = y/z; to achieve one point perspective. */
- {
- int x1,x2,y1,y2,z1,z2;
- PolyHandle sideleft, siderite, top, front;
- x1 = (col - 8) * 100;
- x2 = x1 + 100;
- z1 = (23 - row);
- z2 = z1 -1;
- y1 = 150;
- y2 = 250;
-
- sideleft = OpenPoly();
- MoveTo( (x1/z1) + 200, (y1/z1) + 60);
- LineTo( (x1/z1) + 200, (y2/z1) + 60);
- LineTo( (x1/z2) + 200, (y2/z2) + 60);
- LineTo( (x1/z2) + 200, (y1/z2) + 60);
- LineTo( (x1/z1) + 200, (y1/z1) + 60);
- ClosePoly();
-
- siderite = OpenPoly();
- MoveTo( (x2/z1) + 200, (y1/z1) + 60);
- LineTo( (x2/z1) + 200, (y2/z1) + 60);
- LineTo( (x2/z2) + 200, (y2/z2) + 60);
- LineTo( (x2/z2) + 200, (y1/z2) + 60);
- LineTo( (x2/z1) + 200, (y1/z1) + 60);
- ClosePoly();
-
- top = OpenPoly();
- MoveTo( (x1/z1) + 200, (y1/z1) + 60);
- LineTo( (x2/z1) + 200, (y1/z1) + 60);
- LineTo( (x2/z2) + 200, (y1/z2) + 60);
- LineTo( (x1/z2) + 200, (y1/z2) + 60);
- LineTo( (x1/z1) + 200, (y1/z1) + 60);
- ClosePoly();
-
- front = OpenPoly();
- MoveTo( (x1/z2) + 200, (y1/z2) + 60);
- LineTo( (x2/z2) + 200, (y1/z2) + 60);
- LineTo( (x2/z2) + 200, (y2/z2) + 60);
- LineTo( (x1/z2) + 200, (y2/z2) + 60);
- LineTo( (x1/z2) + 200, (y1/z2) + 60);
- ClosePoly();
-
- if (x2 < 0 && maze[row][col +1] != 1)/*decide to draw right side (dark gray)*/
- {
- PenPat(dkGray);
- ErasePoly(siderite);
- PaintPoly(siderite);
- PenPat(black);
- FramePoly(siderite);
- }
-
- if (x1 > 0 && maze[row][col-1] != 1) /*decide to draw left face (light gray)*/
- {
- PenPat(ltGray);
- ErasePoly(sideleft);
- PaintPoly(sideleft);
- PenPat(black);
- FramePoly(sideleft);
- }
-
- PenPat(white); /* Draw the top (white) */
- ErasePoly(top);
- PaintPoly(top);
- PenPat(black);
- FramePoly(top);
-
- PenPat(gray); /*draw the front (gray) */
- ErasePoly(front);
- PaintPoly(front);
- PenPat(black);
- FramePoly(front);
-
- PenNormal(); /*restore pen characteristics */
-
- KillPoly(top); /* dispose of all the polygons to free up memory*/
- KillPoly(front);
- KillPoly(sideleft);
- KillPoly(siderite);
- }
-
- display ()
- /* Draws out all the blocks, starting from the back, moving left to center, then right to center */
- {
- Rect trect;
- int row, col;
-
- for (row = 0; row < 22; row++)
- {
- for (col = 0; col < 8; col++)
- if (maze[row][col] == 1) sqre3d(col,row);
- for (col = 16; col > 7; col--)
- if (maze[row][col] == 1) sqre3d(col, row);
- }
- }
-
- main ()
- {
- Rect screen;
-
- InitGraf(&thePort); /* do inits */
- InitFonts();
- FlushEvents(everyEvent,0);
- InitWindows();
- SetCursor(&arrow);
- ShowCursor();
-
- SetRect(&screen, 4, 40, 508, 338); /*set up window */
- myWindow = NewWindow(&wRecord, &screen, ctop("Something Amazing"),1,0,(char*)-1,1,(long)0);
- SetPort(myWindow);
- ShowWindow(myWindow);
-
- display(); /*draw maze*/
- while(!Button()) /*wait for button to be pressed and handle events like clover-shift-4 */
- GetNextEvent(everyEvent, &myEvent);
- }
- /* End of text from uiucdcs:net.sources.mac */
-