PCOPY - mkilgore/QB64pe GitHub Wiki
The PCOPY statement copies one source screen page to a destination page in memory.
- PCOPY sourcePage%, destinationPage%
- sourcePage% is an image page in video memory.
- destinationPage% is the video memory location to copy the source image to.
- The working page is set as 0. All drawing occurs there.
- The visible page is set as any page number that the SCREEN mode allows.
- The _DISPLAY (function) return can be used a page number reference in QB64 (See Example 1).
- The QB64 _DISPLAY statement can also be used to stop screen flicker without page flipping or CLS and is the recommended practice.
- sourcePage% and destinationPage% numbers are limited by the SCREEN mode used. In QB64, the same limits don't apply.
Example 1: Creating a mouse cursor using a page number that you create in memory without setting up page flipping.
SCREEN (statement) _NEWIMAGE(640, 480, 32) 'any graphics mode should work without setting up pages _MOUSEHIDE SetupCursor PRINT "Hello World!" DO: _LIMIT 30 DO WHILE _MOUSEINPUT: LOOP 'main loop must contain _MOUSEINPUT ' other program code LOOP SUB SetupCursor ON TIMER(n)(0.02) UpdateCursor TIMER ON END SUB SUB UpdateCursor PCOPY _DISPLAY (function), 100 'any page number as desination with the _DISPLAY function as source PSET (_MOUSEX, _MOUSEY), _RGB(0, 255, 0) DRAW "ND10F10L3F5L4H5L3" _DISPLAY 'statement shows image PCOPY 100, _DISPLAY (function) 'function return as destination page END SUB '' '' |
- Note: Works with _DISPLAY (function) as the other page. If mouse reads are not crucial, put the _MOUSEINPUT loop inside of the UpdateCursor Sub.
'' '' SCREEN (statement) 7, 0, 1, 0 DIM x(10), y(10), dx(10), dy(10) FOR...NEXT a = 1 TO 10 x(a) = INT(RND * 320) + 1 y(a) = INT(RND * 200) + 1 dx(a) = (RND * 2) - 1 dy(a) = (RND * 2) - 1 NEXT DO...LOOP PCOPY 1, 0 'place image on the visible page 0 CLS _LIMIT 100 'regulates speed of balls in QB64 FOR...NEXT a = 1 TO 10 CIRCLE(x(a), y(a)), 5, 15 'all erasing and drawing is done on page 1 x(a) = x(a) + dx(a) y(a) = y(a) + dy(a) IF...THEN x(a) > 320 THEN dx(a) = -dx(a): x(a) = x(a) - 1 IF...THEN x(a) < 0 THEN dx(a) = -dx(a): x(a) = x(a) + 1 IF...THEN y(a) > 200 THEN dy(a) = -dy(a): y(a) = y(a) - 1 IF...THEN y(a) < 0 THEN dy(a) = -dy(a): y(a) = y(a) + 1 NEXT DO...LOOP UNTIL INKEY$ = CHR$(27) ' escape exit |
- Explanation: PCOPY reduces the flickering produced by clearing the screen. x(a) = x(a) - 1, etc. is just to be safe that the balls stay within the boundaries. dx(a) = -dx(a), etc. is to keep the actual speed while inverting it (so that the ball "bounces"). The rest should be self-explanatory, but if you are unsure about arrays you might want to look at QB64 Tutorials -> Arrays.
Navigation:
Go to Keyword Reference - Alphabetical
Go to Keyword Reference - By usage
Go to Main WIKI Page