sdh@joevax.UUCP (Steve Hawley) (07/16/85)
This is the source to the trench simulator. It was written in MegaMax C Note the tabs should be set to 4 spaces. Steve Hawley {joevax,mouton,alice}!sdh /* Program to simulate the trench from Star Wars */ /* Written 7/12/85 by Steve Hawley in MegaMax C */ #include <qd.h> /*QuickDraw header file */ #include <qdvars.h> /*Quickdraw variables */ #include <event.h> /*Event manager header */ #include <win.h> /*Window manager header */ windowrecord wrecord; /*Record for window */ windowptr mywindow; /*pointer to record */ rect screenrect; /*Rectangle representing window size*/ int wlines = 0; /* phase of depth lines */ drawlines(offx, offy, start) /* draws lines to give illusion of depth */ int offx, offt, start; { int x1 = -200, y1 = -100; int z; /* start is the phase (from 0 to 3), The lines are projected by */ /* the formulae x' = x/z; y' = y/z. offx and offy are offsets for*/ /* viewpoint changes */ for (index = 50 - start; index > 0; index -= 4) { moveto( (x1 - offx)/z, (y1 - offy)/z); lineto( (x1 - offx)/z, (-y1 - offy)/z); moveto( (-x1 - offx)/z, (y1 - offy)/z); lineto( (-x1 - offx)/z, (-y1 - offy)/z); } } setup(offx, offy) /* draws the frame of the trench */ /* offx and offy again represent the viewpoint offsets, and it is */ /* projected using the same formulae as before */ int offx, offy; { int x1 = -200, x2 = -100, y1 = -100; moveto(x1 - offx,y1 -offy); lineto((x1 - offx)/50, (y1-offy)/50); lineto((x1 - offx)/50, (-y1 - offy)/50); lineto(x1 - offx, -y1 - offy); moveto(x2 - offx, -y1 - offy); lineto((x2 - offx)/50, (-y1 - offy)/50); moveto(-x1 - offx,y1 -offy); lineto((-x1 - offx)/50, (y1-offy)/50); lineto((-x1 - offx)/50, (-y1 - offy)/50); lineto(-x1 - offx, -y1 - offy); moveto(-x2 - offx, -y1 - offy); lineto((-x2 - offx)/50, (-y1 - offy)/50); } main() { /* the objects are animated by using exclusive-or drawing. this way, the */ /* same routine to draw can be used to erase, and the new image can be */ /* drawn before the old image is erased to help eliminate flicker. Thus*/ /* the the program needs two copies of the offset parameters, one for the*/ /* new and one for the old. */ int offxo=0,offxn=0,offyo=0,offyn=0; point mouse; initgraf(&theport); /* Set up quickdraw */ flushevents(everyevent, 0); /*kill previous events*/ initwindows(); /*initialize window manager*/ setrect(&screenrect, 4, 40, 508, 338); /* Set screen size*/ mywindow = newwindow(&wrecord, &screenrect, "Trench",1,0,(long)-1,(long)0); /*Set window parameters */ setport(mywindow); /*make the window the current grafport */ showwindow(mywindow); /*display window */ setorigin(-252, -149);/* set the origin so the center of the screen in (0,0)*/ penmode(patxor); /* set exclusive-or drawing*/ setup(offxn,offyn); /*draw initial setup*/ drawlines(offxn, offyn, wlines); /*draw initiail depth lines */ while(!button()) /*repeat until button is down*/ { offxo = offxn; /* Put new offsets in old variables */ offyo = offyn; getmouse(&mouse); /*get the mouses coordinates */ if ( mouse.vh[1]/2 < offxn) /* if the horizontal has changed */ offxn = mouse.vh[1]; /* store it in the new offset */ else if ( mouse.vh[1]/2 > offxn) offxn = mouse.vh[1]/2; if (mouse.vh[0]/2 < offyn) /* if the vertical has changed */ offyn = mouse.vh[0]/2; /* stroe it in the new offset */ else if (mouse.vh[0]/2 > offyn) offyn = mouse.vh[0]/2; if ( (offxo != offxn) || (offyo != offyn)) /* if the old offset*/ { /*differs from the new, update */ setup(offxn, offyn); /*draw new setup */ setup(offxo, offyo); /*erase old */ } drawlines(offxo, offyo, wlines); /* erase the vertical lines */ wlines++; /* increment wlines */ if (wlines > 3) wlines = 0; /* reset wlines if too big */ drawlines(offxn, offyn, wlines); /* draw new set of lines */ } }