QB64.com

QB64 is a modern extended BASIC programming language that retains QBasic/QuickBASIC 4.5 compatibility and compiles native binaries for Windows, Linux, and macOS.

The DRAW statement uses a STRING expression to draw lines on the screen.

Syntax

DRAW drawString$

Description

Example(s)

Placing an octagon shape DRAW across the the screen using PSET.


SCREEN 12
octagon$ = "C12 R10 F10 D10 G10 L10 H10 U10 E10"  'create a DRAW string value
SCREEN 12
FOR i% = 1 TO 11
  PSET (i% * 50, 100), 15
  _DELAY .5         ' delay for demo
  DRAW octagon$     ' DRAW the octagon using variable
  _DELAY .5         ' delay for demo 
NEXT i% 

Explanation: Once a DRAW string variable is created, it can be used to draw a shape throughout the program at any time.

Creating an analog clock’s hour markers using “TA=” + VARPTR$(angle).


SCREEN 12
FOR angle = 0 TO 360 STEP 30             ' 360/12 hour circles = 30 degrees apart  
  PSET (175, 250), 6 ' stay at center point of clock
  DRAW "TA=" + VARPTR$(angle) + "BU100" ' move invisibly to set next circle's center point
  CIRCLE STEP(0, 0), 5, 12 ' circle placed at end of blind line
  DRAW "P9, 12" ' paint inside of circle 
  SLEEP 1     ' slowed for demo only
NEXT 

Explanation: To place 12 circles in a circle each move is 30 degrees. PSET sets the center of the circular path every loop. TA moves counter-clockwise with positive degree angles. Once TA sets the angle a blind Up move is at that angle. The hour circles use the end point of the blind line as centers using the STEP relative coordinates of 0. After the circles are drawn, a draw “P” string paints the circle centers. DRAW paint strings use the last coordinate position also.

Creating a moving second hand for the clock above (SCREEN 12). (See TIME$ example 1)


DO: sec$ = RIGHT$(TIME$, 2) ' get actual seconds from TIME$ function
  degree$ = STR$(VAL(sec$) * -6) ' 60 second moves. TA uses negative angles for clockwise moves
  PSET (175, 250), 9 ' stay at clock center
  DRAW "TA" + degree$ + "U90" ' up becomes TA directional line
  DO: LOOP UNTIL RIGHT$(TIME$, 2) <> sec$ ' wait for a new second value
  IF INKEY$ <> "" THEN EXIT DO ' any key exit
  PSET (175, 250), 0 ' set at clock center to erase line
  DRAW "TA" + degree$ + "U90" ' erases old second hand line using color 0 from PSET
LOOP

Explanation: The degrees to move from the original UP line move is calculated by dividing 360/60 seconds in a full rotation. That value of 6 is made negative to use TA correctly and multiplied by the VALue of seconds from the TIME$ function. The degree angle is converted by STR$ to a string and added to the DRAW string using the STRING concatenation + operator. Do not use semicolons to create DRAW strings. Once the second hand is placed on the screen, a loop waits for the second value to change. It then erases the hand and it repeats the process again.

Creating digital displays using DRAW format strings to create the LED segments. (See SELECT CASE example 5)


SCREEN 12
DO
  LOCATE 1, 1: INPUT "Enter a number 0 to 9: ", num
  CLS
  SELECT CASE num
    CASE 0, 2, 3, 5 TO 9: PSET (20, 20), 12
      DRAW "E2R30F2G2L30H2BR5P12,12" 'top horiz
  END SELECT

  SELECT CASE num
    CASE 0, 4 TO 6, 8, 9: PSET (20, 20), 12
      DRAW "F2D30G2H2U30E2BD5P12,12" 'left top vert
  END SELECT

  SELECT CASE num
    CASE 0, 2, 6, 8: PSET (20, 54), 12
      DRAW "F2D30G2H2U30E2BD5P12, 12" 'left bot vert
  END SELECT

  SELECT CASE num
    CASE 2 TO 6, 8, 9: PSET (20, 54), 12
      DRAW "E2R30F2G2L30H2BR5P12, 12" 'middle horiz
  END SELECT

  SELECT CASE num
    CASE 0 TO 4, 7 TO 9: PSET (54, 20), 12
      DRAW "F2D30G2H2U30E2BD5P12,12" 'top right vert
  END SELECT

  SELECT CASE num
    CASE 0, 1, 3 TO 9: PSET (54, 54), 12
      DRAW "F2D30G2H2U30E2BD5P12,12" 'bottom right vert
  END SELECT

  SELECT CASE num
    CASE 0, 2, 3, 5, 6, 8: PSET (20, 88), 12
      DRAW "E2R30F2G2L30H2BR5P12,12" 'bottom horiz
  END SELECT
LOOP UNTIL num > 9 

Explanation: The DRAW strings can be used more than once with different PSET positions to create more digits.

Using 32 bit or _RGB color STR$ values when using the DRAW C text statement


SCREEN _NEWIMAGE(800, 800, 12)
PRINT _ALPHA(10), _RED(10), _GREEN(10), _BLUE(10)

SLEEP

SCREEN _NEWIMAGE(800, 800, 32) 'comment out this line to use the non-32 bit screen mode 12
PRINT _ALPHA(10), _RED(10), _GREEN(10), _BLUE(10)

PSET (400, 400), 0 ' move to 320, 240... draw will start where pset leaves off
c = 14
DIM k AS _UNSIGNED LONG
k = _RGB(80, 255, 80)
FOR repeat = 1 TO 16
  FOR p = 0 TO 359
    c = c + 1: d = c / 14
    DRAW "c" + STR$(k) + " ta" + STR$(p) + " bu " + STR$(d) + "l7 u7 r7 d7 bd " + STR$(d)
  NEXT p
NEXT repeat

Explanation: DRAW strings will ignore spaces between letters and numbers so string trimming is not necessary.

See Also