GET (graphics statement)
The GET statement is used in graphics to store a box area image of the screen into an INTEGER array.
- QB64 can manipulate parts of an image using _PUTIMAGE. For that reason, GET isn't recommended practice anymore and is supported to maintain compatibility with legacy code.
- GET [STEP] (column1, row1)-[STEP](column2, row2), array([index])[, offscreenColor]
- column and row INTEGER coordinates for the box area must be on the screen except when using an offscreenColor.
- INTEGER array sizes must be large enough (use width * height of the box area + 4) to hold the data or an error will occur.
- The array index offset is optional. If the offset is zero the brackets may be empty.
- The offscreenColor pixels will be returned as the designated color when part of an image is off screen.
- The STEP keyword can be used to for coordinates relative to the last graphic coordinates used.
- A graphic screen mode must be used. See the SCREEN statement for graphic screen dimensions.
- QB64 GET statements can use coordinates off of the screen when an 'offscreenColor is designated. STEP can be used for relative coordinates.
- The GET box coordinates are set just like a LINE box statement is placed. You can use a box to find the correct GET area.
- Once GET has placed the pixel image data in the array, PUT the image or BSAVE it to a file.
- Once the image is stored in an array PUT can be used to place the image on the screen.
- A _SOURCE handle can be set to GET image areas other than the ones on the current screen. Use _DEST to PUT images there.
- To GET more than one image to the same array, designate an offset index that is not being used and is large enough to hold the data.
- The INTEGER array size can be calculated as slightly larger than the box area width times the height. A closer estimate can be done by reading the array indices from UBOUND to LBOUND after a GET of a white box area. In QB64, a LONG array can be used for large or full screen images.
- RGB color settings can be embedded at the beginning of the array for transferring custom colors. Specify an index for GET image data to be stored after any extra information added to the beginning of the array.
- In QB64, _PUTIMAGE is recommended over PUT as it can also do the GET operation directly from the image source without requiring an array.
- PUT and GET file statements can also write and read image array data using BINARY files instead of using BSAVE or BLOAD.
- SCREEN 12 could only GET 1/3 of a full SCREEN 12 image. Rows would increment 160 each GET. QB64 can save entire screen at once.
Example 1: How to use GET and PUT to move a sprite with the arrow keys.
DEFINT A-Z DIM BG(300), Box(300), SC(127) ' BG holds background images. Box holds the Box image. SCREEN 13 ' graphic coordinate minimums are 0 to 319 column or 199 row maximums. ' set up screen background COLOR 4: LOCATE 10, 5: PRINT "Multikey Keyboard input routine" COLOR 10: LOCATE 12, 4: PRINT "Use the arrow keys to move the box." LOCATE 13, 4: PRINT "Note that you can press two or more" LOCATE 14, 4: PRINT "keys at once for diagonal movement!" COLOR 14: LOCATE 16, 4: PRINT " Also demonstrates how GET and PUT " LOCATE 17, 4: PRINT "are used to preserve the background." COLOR 11: LOCATE 20, 11: PRINT "Press [Esc] to quit" x = 150: y = 50: PX = x: PY = y ' actual box starting position GET (x, y)-(x + 15, y + 15), BG ' GET original BG at start box position LINE (x, y)-(x + 15, y + 15), 9, BF ' the plain blue box to move GET (x, y)-(x + 15, y + 15), Box ' GET to Box Array DO 'main loop t! = TIMER + .05 DO ' 1 Tick (1/18th second) keypress scancode read loop a$ = INKEY$ ' So the keyboard buffer won't get full code% = INP(&H60) ' Get keyboard scan code from port 96 IF code% < 128 THEN SC(code%) = 1 ELSE SC(code% - 128) = 0 'true/false values to array LOOP UNTIL TIMER > t!' loop until one tick has passed PX = x: PY = y ' previous coordinates IF SC(75) = 1 THEN x = x - 5: IF x < 0 THEN x = 0 IF SC(77) = 1 THEN x = x + 5: IF x > 304 THEN x = 304 IF SC(72) = 1 THEN y = y - 5: IF y < 0 THEN y = 0 IF SC(80) = 1 THEN y = y + 5: IF y > 184 THEN y = 184 IF x <> PX OR y <> PY THEN ' look for a changed coordinate value WAIT 936, 8: PUT(PX, PY), BG, PSET ' replace previous BG first GET (x, y)-(x + 15, y + 15), BG ' GET BG at new position before box is set PUT(x, y), Box, PSET ' PUT box image at new position END IF LOOP UNTIL SC(1) = 1 ' main loop until [Esc] key (scan code 1) is pressed
DIM img(20 * 20 + 4) AS INTEGER 'create img% array to hold 20 by 20 image data a& = _NEWIMAGE(800, 600, 13) 'larger surface a& emulates screen 13 colors & resolution SCREEN 13 'program screen 13 _DEST a& 'set desination as the image page a& CIRCLE (700, 300), 10, 10 'draw green circle on image page _SOURCE a& 'set source as image page a& GET (690, 290)-(710, 310), img() 'GET a square screen area similar to a LINE Box. _DEST 0 'set destination as the program screen PUT (100, 100), img() 'PUT the Top Left Corner of box area to pixel 100, 100
- _PUTIMAGE, _LOADIMAGE
- PUT, STEP
- BSAVE, BLOAD
- Scancodes, Creating Sprite Masks (for non-box shaped sprites)
- Bitmaps, GET and PUT Demo