Programming the Arts
Ever fancied writing your own art package? Well in
this tutorial I am going to show you how to program a few
options that you would normally find in an art package. I
have written a full art package called Grafix Art and the
routines printed here are taken straight from it.
First off all, this is the routine for the normal
freehand draw tool.
4410 rem DRAW
4420 hide on : off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : show
on : K=1
4430 set mark 1,1
4440 wait 10 : repeat
4450 X=x mouse : Y=y mouse
4460 if hardkey=97 then hide : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : fastcopy
logic,back : show
4470 until mouse key=1 or mouse key=2
4480 hide on : SCR$(SC)=screen$(logic,0,0 to 330,200)
4490 if mouse key=2 then hide on : wait 10 : goto 230
4500 if mouse key=1 then polymark X,Y
4520 repeat
4540 X=x mouse : Y=y mouse
4550 if mouse key=1 then polyline to X,Y
4560 until mouse key=0
4570 fastcopy logic,back
4580 show on : goto 4440
In other STOS art packages people have tried using the
PLOT command for this routine. However this causes the
line to draw broken. What happens here is we use
polymarks to make the lines. The opaque command is from
the EXTRA extension and what it does is places an image
in a string put there using SCREEN$ onto the screen as a
normal screen copy and not merged. In an art package we
have workscreens to place our picture in so we can design
so many different pictures at a time and flick through
them. The routine starts by waiting for the user to click
the left mouse button before it will draw a polymark. The
right mouse button allows you to abort the operation.
This next routine will draw a continuous line.
4590 rem LINE
4600 off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : K=1
: set line val(LTYPE$),L_SIZE,0,0 : show on
4610 clear key : wait 10 : repeat
4620 X=x mouse : Y=y mouse : M=mouse key : K$=inkey$
4630 if asc(K$)=0 and scancode=97 then hide : opaque
screen logic,0,0,SCR$(SC) : fastcopy logic,back : show
4640 wait vbl : until M
4650 if M=2 then hide on : wait 10 :
SCR$(SC)="" : SCR$(SC)=screen$(logic,0,0 to
330,200) : cls : goto 200
4660 Y1=Y : X1=X : hide on : SCR$(SC)="" :
SCR$(SC)=screen$(logic,0,0 to 330,200)
4670 logic=back : wait 10 : repeat
4680 opaque screen back,0,0,SCR$(SC) : polyline X,Y to
X1,Y1
4690 X1=x mouse : Y1=y mouse
4700 if mouse key=2 then logic=physic : wait 10 : cls :
goto 200
4710 screen swap : wait vbl
4720 until mouse key=1
4730 logic=physic
4740 show on : goto 4610
You'll notice in these routines that we have implanted
an UNDO feature. This means that if you are not happy
with the last thing you have done you can erase it from
screen before you carry on. Note that the routine will
put the current picture into a screen with SCREEN$. This
is your present workscreen.
Drawing a box is easy as well, here is the routine.
4750 rem BOX
4760 off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : K=1
: set line val(LTYPE$),L_SIZE,0,0 : show on
4770 wait 10 : repeat
4780 X=x mouse : Y=y mouse : wait vbl
4790 if hardkey=97 then hide : opaque screen
logic,0,0,SCR$(SC) : fastcopy logic,back : show
4800 M=mouse key : until M
4810 Y1=Y : X1=X : hide on : SCR$(SC)="" :
SCR$(SC)=screen$(logic,0,0 to 330,200)
4820 if M=2 then hide on : wait 10 : cls : goto 200
4830 logic=back : repeat
4840 opaque screen back,0,0,SCR$(SC) : box X,Y to X1,Y1
4850 X1=x mouse : Y1=y mouse
4860 screen swap : wait vbl
4870 until mouse key
4880 if mouse key=2 then logic=physic : wait 10 : cls :
goto 200
4890 logic=physic : fastcopy logic,back
4900 show on : goto 4770
You can also alter the routine to draw a rounded box
just by changing the command BOX to RBOX.
Something a little more interesting......a triangle.
4910 rem TRIANGLE SHAPE
4920 off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : K=1
: set line val(LTYPE$),L_SIZE,0,0 : show on
4930 repeat
4940 X=x mouse : Y=y mouse
4950 if hardkey=97 then hide : opaque screen
logic,0,0,SCR$(SC) : fastcopy logic,back : show
4960 wait vbl : M=mouse key : until mouse key : hide on
4970 X1=X : Y1=Y : SCR$(SC)="" :
SCR$(SC)=screen$(logic,0,0 to 330,200) : logic=back :
wait 10
4980 if M=2 then logic=physic : wait 10 : cls : goto 200
4990 repeat
5000 opaque screen logic,0,0,SCR$(SC) : X1=x mouse : Y1=y
mouse
5010 polyline X,Y to X1,Y1 to X,Y to X,Y
5020 screen swap : wait vbl
5030 until mouse key
5040 if mouse key=2 then logic=physic : wait 10 : cls :
goto 200
5050 wait 10 : repeat
5060 opaque screen logic,0,0,SCR$(SC) : X2=x mouse : Y2=y
mouse
5070 polyline X,Y to X1,Y1 to X2,Y2 to X,Y
5080 screen swap : wait vbl
5090 until mouse key
5100 if mouse key=2 then logic=physic : wait 10 : cls :
goto 200
5110 wait 10 : logic=physic : fastcopy logic,back : show
on : goto 4930
The first part of the routine draws the first angle of
the triangle and the second part draws the rest of it.
And now, an elipse type circle.
5120 rem CIRCLE
5130 off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : show
on : K=1
5140 repeat
5150 X=x mouse : Y=y mouse
5160 if hardkey=97 then hide : opaque screen
logic,0,0,SCR$(SC) : fastcopy logic,back : show
5170 wait vbl : M=mouse key : until M
5180 if M=2 then hide on : wait 10 :
SCR$(SC)="" : SCR$(SC)=screen$(logic,0,0 to
330,200) : cls : goto 200
5190 hide on : logic=back : wait 10
5200 SCR$(SC)="" : SCR$(SC)=screen$(logic,0,0
to 330,200)
5210 repeat
5220 opaque screen logic,0,0,SCR$(SC) : X1=x mouse : Y1=y
mouse
5230 earc X,Y,abs(X1-X),abs(Y1-Y),0,3600
5240 screen swap : wait vbl
5250 until mouse key
5260 if mouse key=2 then logic=physic : wait 10 : cls :
goto 200
5270 logic=physic : fastcopy logic,back : show on : wait
10 : goto 5140
The ABS command stops the circle from drawing inwards.
No picture is complete without a bit of colour. This
routine will fill an area of screen with the current ink
and pattern number, which can be altered with the SET
PAINT and INK commands.
5280 rem FILL SHAPE
5290 off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : show
on : set paint 2,PSTYLE,1 : K=1
5300 repeat
5310 if mouse key=1 then hide : paint x mouse,y mouse :
show
5320 if hardkey=97 then hide : opaque screen
logic,0,0,SCR$(SC) : fastcopy logic,back : show
5330 wait vbl : until mouse key=2
5340 hide on : SCR$(SC)="" :
SCR$(SC)=screen$(logic,0,0 to 330,200) : wait 10 : cls :
goto 200
Another interesting tool is the RAYS effect.
5350 rem RAYS
5360 off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : K=1
: set line val(LTYPE$),L_SIZE,0,0 : show on : wait 10
5370 repeat
5380 X=x mouse : Y=y mouse : wait vbl
5390 M=mouse key : until M
5400 Y1=Y : X1=X : hide on : SCR$(SC)="" :
SCR$(SC)=screen$(logic,0,0 to 330,200)
5410 if M=2 then hide on : wait 10 : cls : goto 200
5420 logic=back : repeat
5430 X1=x mouse : Y1=y mouse
5440 opaque screen back,0,0,SCR$(SC) : polyline X,Y to
X1,Y1
5450 if mouse key=2 then logic=physic : wait 10 : cls :
goto 200
5460 screen swap : wait vbl
5470 until mouse key=1
5480 logic=physic : polyline X,Y to X1,Y1 :
SCR$(SC)="" : SCR$(SC)=screen$(logic,0,0 to
330,200) : wait 2 : goto 5420
A K line is like a normal line except that it does not
stop drawing itself when you reclick the mouse button.
Here is the routine......
5490 rem K-LINE
5500 off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : K=1
: set line val(LTYPE$),L_SIZE,0,0 : show on
5510 repeat
5520 X=x mouse : Y=y mouse : wait vbl
5530 M=mouse key : until M : wait 10
5540 Y1=Y : X1=X : hide on : SCR$(SC)="" :
SCR$(SC)=screen$(logic,0,0 to 330,200)
5550 if M=2 then goto 200
5560 logic=back : repeat
5570 opaque screen back,0,0,SCR$(SC) : polyline X,Y to
X1,Y1
5580 X1=x mouse : Y1=y mouse
5590 if mouse key=2 then logic=physic : wait 10 : cls :
goto 200
5600 screen swap : wait vbl
5610 until mouse key=1
5620 logic=physic : polyline X,Y to X1,Y1 :
SCR$(SC)="" : SCR$(SC)=screen$(logic,0,0 to
330,200) : wait 2 : X=X1 : Y=Y1 : goto 5560
Two more interesting tools are the SPRAY and BRUSH.
6010 rem SPRAY
6020 off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : show
on : K=1 : wait 10
6030 repeat
6040 K$=inkey$ : X=x mouse+4 : Y=y mouse+4 : wait vbl
6050 if hardkey=97 then hide : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : show
6060 if mouse key=0 then show on
6070 M=mouse key : until M : hide on :
SCR$(SC)="" : SCR$(SC)=screen$(logic,0,0 to
330,200) : wait vbl
6080 if M=1 and X>=SIZE and X<=319-SIZE and
Y>=SIZE and Y<=199-SIZE then plot
X+rnd(SIZE),Y+rnd(SIZE) : plot X-rnd(SIZE),Y-rnd(SIZE) :
plot X+rnd(SIZE),Y-rnd(S
IZE) : plot X-rnd(SIZE),Y+rnd(SIZE)
6090 if SPEED>0 and M=1 then wait SPEED
6100 if M=2 then SCR$(SC)="" :
SCR$(SC)=screen$(logic,0,0 to 330,200) : wait 10 : cls :
goto 200
6110 if mouse key=0 then show on
6120 goto 6030
6180 rem BRUSH
6190 hide on : off : cls : ink PE-1 : opaque screen
back,0,0,SCR$(SC) : fastcopy back,logic : wait vbl : wait
10 : K=1 : show on
6200 repeat
6210 XM=x mouse : YM=y mouse
6220 if hardkey=97 then off : opaque screen
logic,0,0,SCR$(SC) : fastcopy logic,back
6230 if M=1 and XM+BRUSH<320 and YM+BRUSH<200 then
hide on : bar XM,YM to XM+BRUSH,YM+BRUSH else show on
6240 M=mouse key : until M=2
6250 if M=2 then hide on : wait 10 :
SCR$(SC)="" : SCR$(SC)=screen$(logic,0,0 to
330,200) : cls : goto 200
6260 goto 6200
These are some of the more common tools used in an art
package.
There are more interesting features like MAGNIFY and
RESIZE and all kinds of effects. But with these simple
routines and a bit of imagination there is no reason why
you can't write your very own art package in STOS.
|