|
Volume Number: | 4 | |
Issue Number: | 7 | |
Column Tag: | Basic School |
True Basic Plays the Simon Game
By Dave Kelly, MacTutor Editorial Board
The new and improved version of True Basic (ver. 2.01) has just recently started shipping. Some of the new features include: built in support for full color and PICT format images, 68881 coprocessor support, and a more structured environment using modules and workspaces. True Basic also now includes the Runtime package (which used to cost a few hundred dollars), but they are packaging the Macintosh Developer’s Toolkit separately. The toolkit contains all of the libraries which are essential for making “real” Macintosh programs (menus, windows, controls etc). It is obvious to any dedicated Macintosh developer that this package should have been included with the True Basic “Basic” package. However, it is true that when True Basic is sold to a school as a training tool, there is not much need for the Macintosh libraries.
This month, I am not going to do an in depth analysis of True Basic 2.01 (Basic Wars, part ??). I’ll save that for next month. I would like to show off some of True Basic’s new features with respect to Macintosh II color. I’m still impressed by Mac II’s color!
True Basic has its own unique set of statements for using color. The SET COLOR n statement (where n is a number from 0 to 255) sets the drawing pen to the color selected. Then a PLOT or some other graphics command may be given to operate in the selected color. Selecting color is not really very unique. ZBasic uses a similar statement (COLOR=n) to select colors.
The Palette Manager is responsible for monitoring and establishing the color environment on the Mac II. The system provides a default palette of colors which applications may use as desired. The default palette is a set of standard colors which may be selected. Color Quickdraw will match the selected color as best as it can, but there may be times when more shades of a particular color are desired than are available in the default palette.
Most video devices including the Mac II video card use an indexed color model. Each pixel value in the video device’s memory corresponds to an indexed value in the color table. The color display card uses the RGB value found in the look up table to display the desired color. There are several advantages to using this indexed display method. One is that it is faster. Also, it allows color animation to be used. In color animation, the index value is changed to change display colors; the pixel color itself is not changed. You can especially see the effects of this when using Pixel Paint or Modern Artist and changing the palette using the application. Another way to see the effects of changing the palette is by using the Colorizer software, by Palomar. This is recommended to any Mac II user that wants to make better use of color on the Mac II. [The Colorizer and the PICT Dective are available from MacTutor’s Mail Order Store at the back of this issue. -Ed]
Fig. 1 Our Simon Game in True Basic (This is in color on the Mac II!)
Color Palette Manipulation
True Basic allows you to change colors in the color palette. The SET COLOR MIX (x) r,g,b statement sets the color x to the color specified by the red, green, blue values given by r,g and b. In True Basic the values of r,g and b are from 0 to 1 (whereas the hardware is looking for values from 0 to 65535). For the user it is much easier to think in terms of 0 to 1 than 0 to 65535. A SET COLOR MIX (5) .25,0,0 would change color 5 to 25% of the full red value and no green and blue. The number of distinct intensities available on your Mac II depends on the number of colors available. You may use ASK MAX COLOR to determine how many of the colors are available out of the total 256 colors (assuming you can display 256 colors). Actually ASK MAX COLOR returns n-3 colors because some of the colors are already in use by the system. ASK MAX COLOR will only let you know the maximum possible number of colors. SET COLOR MIX is ignored on black and white systems.
Using color is fun as you can see from this months program (see the black and white figure 1; on the Mac II, this Simon game is in color with the background an animated palette). The theme I selected is based on the Simon game (Milton Bradley) which I’m sure you have all seen before. There are a few things which must be done to set up the program if you are starting from scratch. First go to a paint program (color is preferred, but not necessary) and create the main PICT for the game as shown here in figure 2.
Fig. 2 PICT for the Simon Game
It doesn’t matter what colors are used or even the shape of the colored areas. The program will do a fill (FLOOD x,y statement in True Basic) and fill in the correct colors as long as the size of the PICT rectangle remains the same size. If the same color is used as the original, the SET COLOR MIX statement needs to use a different color because the FLOOD statement fills the area till it finds a change in color or it finds the same color as the one being use to fill the area.
Next the PICT should be stored in the clipboard and then run the ‘Save Clip’ program. The purpose of this program is to convert the clipboard PICT file into a disk PICT file. True Basic could read the PICT file direct, but this way we know that we have only selected the actually PICT and not some of the areas surrounding it. When the ‘Save Clip’ program asks for a filename, the name of the file as used in the main program should be used (in this case ‘Prof Says.PICT’ is the filename).
{1} ! Save Clip ! This program will save the contents of the clipboard to a file LIBRARY “Mactools*” LIBRARY “PictLib*” DECLARE DEF MacPutFile$ LET doneflag=0 DO until doneflag=1 CALL Read_clipboard(“PICT”,s$) LET filename$=MacPutFile$(50,50,”Enter Filename to save as ”,””,””) IF filename$<>”” THEN CALL Write_pictfile(filename$,s$) PRINT “Do another?”; GET KEY Answer IF Answer<>ord(“Y”) OR Answer<>ord(“y”) THEN LET doneflag=1 ELSE LET doneflag=1 END IF LOOP END
The main program requires the use of the MacTools and PictLib Libraries. These are provided with the True Basic package. To help True Basic find the libraries (in case they are moved to a strange place) the ALIAS statement should be used. The manual is not too clear on this, but ALIAS statements should be run from a file ‘TB Startup’ automatically when True Basic is run. This is a satisfactory solution to fix the HFS problems that True Basic 1.0 had.
The next thing that might be different for you is the way that True Basic specifies the window (or screen) coordinates. No matter what kind of computer True Basic is being run on, the coordinates are the same. The coordinates start with 0,0 in the bottom left corner of the screen and go to 1,1 in the top right corner. Then using the SET WINDOW statement any coordinate system may be mapped to the current window. A smaller portion of the screen may be partitioned off to act as a kind of clipping region for text. The PictStuff library seems to only use screen coordinates and doesn’t pay much attention to the location of the window. However, by using the CALL Set_Frame statement, the PICT graphics may be displayed anywhere you want. The OPEN #1:screen left, right, bottom, top statement is set up for the Apple RGB Monitor. These values may have to be adjusted if used on other size monitors.
Of course, True Basic statements are used all the way through the program except for the MacTools calls which are used mostly used to display text. A few of the other Macintosh things which are included in the MacTools Library are:
MacPenSize(width,height) MacPenMode(mode) MacTextFont(font) MacTextFace(style$) MacTextMode(mode) MacTextSize(size) MacTextBox(left,right,bottom,top,s$,just$) MacSpaceExtra(extra) MacGetFontInfo(ascent,descent,widmax,leading) MacGetFile$(h,v,type$,button$) MacPutFile$(h,v,pr$,iname$,button$) MacSysBeep(duration)
also other commands for drawing ovals and rectangles.
I am somewhat disappointed that more of the Macintosh Toolbox is not included (built in) to the True Basic system. Of course the Developer Toolkit should include the rest of the Macintosh ROM world, but it would be nice to have it integrated. [We are still waiting for delivery of the Developer Toolkit. True Basic is sending return postcards to order the library but as yet we have not seen it. -Ed] If you use any library a lot, you may load it when you startup and have it resident in memory so at least there is a way to simplify the system. I hope to be able to review the Developer Toolkit when it is released. I will have more to say about True Basic next month.
{2} ! Professor Mac Says ! By David Kelly ! ©MacTutor, 1988 ! With special thanks to Milton Bradley Co. ! For their “Simon” Game LIBRARY “Mactools*”! MacStuff Library LIBRARY “PictLib*” ! PICTStuff Library DECLARE DEF MacGetFile$ DIM notes(31) RANDOMIZE LET skilllevel=8 ! Set up levels LET level=1 SET BACKGROUND COLOR 10 ! Get a Background color OPEN #1:screen .25,.67,.165,.75 ! open a section of screen WINDOW #1 ! and use it as a window SET WINDOW 0,1,0,1 ASK SCREEN a,b,c,d CALL set_frame(a,b,c,d) LET filename$=”Prof Says.PICT”! Get the PICT resource IF filename$<>”” THEN CALL Read_pictfile(filename$,s$) CALL Draw_string(s$,1) ELSE PRINT “Prof Says.PICT file not found!” END IF ! Set up the main screen CALL SetRed FLOOD .3,.7 ! Fill the shape with Red CALL SetBlue FLOOD .7,.7 ! Fill the shape with Blue CALL SetGreen FLOOD .3,.3 ! Fill the shape with Green CALL SetYellow FLOOD .7,.3 ! Fill the shape with Yellow ! Turn off all shapes CALL darkred CALL darkblue CALL darkgreen CALL darkyellow ASK WINDOW a,b,c,d BOX KEEP a,b,c,d in None$ ! Save PICT so it can be ! restored later CALL MacTextFont(2)! Get New York font SET TEXT JUSTIFY “center”,”half” DO ! Start the Main program loop SET COLOR MIX (0) rnd,rnd,rnd ! change background color CALL SetButtons(level) DO LET Animationcount=Animationcount+1 IF Animationcount>=500 then SET COLOR MIX (0) rnd,rnd,rnd! change the background color LET Animationcount=0 END IF GET MOUSE x,y,s ! Check for mouse press IF s>=1 then GET POINT x,y ! Get the mouse press LET result=0 CALL PtInRect(x,y,.12,.295,.7,.8,result) ! Level 1 IF result=1 then LET skilllevel=8 LET level=1 CALL SetStartGameButton(Level) END IF LET result=0 CALL PtInRect(x,y,.32,.495,.7,.8,result) ! Level 2 IF result=1 then LET skilllevel=14 LET level=2 CALL SetStartGameButton(Level) END IF LET result=0 CALL PtInRect(x,y,.505,.680,.7,.8,result) ! Level 3 IF result=1 then LET skilllevel=20 LET level=3 CALL SetStartGameButton(Level) END IF LET result=0 CALL PtInRect(x,y,.705,.880,.7,.8,result) ! Level 4 IF result=1 then LET skilllevel=31 LET level=4 CALL SetStartGameButton(Level) END IF LET result=0 CALL PtInRect(x,y,.3,.7,.05,.15,result) IF result=1 then ! Quit Routine SET COLOR “White” BOX AREA 0,1,0,1 SET COLOR “Black” BOX LINES 0,1,0,1 SET COLOR “Blue” CALL MacTextSize(24) PLOT TEXT, AT .5,.6:”Thank you for” PLOT TEXT, AT .5,.4:”Reading MacTutor™” STOP END IF LET result=0 CALL PtInRect(x,y,.3,.7,.2,.3,result) IF result=1 then ! Play the Game BOX SHOW none$ at 0,0 LET x=0 LET y=0 LET numberofnotes=1 LET tempo=100 DO until numberofnotes=skilllevel CALL PlaySequence(numberofnotes,tempo, notes()) FOR i=1 to numberofnotes SET COLOR MIX (0) rnd,rnd,rnd GET POINT x,y CALL buttonpress(x,y,selection) IF selection<>notes(i) then CALL MacSysBeep(500) CALL MacSysBeep(500) CALL MacSysBeep(500) EXIT DO END IF NEXT i LET numberofnotes=numberofnotes+1 LET tempo=tempo+i*10 PAUSE 1 LOOP CALL SetButtons(level) END IF END IF LOOP LOOP END SUB SetButtons(GameLevel) ! Set Game Buttons CALL MacTextSize(14) SET COLOR “white” BOX AREA .3,.7,.05,.15 ! Quit Game Button BOX AREA .12,.295,.7,.8 ! Level 1 Button BOX AREA .32,.495,.7,.8 ! Level 2 Button BOX AREA .505,.680,.7,.8 ! Level 3 Button BOX AREA .705,.880,.7,.8 ! Level 4 Button SET COLOR “Black” BOX LINES .3,.7,.05,.15 ! Quit Game Button BOX LINES .12,.295,.7,.8 ! Level 1 Button BOX LINES .32,.495,.7,.8 ! Level 2 Button BOX LINES .505,.680,.7,.8 ! Level 3 Button BOX LINES .705,.880,.7,.8! Level 4 Button SET COLOR “Red” CALL SetStartGameButton(GameLevel) PLOT TEXT, AT .5,.11:”Quit Game” CALL MacTextSize(12) PLOT TEXT, AT .195,.77:”1" PLOT TEXT, AT .4,.77:”2" PLOT TEXT, AT .575,.77:”3" PLOT TEXT, AT .825,.77:”4" END SUB SUB SetStartGameButton(GameLevel) ! Set up the Start Game Button SET COLOR MIX (0) rnd,rnd,rnd CALL MacTextSize(14) SET COLOR “White” BOX AREA .1,.9,.2,.3! Start Game Button SET COLOR “Black” BOX LINES .1,.9,.2,.3 ! Start Game Button SET COLOR “Red” PLOT TEXT, AT .5,.26:”Start Game Level “ & STR$(Gamelevel) END SUB SUB SetNone ! Display the PICT with colors off BOX SHOW None$ at 0,0 END SUB SUB SetRed SET COLOR MIX (13) 1,0,0 SET COLOR 13 END SUB SUB DarkRed SET COLOR MIX (13) 0,0,0 SET COLOR 13 END SUB SUB SetGreen SET COLOR MIX (14) 0,1,0 SET COLOR 14 END SUB SUB DarkGreen SET COLOR MIX (14) 0,0,0 SET COLOR 14 END SUB SUB SetBlue SET COLOR MIX (15) 0,0,1 SET COLOR 15 END SUB SUB DarkBlue SET COLOR MIX (15) 0,0,0 SET COLOR 15 END SUB SUB SetYellow SET COLOR MIX (16) .9,1,0 SET COLOR 16 END SUB SUB DarkYellow SET COLOR MIX (16) 0,0,0 SET COLOR 16 END SUB SUB FlashRed SET COLOR MIX (13) 1,0,0 LET note$=”o5 mf ms c” PLAY note$ PAUSE .5 SET COLOR MIX (13) 0,0,0 END SUB SUB FlashGreen SET COLOR MIX (14) 0,1,0 LET note$=”o5 mf ms a” PLAY note$ PAUSE .5 SET COLOR MIX (14) 0,0,0 END SUB SUB FlashBlue SET COLOR MIX (15) 0,0,1 LET note$=”o5 mf ms >a” PLAY note$ PAUSE .5 SET COLOR MIX (15) 0,0,0 END SUB SUB FlashYellow SET COLOR MIX (16) 1,1,0 LET note$=”o5 mf ms e” PLAY note$ PAUSE .5 SET COLOR MIX (16) 0,0,0 END SUB SUB PtInRect(x,y,left,right,bottom,top,Result) ! See if point is in Rectangle IF x>left and x<right and y>bottom and y<top then LET Result=1 ELSE LET Result=0 END IF END SUB SUB Buttonpress(x,y,selection)! Handle button press CALL PtInRect(x,y,0,.5,.5,1,result) IF result=1 then LET selectedcolor=13 CALL PtInRect(x,y,0,.5,0,.5,result) IF result=1 then LET selectedcolor=14 CALL PtInRect(x,y,.5,1,.5,1,result) IF result=1 then LET selectedcolor=15 CALL PtInRect(x,y,.5,1,0,.5,result) IF result=1 then LET selectedcolor=16 SELECT CASE selectedcolor CASE 13 CALL flashred LET selection=1 CASE 14 CALL flashgreen LET selection=2 CASE 15 CALL flashblue LET selection=3 CASE 16 CALL flashyellow LET selection=4 CASE ELSE LET selection=0 END SELECT END SUB SUB PlaySequence(numberofnotes,tempo,notes()) ! Play the notes LET tempo$=”t”&str$(tempo) PLAY tempo$ FOR i=1 to numberofnotes SET COLOR MIX (0) rnd,rnd,rnd IF notes(i)=0 then LET note=int(4*rnd)+1 ELSE LET note=notes(i) END IF SELECT CASE note CASE 1 CALL flashred CASE 2 CALL flashgreen CASE 3 CALL flashblue CASE 4 CALL flashyellow END SELECT LET notes(i)=note NEXT i END SUB
- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine