DISPLAY: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 19: Line 19:
''Example 1:'' Displaying a circle bouncing around the screen.
''Example 1:'' Displaying a circle bouncing around the screen.
{{CodeStart}}
{{CodeStart}}
{{Cl|SCREEN (statement)|SCREEN}} 12
{{Cl|SCREEN}} {{Text|12|#F580B1}}
x = 21: y =31             'start position
x = {{Text|21|#F580B1}}: y = {{Text|31|#F580B1}} {{Text|<nowiki>'start position</nowiki>|#919191}}
dx = 3: dy = 3             'number of pixel moves per loop
dx = {{Text|3|#F580B1}}: dy = {{Text|3|#F580B1}} {{Text|<nowiki>'number of pixel moves per loop</nowiki>|#919191}}
{{Cl|DO}}
{{Cl|DO}}
     {{Cl|_LIMIT}} 100       ' set to 100 frames per second
     {{Cl|_LIMIT}} {{Text|100|#F580B1}} {{Text|<nowiki>' set to 100 frames per second</nowiki>|#919191}}
     x = x + dx: y = y + dy
     x = x + dx: y = y + dy
     {{Cl|IF...THEN|IF}} x < 0 {{Cl|OR}} x > 640 {{Cl|THEN}} dx = -dx 'limit columns and reverse column direction each side
     {{Cl|IF}} x < {{Text|0|#F580B1}} {{Cl|OR (boolean)|OR}} x > {{Text|640|#F580B1}} {{Cl|THEN}} dx = -dx {{Text|<nowiki>'limit columns and reverse column direction each side</nowiki>|#919191}}
     {{Cl|IF...THEN|IF}} y < 0 {{Cl|OR}} y > 480 {{Cl|THEN}} dy = -dy 'limit rows and reverse row direction top or bottom
     {{Cl|IF}} y < {{Text|0|#F580B1}} {{Cl|OR (boolean)|OR}} y > {{Text|480|#F580B1}} {{Cl|THEN}} dy = -dy {{Text|<nowiki>'limit rows and reverse row direction top or bottom</nowiki>|#919191}}
     IF px <> x OR py <> y THEN FOR d = 1 to 20: CIRCLE (px, py), d, 0: NEXT 'erase
     {{Cl|IF}} px <> x {{Cl|OR (boolean)|OR}} py <> y {{Cl|THEN}} {{Cl|FOR}} d = {{Text|1|#F580B1}} {{Cl|TO}} {{Text|20|#F580B1}}: {{Cl|CIRCLE}} (px, py), d, {{Text|0|#F580B1}}: {{Cl|NEXT}} {{Text|<nowiki>'erase</nowiki>|#919191}}
     FOR c = 1 TO 20: {{Cl|CIRCLE}} (x, y), c, 6: NEXT 'draw new circle at new position
     {{Cl|FOR}} c = {{Text|1|#F580B1}} {{Cl|TO}} {{Text|20|#F580B1}}: {{Cl|CIRCLE}} (x, y), c, {{Text|6|#F580B1}}: {{Cl|NEXT}} {{Text|<nowiki>'draw new circle at new position</nowiki>|#919191}}
     px = x: py = y       'save older coordinates to erase older circle next loop
     px = x: py = y {{Text|<nowiki>'save older coordinates to erase older circle next loop</nowiki>|#919191}}
     {{Cl|_DISPLAY}}               'after new circle is set, show it
     {{Cl|_DISPLAY}} {{Text|<nowiki>'after new circle is set, show it</nowiki>|#919191}}
{{Cl|LOOP}} {{Cl|UNTIL}} {{Cl|INKEY$}} = CHR$(27)
{{Cl|DO...LOOP|LOOP UNTIL}} {{Cl|INKEY$}} = {{Cl|CHR$}}({{Text|27|#F580B1}})
{{CodeEnd}}
{{CodeEnd}}
:''Explanation:'' The loop is set with [[_LIMIT]] to 100 frames per second to limit CPU usage and the speed of the ball. Each loop a circle is drawn while the previous one is erased when the coordinates change. _DISPLAY only shows the new circle position once each loop. The '''_DISPLAY''' routine eliminates the need for setting [[SCREEN]] swap pages, [[CLS]] and [[PCOPY]]. _DISPLAY keeps the image off of the screen until the changes have all completed. Drawing 40 circles every loop helps slow down the ball.


:''Explanation:'' The loop is set with [[_LIMIT]] to 100 frames per second to limit CPU usage and the speed of the ball. Each loop a circle is drawn while the previous one is erased when the coordinates change. _DISPLAY only shows the new circle position once each loop. The '''_DISPLAY''' routine eliminates the need for setting [[SCREEN (statement)|SCREEN]] swap pages, [[CLS]] and [[PCOPY]]. _DISPLAY keeps the image off of the screen until the changes have all completed. Drawing 40 circles every loop helps slow down the ball.
----
 


''Example 2:'' [[_DISPLAY]] must be used to render hardware images placed with [[_PUTIMAGE]] ('''version 1.000 and up''').
''Example 2:'' [[_DISPLAY]] must be used to render hardware images placed with [[_PUTIMAGE]] ('''version 1.000 and up''').
{{CodeStart}}
{{CodeStart}}
{{Cl|CONST}} MenuHeight = 200
{{Cl|CONST}} MenuHeight = {{Text|200|#F580B1}}




{{Cl|SCREEN}} {{Cl|_NEWIMAGE}}(640, 480, 32)
{{Cl|SCREEN}} {{Cl|_NEWIMAGE}}({{Text|640|#F580B1}}, {{Text|480|#F580B1}}, {{Text|32|#F580B1}})
'{{Cl|SLEEP}} 1
{{Text|<nowiki>'SLEEP 1</nowiki>|#919191}}
{{Cl|LOCATE}} 20
{{Cl|LOCATE}} {{Text|20|#F580B1}}
DO
{{Cl|DO}}
     {{Cl|_LIMIT}} 30
     {{Cl|_LIMIT}} {{Text|30|#F580B1}}
     DisplayMenu
     {{Text|DisplayMenu|#55FF55}}
     k = {{Cl|_KEYHIT}}
     k = {{Cl|_KEYHIT}}
     {{Cl|IF...THEN|IF}} k <> 0 {{Cl|THEN}} {{Cl|PRINT}} k,
     {{Cl|IF}} k <> {{Text|0|#F580B1}} {{Cl|THEN}} {{Cl|PRINT}} k,
{{Cl|LOOP}} {{Cl|UNTIL}} k = 32 {{Cl|OR (boolean)|OR}} k = 27
{{Cl|DO...LOOP|LOOP UNTIL}} k = {{Text|32|#F580B1}} {{Cl|OR (boolean)|OR}} k = {{Text|27|#F580B1}}




{{Cl|SUB}} DisplayMenu
{{Cl|SUB}} {{Text|DisplayMenu|#55FF55}}
{{Cl|STATIC}} init, MS_HW {{Cl|AS}} {{Cl|LONG}}
    {{Cl|STATIC}} init, MS_HW {{Cl|AS}} {{Cl|LONG}}
{{Cl|IF...THEN|IF}} {{Cl|NOT}} init {{Cl|THEN}}
    {{Cl|IF}} {{Cl|NOT}} init {{Cl|THEN}}
    init = -1
        init = {{Text|-1|#F580B1}}
    MS = {{Cl|_NEWIMAGE}}(640, MenuHeight, 32) 'MenuScreen image
        MS = {{Cl|_NEWIMAGE}}({{Text|640|#F580B1}}, MenuHeight, {{Text|32|#F580B1}}) {{Text|<nowiki>'MenuScreen image</nowiki>|#919191}}
    D = {{Cl|_DEST}}: {{Cl|_DEST}} MS
        D = {{Cl|_DEST (function)|_DEST}}: {{Cl|_DEST}} MS
    {{Cl|CLS}} , {{Cl|&H}}FFAAAAAA 'background color gray
        {{Cl|CLS}} , {{Text|&HFFAAAAAA|#F580B1}} {{Text|<nowiki>'background color gray</nowiki>|#919191}}
    {{Cl|_PRINTSTRING}} (20, 2), "Menu Test" 'image text
        {{Cl|_PRINTSTRING}} ({{Text|20|#F580B1}}, {{Text|2|#F580B1}}), {{Text|<nowiki>"Menu Test"</nowiki>|#FFB100}} {{Text|<nowiki>'image text</nowiki>|#919191}}
    MS_HW = {{Cl|_COPYIMAGE}}(MS, 33) 'create the MenuScreen_HardWare image
        MS_HW = {{Cl|_COPYIMAGE}}(MS, {{Text|33|#F580B1}}) {{Text|<nowiki>'create the MenuScreen_HardWare image</nowiki>|#919191}}
    {{Cl|_FREEIMAGE}} MS
        {{Cl|_FREEIMAGE}} MS
    {{Cl|_DEST}} D
        {{Cl|_DEST}} D
{{Cl|END IF}}
    {{Cl|END IF}}
{{Cl|_PUTIMAGE}} (0, 0)-(640, MenuHeight), MS_HW
    {{Cl|_PUTIMAGE}} ({{Text|0|#F580B1}}, {{Text|0|#F580B1}})-({{Text|640|#F580B1}}, MenuHeight), MS_HW
{{Cl|_DISPLAY}}
    {{Cl|_DISPLAY}}
{{Cl|END SUB}}
{{Cl|END SUB}}
{{CodeEnd}}{{small|Code adapted by Galleon}}
{{CodeEnd}}
{{Small|Code adapted by Galleon}}
: ''Notes:'' When _DISPLAY is commented out, the hardware Menu Test screen portion will blink and key codes may be seen underneath.
: ''Notes:'' When _DISPLAY is commented out, the hardware Menu Test screen portion will blink and key codes may be seen underneath.



Latest revision as of 10:33, 24 March 2023

The _DISPLAY statement turns off the automatic display while only displaying the screen changes when called.


Syntax

_DISPLAY


Description

  • _DISPLAY turns off the auto refresh screen default _AUTODISPLAY behavior. Prevents screen flickering.
  • Call _DISPLAY each time the screen graphics are to be displayed. Place call after the image has been changed.
  • Re-enable automatic display refreshing by calling _AUTODISPLAY. If it isn't re-enabled, things may not be displayed later.
  • _DISPLAY tells QB64 to render all of the hardware _PUTIMAGE commands loaded into the buffer previously.
  • The _AUTODISPLAY (function) can be used to detect the current display behavior.
  • QB64 can set the graphic rendering order of _SOFTWARE, _HARDWARE, and _GLRENDER with _DISPLAYORDER.


Examples

Example 1: Displaying a circle bouncing around the screen.

SCREEN 12
x = 21: y = 31 'start position
dx = 3: dy = 3 'number of pixel moves per loop
DO
    _LIMIT 100 ' set to 100 frames per second
    x = x + dx: y = y + dy
    IF x < 0 OR x > 640 THEN dx = -dx 'limit columns and reverse column direction each side
    IF y < 0 OR y > 480 THEN dy = -dy 'limit rows and reverse row direction top or bottom
    IF px <> x OR py <> y THEN FOR d = 1 TO 20: CIRCLE (px, py), d, 0: NEXT 'erase
    FOR c = 1 TO 20: CIRCLE (x, y), c, 6: NEXT 'draw new circle at new position
    px = x: py = y 'save older coordinates to erase older circle next loop
    _DISPLAY 'after new circle is set, show it
LOOP UNTIL INKEY$ = CHR$(27)
Explanation: The loop is set with _LIMIT to 100 frames per second to limit CPU usage and the speed of the ball. Each loop a circle is drawn while the previous one is erased when the coordinates change. _DISPLAY only shows the new circle position once each loop. The _DISPLAY routine eliminates the need for setting SCREEN swap pages, CLS and PCOPY. _DISPLAY keeps the image off of the screen until the changes have all completed. Drawing 40 circles every loop helps slow down the ball.

Example 2: _DISPLAY must be used to render hardware images placed with _PUTIMAGE (version 1.000 and up).

CONST MenuHeight = 200


SCREEN _NEWIMAGE(640, 480, 32)
'SLEEP 1
LOCATE 20
DO
    _LIMIT 30
    DisplayMenu
    k = _KEYHIT
    IF k <> 0 THEN PRINT k,
LOOP UNTIL k = 32 OR k = 27


SUB DisplayMenu
    STATIC init, MS_HW AS LONG
    IF NOT init THEN
        init = -1
        MS = _NEWIMAGE(640, MenuHeight, 32) 'MenuScreen image
        D = _DEST: _DEST MS
        CLS , &HFFAAAAAA 'background color gray
        _PRINTSTRING (20, 2), "Menu Test" 'image text
        MS_HW = _COPYIMAGE(MS, 33) 'create the MenuScreen_HardWare image
        _FREEIMAGE MS
        _DEST D
    END IF
    _PUTIMAGE (0, 0)-(640, MenuHeight), MS_HW
    _DISPLAY
END SUB
Code adapted by Galleon
Notes: When _DISPLAY is commented out, the hardware Menu Test screen portion will blink and key codes may be seen underneath.


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link