In this section I want to extend PRINT a little further and show you how to print in glorious technicolour instead of black and white as we've been doing so far. To change the colour of the text is easy and involves one new keyword: COLOUR (BBC BASIC will also accept COLOR if you want.)
In general, there are 16 colours we can use to liven up our text, but be wary because exactly how many of these colours are available depends on which MODE you are in. Due to restraints in the original micros like the Acorn BBC, different screen modes had different resolutions and, to conserve memory, different numbers of colours. To change modes you use the command MODE followed by the number of the mode you wish to invoke. Each mode has different resolutions in terms of number of columns wide, rows high and amount of colours available. For example, MODE 4 has 40 columns by 32 rows and only two colours.
There are many different screen modes available and you can find out all about them under MODE in the help files. Most of the examples here are in the default mode unless stated otherwise and so all 16 colours are available. The colours are invoked by using a number to represent each colour. The numbers are:
|Intensified Black (grey)
If you think of ink and paper, the colour of the ink is often referred to as the foreground colour and the colour of the paper is known as the background. To change the colour of the foreground, we merely call COLOUR X, where X is one of the numbers above - 0 to 15. The next time PRINT is called, the text will be printed in that colour. Easy.
When the program finishes, it leaves the foreground and background colours last selected. It's normally good etiquette to put things back as you found them, so perhaps we should modify the above to do this.
REM Foreground colour COLOUR 4 PRINT "I'm blue!" END
We can use COLOUR to change the background colour too. To do this, we add 128 to the above table and any text printed after will have the colour background given. Some programmers actually present this as a sum so it's slightly easier to read as it saves mental arithmetic. I like this but then my mental arithmetic was never too hot: it's up to you.
REM Foreground colour COLOUR 4 PRINT "I'm blue!" COLOUR 0 END
You have to use a different COLOUR statement each time you change the foreground or background.
REM Background colour COLOUR 128+6 PRINT "Hello, world" COLOUR 128+15 END
If you are changing screens in your program, you frequently want to wipe the slate clean so information from the previous screen is not interfering with the current one. BASIC has a command to do this: CLS. This stands for CLear Screen, but takes less typing. To use it is quite simple, three letters and the previous screen is consigned to history:
REM Foreground and background colour COLOUR 4 COLOUR 128+6 PRINT "Hello, world" COLOUR 0 COLOUR 128+15 END
Should we want to make the whole of the screen change colour, first set the background colour then call CLS, like this:
REM CLS demo PRINT TAB(35,10);"BBC BASIC" WAIT 200 CLS PRINT TAB(36,10);"Rules!!" END
For a mode with limited colours it is possible to use the COLOUR command and substitute the defaults with others from the above table. The default colours for mode 4 are a black background with white text. To change the text colour to magenta call COLOUR 1,5 like this:
REM Setting the screen colour COLOUR 128+7 CLS COLOUR 2 PRINT TAB(10,10);"Hello, world" COLOUR 0 END
This raises an interesting point. Each mode has a varying number of colours available. Mode 4 has two colours: 0 and 1, mode 5 has four: 0 to 3 and so on. When using COLOUR X%, the actual colour of the text may not directly correspond to the table above. Rather, each mode has a number of boxes into which one of the sixteen colours is slotted. If we don't like the colour BASIC chooses as a default for that box, we can change it for another as in the previous example. The box is referred to as the logical number whilst the colour is referred to as the physical number.
REM Setting the screen colour MODE 4 PRINT "Default colour" COLOUR 1,5 PRINT "Substituted colour" END
There are times when the default sixteen colours just aren't enough. Like when your mother just has to have Seagull Sunset Red for the bathroom. As we have just seen it is possible to make BASIC swap the colours we don't want for others from the table of sixteen, but we can also create our own and substitute these into the logical boxes. We can think of each colour for what it is: a mixture of red, green and blue and tell BASIC for colour 3 don't print yellow, print my new colour with this mix of red, green and blue. To do this, we invoke COLOUR with four parameters. The first is the colour number we wish to change, the second, third and fourth are the red, green and blue components respectively each with a range of 0 - 255. Example, to set colour 3 to orange (red = 255, green = 128, blue = 0), we would do the following:
REM Changing colours REM Change colour 3 to orange COLOUR 3,255,128,0 REM Now we've set the colour change to it COLOUR 3 PRINT "Hello, world" COLOUR 0 END
Even when the program stops, the colour will retain its new value. You can also change the colour as many times as you want, each time subsequent PRINTs will use the new colour without affecting anything previously printed with that colour index:
Once we've redefined a colour, it is quite easy to get back to the original colour for that particular box. If we are in a sixteen colour mode, just substitute the correct colour number from our little table and the default colour is restored again. For other modes, look in the help and it will tell you which are the defaults for that mode.
REM Changing colours REM Change colour 3 to orange COLOUR 3,255,128,0 REM Now we've set the colour change to it COLOUR 3 PRINT "Hello, world" REM Change colour 3 to brown COLOUR 3,128,64,0 PRINT "Hello, world" COLOUR 0 END
If you've got really carried away, changed lots of colours and now want to restore the defaults, BBC BASIC has a special command that will do just this. The command belongs to a family of commands that all affect the output to the screen in some way and are hence called VDU commands. To invoke it we type VDU and one or more numbers. The effects of the VDU command depend on the number that follows and are fully described in the help, the one we require is VDU 20. Here's how we do it:
Resetting the colours with VDU 20 also restores the default choice for the background and foreground colours.
REM Restoring colours MODE 6 REM Change colour 3 to orange COLOUR 3,255,128,0 REM Now we've set the colour change to it COLOUR 3 PRINT "Hello, world" REM Reset the colours back to the default VDU 20 REM Reselect the foreground colour COLOUR 3 PRINT "Hello, world" END
|Tip: Changing colours whilst printing
|We can embed colour commands into a string variable.
This way we can
change colours on the fly whilst printing. To do this, we use CHR$(17)
followed by CHR$(Colour_Number) before the string we want to print:
CHR$(17) in this instance acts like the COLOUR command. Obviously, these can be hard to read, so if you're using this sort of thing a lot, you can make some strings up with this information pre-declared:
1) Examine the different MODEs in the help file, try printing text in
MODEs 1 to 6 to get the feel for what they look like.
2) Modify the Changing colours program to produce new random colours by using three RND(255) statements in the call on lines 2 and 5.