'*************************************** 'COPPER BARS 'AUTHOR JEAN-MILOST REYMOND '*************************************** GLOBAL USEPIXELS, OFFSET, COUNT 'NOTE SET USEPIXELS TO 1 TO DRAW COPPER BARS DIRECTLY IN MEMORY 'INSTEAD OF USING PREDEFINED RESOURCES. THE COPPER BARS DRAWN 'THIS WAY ARE LESS COLORED AND LIMITED TO 2 BARS, HOWEVER THE 'ANIMATION IS SMOOTHER USEPIXELS = 0 COUNT = 8 IF USEPIXELS THEN COUNT = 2 END IF 'BAR DATA, ORGANIZED AS FOLLOW: '0 - CURRENT POSITION '1 - Y POSITION '2 - AMPLITUDE '3 - ANGLE DIM GLOBAL BARS(COUNT, 3) 'CREATE THE COPPER BARS FOR I = 0 TO COUNT - 1 BARS(I, 0) = 60 BARS(I, 1) = 60 BARS(I, 2) = 40 BARS(I, 3) = I * 0.3 NEXT I '*************************************** ' MAIN LOOP '*************************************** DO CLS 'ANIMATE THE BARS FOR I = 0 TO COUNT - 1 BARS(I, 0) = BARS(I, 1) + (BARS(I, 2) * COS(BARS(I, 3))) ADD BARS(I, 3), 0.05 IF BARS(I, 3) > PI * 2.0 THEN ADD BARS(I, 3), -(PI * 2.0) END IF NEXT I 'DRAW THE BARS IF USEPIXELS THEN PAL 0 CALL DRAWCOPPER_PIXELS ELSE CALL DRAWCOPPER_RESOURCES END IF WAIT VBL LOOP '*************************************** 'DRAW COPPER BARS FROM RESOURCES '*************************************** SUB DRAWCOPPER_RESOURCES BG 1 'ITERATE THROUGH THE COPPER BARS FOR I = 0 TO COUNT - 1 'SELECT THE BACKGROUND AND PALETTE. THE BACKGROUND IS ALTERNED 'TO REDUCE THE JERK WHEN COPPER BARS ARE CROSSING BG (I + 1) MOD 2 PAL I 'CALCULATE THE COPPER BAR POSITION AND WHICH RESOURCE TO USE POS = BARS(I, 0) \ 8 COPPERPOS = BARS(I, 0) MOD 8 'DRAW THE COPPER BAR BG FILL 0, POS TO 19, POS CHAR COPPERPOS + 1 'DRAW THE COPPER BAR SECOND PART IF COPPERPOS > 3 AND POS < 15 THEN CH = (COPPERPOS - 3) + 9 BG FILL 0, POS + 1 TO 19, POS + 1 CHAR CH END IF NEXT I END SUB '*************************************** 'DRAW COPPER BARS IN MEMORY '*************************************** SUB DRAWCOPPER_PIXELS BG 1 'CLEAR THE DRAW MEMORY FOR I = 1 TO 15 CALL CLEAR(I) NEXT I 'ITERATE THROUGH THE COPPER BARS FOR I = 0 TO COUNT - 1 'CALCULATE THE COPPER BAR POSITION POS = BARS(I, 0) \ 8 COPPERPOS = BARS(I, 0) MOD 8 'DRAW THE COPPER BAR RESOURCE IN MEMORY FOR Y = 0 TO 2 FOR X = 0 TO 7 PH = POS + 1 PL = POS + 1 IF (COPPERPOS + Y) >= 8 THEN INC PH END IF IF (COPPERPOS + Y + 3) >= 8 THEN INC PL END IF CALL PIXEL(X, COPPERPOS + Y, 2 - Y, PH) CALL PIXEL(X, COPPERPOS + Y + 3, Y, PL) NEXT X NEXT Y 'DRAW THE COPPER BAR BG FILL 0, POS TO 19, POS CHAR POS + 1 BG FILL 0, POS + 1 TO 19, POS + 1 CHAR POS + 2 NEXT I END SUB '*************************************** 'CLEAR THE DRAWN MEMORY CHARACTER 'CH - THE CHARACTER TO CLEAR '*************************************** SUB CLEAR(CH) BASE = $8000 + ($10 * CH) FILL BASE, 16 END SUB '*************************************** 'DRAW A PIXEL ONTO A CHARACTER IN MEMORY 'X - THE PIXEL X COORDINATE FROM CHAR LEFT 'Y - THE PIXEL Y COORDINATE FROM CHAR TOP 'COL - THE COLOR TO USE FROM THE PALETTE 'CH - THE TARGET CHARACTER '*************************************** SUB PIXEL(X, Y, COL, CH) 'CALCULATE THE BASE ADDRESS AND LIMIT THE X AND Y POS TO 8 PIXELS BASE = $8000 + ($10 * CH) PX = X MOD 8 PY = Y MOD 8 'CALCULATE THE PIXEL X POSITION POKE $A000, 1 ROL $A000, PX P = PEEK($A000) 'GET THE FIRST COLOR LAYER LAYER = PEEK(BASE + PY) AND NOT P 'APPLY THE PIXEL MASK IF COL = 0 OR COL = 2 THEN LAYER = LAYER OR P END IF 'APPLY BACK THE FIRST LAYER POKE BASE + PY, LAYER 'GET THE SECOND COLOR LAYER LAYER = PEEK(BASE + PY + 8) AND NOT P 'APPLY THE PIXEL MASK IF COL = 1 OR COL = 2 THEN LAYER = LAYER OR P END IF 'APPLY BACK THE SECOND LAYER POKE BASE + PY + 8, LAYER END SUB #1:MAIN PALETTES 0030201000030201000C0804003F2A15 00392410000B0602003C281400332211 #2:MAIN CHARACTERS 00000000000000000000000000000000 FF00FFFF00FF0000FFFF0000FFFF0000 00FF00FFFF00FF0000FFFF0000FFFF00 0000FF00FFFF00FF0000FFFF0000FFFF 000000FF00FFFF00000000FFFF0000FF 00000000FF00FFFF00000000FFFF0000 0000000000FF00FF0000000000FFFF00 000000000000FF00000000000000FFFF 00000000000000FF00000000000000FF FF00000000000000FF00000000000000 00FF000000000000FFFF000000000000 FF00FF000000000000FFFF0000000000 FFFF00FF000000000000FFFF00000000 00FFFF00FF000000FF0000FFFF000000