` COMPUTE! ISSUE 125 / JANUARY 1991 / PAGE G24`

 Multiple sprites on the move. (Beginner BASIC) (Gazette - Commodore 64 & 128) (column) by Larry Cotton Happy New Year! My first New Year's resolution is to finish our multiple-sprite program that we began in December's column. Load that program, and we'll continue by positioning all eight sprites. 100 FORT=0TO14STEP2:POKEV+T,X :NEXT V and X were defined in line 90. Since the sprites' horizontal memory registers are V, V+2, V+4, and so on, we use STEP 2 in the FOR-NEXT loop, which causes every other memory register to be poked. The same goes for the sprites' vertical registers (V+1, V+3, V+5, and so on). 110 FORT=1TO15STEP2:POKEV+T, Y:NEXT Memory registers V+23 (53248+23=53271) and V+29 (53248+29=53277) control sprite height and width, respectively. For sprite 0, if you POKE V+23, 1 and POKE V+29,0, the sprite will be tall and narrow; poking both V+23 and V+29 with a 1 will cause sprite 0 to be tall and wide. The two sprite-size registers (V+23 and V+29) must be poked very carefully with numbers from 0 to 255. Look at the following chart. Bit No. 7 6 5 4 3 2 1 0 Values 128 64 32 16 8 4 2 1 On/Off 0 0 0 0 0 0 0 1 Poking 1 to a memory register turns on only bit 0. Poking 4 would turn on only bit 2. Poking a sum of 8 and 16, or 24, turns on bits 3 and 4. Bit No. 7 6 5 4 3 2 1 0 Values 128 64 32 16 8 4 2 1 On/Off 0 0 0 1 1 0 0 0 Poking a 255 (or K, as defined in line 90) turns on all the bits. The sprites are conventionally numbered the same as the bits. Therefore, poking 1 to V+23 or V+29 controls the size of sprite 0 only. Poking 24 controls sprites 3 and 4. Poking 255 (or K) controls all the sprites. To make all eight as tall and wide as possible, poke V+23 and V+29 with 255 (K). 120 POKEV+23,K:POKEV+29,K Memory register V+21 (53269) turns sprites on or off (makes them visible or invisible). To turn all eight sprites on, use POKE V + 21,255. (While we're at it, turn the sound on by poking V1 with 23, a funky combination of voice 1, ring mood, and sync.) 130 POKEV+21,K:POKEV1,23 Now define a few variables. 140 J = 1:Q = 1:F1 = 1 Line 140 is the beginning of a repeatable loop. J start as 1. Later it will change to -- 1. Q is the number of pixels the sprites will be displaced from their original locations. F1 is the frequency of voice 1. Now let's make all the sprites green. 150 FORT = 39TO46:POKEV + T,5: NEXT Registers V + 39 through V + 46 control the sprites' colors. Thus, the FOR-NEXT loop assigns color 5 (green) to all eight sprites. Now we need to make a couple of IF-THEN checks to see if the sprites have moved to the extremes of their travel. 160 IFQ>MTHENJ =-1:M\$ = "[RED] MERRY CHRISTMAS":GOSUB300 170 IFQ<0THENM\$ ="(15 spaces)": GOSUB300:GOTO140 Recall that Q is the number of pixels each sprite moves from its original position. M was defined as 79. When Q becomes greater than M, we want the sprites to reverse direction; thus J becomes -- 1. Conversely, if Q becomes less than 0, the sprites have returned to their original position, and we begin a new loop at 140. 180 Q = Q + J Remember that J can be either 1 or -- 1. Thus Q will either increase or decrease by 1. Line 190 is reserved for a REMark that explains lines 200-220. Those lines move the sprites by increasing or decreasing their horizontal and vertical locations. 200 POKEV,X+Q:POKEV+2,X--Q: POKEV+5,Y+Q:POKEV+7,Y--Q: POKEV+8,X+Q:POKEV+9,Y--Q 210 POKEV+10,X--Q:POKEV+11,Y --Q:POKEV+12,X--Q:POKEV +13,Y+Q:POKEV+14,X+Q 220 POKEV+15,Y+Q As Q's value increases (J = + 1), the sprites move away from each other. As Q decreases (J = -- 1), the sprites move toward each other. 230 POKEVF,F1:F1 = F1+J All this does is poke a frequency value to control voice 1's pitch. 240 GOTO160 We need a subroutine that positions the cursor, prints the message, and causes a short delay. 300 POKE214,11:PRINT:POKE211,12: PRINTM\$:FORD = 1TO500:NEXT: RETURN To use sprites of your own creation, change the data in lines 50-70.