forked from QB64-Phoenix-Edition/QB64pe
-
Notifications
You must be signed in to change notification settings - Fork 0
GET (graphics statement)
Samuel Gomes edited this page Nov 8, 2022
·
1 revision
The GET (graphics statement) 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 arrays 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 (graphics statement) 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 (graphics statement) 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 (graphics statement) 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 (graphics statement) 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.
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
How to GET graphics from an image other than the present screen using _SOURCE and _DESTination.
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
Notes: A _LOADIMAGE handle could also be used as a _SOURCE to GET a portion or all of an image file.
- _PUTIMAGE, _LOADIMAGE
- _MAPTRIANGLE
- PUT (graphics statement), STEP
- BSAVE, BLOAD
- Scancodes, Creating Sprite Masks (for non-box shaped sprites)
- Bitmaps, GET and PUT Demo