Home • News • GitHub • Wiki • Samples • InForm • GX • QBjs • Community • More...
''''''''''''''''''''''''''''''
'LFX by Jon Mark O'Connor '
' '
''''''''''''''''''''''''''''''
'Copyright (C) 1995 DOS World
'Published in Issue #20, March 1995
*****************************************************************************
LFX.BAS
by Jon Mark O'Connor
Copyright (C) 1995 DOS World
Published in Issue #20, March 1995, page 59
LFX.BAS is a lettering-effects generator that lets you vary the size of
letters, from small to gigantic; produce shadowing; and parlay QBasic's 16
colors into hundreds of different hues. The program's simplicity of design
makes it easy to create thousands of lettering effects by changing just a few
program values. If you like to dabble in QBasic, you can put LFX.BAS to work
in your own QBasic programs in a matter of minutes.
Because LFX.BAS was designed with modification in mind, you can produce
professional-looking screens quickly, by typing in the text you want to
display, indicating where to place that text on screen, choosing type size
and foreground and background colors, and deciding how much shadowing to add.
To run the program from the DOS command line, change to the directory
containing LFX.BAS, then type:
QBASIC /RUN LFX
When you run the program, the word DOS will appear in a red box in the top-
left corner of the screen. To the right of the red box is a blue box
containing the word World. The text appears in gold and has shadow, depth,
and a hint of shine in the corners of the letters. Where does the gold come
from? It's not one of the colors for screen 9. (See the accompanying table,
"Color Attributes," below.) Actually, you're seeing an effect achieved by
layering.
look at the section of LFX.BAS labeled EFFECT1 to discover how this hue is
produced. The first two lines of this section use line commands to draw
background boxes; they follow the standard syntax for filled boxes:
LINE (X1, X2)-(Y1, Y2), C, BF
where X1 is the distance (in pixels) of the box from the left edge of the
screen, X2 is the distance from the top of the screen, Y1 is the distance
from the right edge of the screen, Y2 is the distance from the bottom of the
screen, C is a color value from zero to 15, and BF indicates that the box is
filled. (If you use B instead of BF, you create the outline of a box.) In
EFFECT1, the first line command creates a long red rectangle, and the second
one superimposes a smaller, blue rectangle on the red one, leaving a red
border two pixels wide on three sides.
The next six lines of the program assign variables:
WORD$ is the word or string you want to embellish.
SPACING$ is the amount of space you want to place between words. Used in
small sizes, the letterset designed for LFX.BAS is spaced properly, but when
you use large letters, you must decrease the space between the letters.
Ln tells the program to move left by n spaces; Rn tells the program to move
right by n spaces. To maintain the original spacing, use L0 and R0.
SIZE$ is the size of the letters. The value you specify must be a multiple of
4; you may increase the value to roughly half the size of your screen's
horizontal resolution. (In screen 9, the display is 640 pixels wide and 350
pixels high.) Multiples other than 4 skew the letters. Because the subroutine
LAYER1 employs extensive shadowing, using a size value smaller than 12 will
probably produce unattractive results. For smaller letter sizes, use the
program's NORMAL0 and NORMAL1 subroutines.
DOT$ handles special circumstances that arise with the letters i and j. When
you combine a small size value and shadowing, the dots over these letters
disappear. Because the text displayed in EFFECT1 doesn't include either of
these letters, DOT$ is set to N (for no dot). Later on, if you want to use
EFFECT1 to display some text that includes an i or a j, change N to Y.
BGC is the color of the background on which WORD$ is placed. Without this
line, the listing's PSET commands produce unwanted colored blobs at the
beginning of words.
At this point, the program has the information it needs to change DOS World
into a long drawing sequence.
When the CALL TRANSLATE line executes, control jumps to the TRANSLATION
subroutine, and conversion takes place. When control returns to the main
program, the next line of EFFECT1 establishes the colors used to create the
gold lettering and shadowing: yellow, white (gray), black, and light black
(dark gray).
Blending colors produces interesting hues. For example, if you place a light-
red line next to a light-magenta line, you'll see pink on screen. If you
change C1$ to "C15", WORD$ is displayed in silver instead of gold. As you
experiment, you'll find that some colors blend well and others don't.
Just for Effect
---------------
The message DOS World is in a DRAW command, you've chosen the colors, and now
it's time to display the message on screen--at varying locations and in
varying colors, to give the illusion of depth.
EFFECT1 works its magic by including four calls to the drawing subroutine
LAYER1. Each time through, LAYER1 executes 12 PSET commands, each of which
begins drawing at a different screen location.
Keep in mind that the coordinates for the pixel in the upper-left corner are
(0,0). So, when the starting positions for PFT and PFL are
52 and 13, respectively, they're 53 pixels from the top and 14 pixels from
the left.
The first four commands in LAYER1 use C3$, black, to produce four renditions
of the text in black. These renditions overlap, producing a shadowing effect.
The use of gray in the fifth line adds more depth to the shadow.
This same multilayer approach enhances the appearance of the gold lettering:
three renditions of the text--two in yellow and one in white--overlap to give
the words both height and depth.
But maybe you don't care for gold, or you'd like a little less shadow. No
problem. Just set different background colors, combine various foreground
colors, experiment with the values of PFL and PFT, use more or fewer calls to
LAYER1, or include more or fewer PSET commands.
Remember, though: If you add too many shadows, the letters of your text will
overlap, unless you increase the value of SPACING$.
Try adding REM statements before all but one of the call LAYER1 or PSET
lines, to get a sense of how that line affects the final appearance of the
text. Repeat the procedure with other lines.
Sometimes, making a slight change in PFT or PFL produces unexpectedly good
results, which you can then capitalize on.
Shadowing is also very important, as the rendition of Sugar's Shack (EFFECT4)
demonstrates. Often, words that look plain are greatly improved by the
addition of a series of shadows placed one or two pixels to the left or right
of the main word. Be sure, however, to place the commands that draw shadows
before the ones that draw the text so that the shadows remain in the
background.
If you're not sure whether a particular color is adding anything to the
overall effect, change the color to something else. It isn't always apparent,
for example, whether COLOR 8 is enhancing the appearance of a shadow. To find
out, change the color value to 14. If you see yellow lines, you know that the
original color is having an impact, and you may then change the color setting
back to 8.
Before you jump into creating full-screen displays, such as menus, consider
the speed of your computer. On a 25MHz 386 or a slower system, displaying a
full screen of special effects might take a few seconds. If neither you nor
your clients or friends mind a delay of that length, then by all means go
ahead with the project. If you don't want the user to see the effect being
drawn, add the command SCREEN 9, 9, 0, 1 at the beginning of the display
process and SCREEN 9, 9, 1, 0 at the end. This flashes the display on the
screen.
If you're not partial to either of those display methods, try using a SCREEN
12 command to produce your effects at a higher resolution.
Choices, choices, choices--LFX.BAS gives you a lot of them. But isn't that
one of the great things about programming? You control the final effects.
COLOR ATTRIBUTES
VALUE COLOR VALUE COLOR
----- ----- ----- -----
0 black 8 light black (dark gray)
1 blue 9 light blue
2 green 10 light green
3 cyan 11 light cyan
4 red 12 light red (orange)
5 magenta 13 light magenta
6 brown 14 yellow
7 white (gray) 15 high-intensity white
Please note that QBjs is still in early development and support for these examples is extremely experimental (meaning will most likely not work). With that out of the way, give it a try!