It being a nice sunny weekend, I decided to fool around with bouncing sprites. Writing a real sprite moving toolkit is, of course, above my pay grade, so the idea was to work with what we already have. For this attempt I used EayPtr's ptrmen_cde. (But it isnt hard to convert it to use QJump's Qptr instead.) In theory, the identical code should work in mode 0/8 on a real (fast?) QL, but this piece here is strictly GD2 on some SMSQ/E emulator.
The method here is pretty trivial: Restore the previous background, work out the next location, save that background, and draw the sprite there. However, this means that the program has rather a lot to do in a short amount of time, so that large sprites or fast moving makes the sprite flash or jerk, and that doesnt look very appealing. Some improvement can be achieved by saving the whole window, and only restoring the necessary part. That saves saving the background for each iteration of the loop. But the difference isnt that noticeable.
If transparency is not required (QL mode 0/8 sprites dont have transparency), ie if using rectangular, opaque sprites, then more efficient methods can be used, particularly if the background is regular or solid. While not particularly efficient, this method isnt too bad for short moves, eg within a program window.
Note: I have only tested these in QPC2/SMSQmulator! They may be pretty crap on slow machines. Since graphics on the QL always was challenged, and no provision made for a graphics card/accelerator, its doubtful that there'll ever be any massively dynamic games or utilities for the brand, although a bespoke GD2 sprite toolkit might work for the high-end emulators, at least.
10 REMark Init window 11 ch = FOPEN(#0; "con_") 12 wsx% = SCR_XLIM(#ch): wsy% = SCR_YLIM(#ch) 13 OUTLN#ch; wsx%, wsy%, 0, 0 14 : 15 RANDOMISE DATE 16 : 17 REMark Load some sprite 18 spr = Ball16: REMark Or spr = SprLoad("win1_spr_Sun32_spr") 19 sx% = PEEK_W(spr + 4): REMark Get size 20 sy% = PEEK_W(spr + 6) 21 xmx% = wsx% - sx%: REMark Work out limits 22 ymx% = wsy% - sy% 23 cx% = RND(sx% TO xmx% - sx%): REMark Start somewhere 24 cy% = RND(sy% TO ymx% - sy%) 25 dx% = -1: dy% = 1: s% = 2: REMark Initial direction and speed 26 lx% = cx%: ly% = cy%: REMark Last position 27 : 28 adr = WSAIN(#ch; sx%, sy%): REMark Reserve save area 29 : 30 REMark Save background and draw sprite 31 WSASV#ch; adr, sx%, sy%, cx%, cy% 32 SPRW#ch; cx%, cy%, spr 33 : 34 REMark Lets roll! 35 REPeat bounce 36 REMark Move 37 IF dx% > 0 THEN 38 cx% = cx% + s% 39 IF cx% > xmx%: dx% = -1: NEXT bounce 40 ELSE 41 cx% = cx% - s% 42 IF cx% < 0: dx% = 1: NEXT bounce 43 END IF 44 : 45 IF dy% > 0 THEN 46 cy% = cy% + s% 47 IF cy% > ymx%: dy% = -1: NEXT bounce 48 ELSE 49 cy% = cy% - s% 50 IF cy% < 0: dy% = 1: NEXT bounce 51 END IF 52 : 53 REMark Un-draw and re-draw sprite 54 WSARS#ch; adr\ sx%, sy%, lx%, ly% 55 WSASV#ch; adr, sx%, sy%, cx%, cy% 56 SPRW#ch; cx%, cy%, spr 57 lx% = cx%: ly% = cy% 58 : 59 REMark User interaction 60 k% = CODE(INKEY$(#ch; 1)) 61 SELect ON k% 62 = 27: EXIT bounce 63 = 32: BGET#ch; k%: IF k% = 27: EXIT bounce 64 = 208: REMark Cursor up => faster 65 s% = s% + 1: IF s% > 9: s% = 9: BEEP 1000, 2 66 = 216: REMark Curso down => slower 67 s% = s% - 1: IF s% = 0: s% = 1: BEEP 1000, 2 68 END SELect 69 END REPeat bounce 70 QUIT 71 : 72 : 73 DEFine FuNction SprLoad(fnm$) 74 LOCal ch, fl, ad 75 ch = FOP_IN(fnm$): IF ch < 0: RETurn ch 76 fl = FLEN(#ch): CLOSE#ch 77 ad = ALCHP(fl) 78 LBYTES fnm$, ad 79 RETurn ad 80 END DEFine SprLoad 81 : 82 : 83 DEFine FuNction Ball16 84 LOCal dad 85 REMark Yellow, semi-transparent ball, GD2 mode 16, alpha, RLE, 22x22 86 : 87 dad = ALCHP(646) 88 POKE_W dad + 0, 528, 224, 22, 22, 0, 0, 0, 12, 0, 448 89 POKE_W dad + 20, 0, 0, 21068, 17713, 0, 528, -1280, 767, -8164, -768 90 POKE_W dad + 40, 540, -7937, -3072, 31, -2304, 31, -2304, 508, 1022, 252 91 POKE_W dad + 60, 1021, 1, 1020, -1536, 252, -512, -2301, -512, 252, -1280 92 POKE_W dad + 80, 259, 254, 1017, 6399, 1023, 0, 1020, 1, 7936, -253 93 POKE_W dad + 100, -488, -997, -488, -253, -256, 31, -512, 255, -256, 3 94 POKE_W dad + 120, -232, -741, -64, -485, -232, -253, -256, 255, -256, 480 95 POKE_W dad + 140, 255, 768, 6399, 7162, -16129, 7167, 6399, 769, 224, -256 96 POKE_W dad + 160, 540, 3, -232, 27, -64, -829, -64, -229, 24, -253 97 POKE_W dad + 180, 256, 7423, 254, 768, 6399, 6912, -16129, -15616, -11777, -9985 98 POKE_W dad + 200, -15361, -16384, 7167, 6146, 768, 1022, 0, 1023, 6144, 7167 99 POKE_W dad + 220, -16384, -15364, -9985, -15616, -16129, 6913, 6147, -1024, 3, -232 100 POKE_W dad + 240, 27, -64, 451, -9986, -9469, -10038, -15424, -229, 24, -253 101 POKE_W dad + 260, -512, -253, -232, 27, -64, 451, -9986, -9472, -9985, -15616 102 POKE_W dad + 280, -16129, 6912, 6398, 1023, 1, 7171, -232, 27, -64, 195 103 POKE_W dad + 300, -808, -61, 192, -229, 792, 769, 7423, 0, -7937, 768 104 POKE_W dad + 320, 6399, 6912, -16129, -15616, -13569, -9985, -15361, -16384, 7167, 6146 105 POKE_W dad + 340, 768, -7937, 0, -1, 1023, 6144, 7167, -16132, -15361, -16129 106 POKE_W dad + 360, 6912, 6399, 769, 255, -512, 31, -253, 24, -229, -1344 107 POKE_W dad + 380, -229, -232, 515, 287, -1024, 280, 1023, 6398, 6912, -30209 108 POKE_W dad + 400, -16130, 7167, 6399, 768, 6395, 0, -769, 1022, 6396, 6912 109 POKE_W dad + 420, 6911, 6398, 768, -774, 1, -1000, -253, -1768, -253, 280 110 POKE_W dad + 440, -777, 0, 8183, 768, 8180, 2, -800, 7421, 770, 7392 111 POKE_W dad + 460, -7, 0, 21068, 17713, 0, 484, -1280, 776, 13912, 28927 112 POKE_W dad + 480, 31747, 28760, 13832, -2560, 322, 31737, 32257, 31554, -1792, 276 113 POKE_W dad + 500, 25845, 32257, 25620, -1024, 276, 28915, 32257, 28692, -768, 100 114 POKE_W dad + 520, -3714, 100, -512, 66, -4226, 834, 8, 31727, 32258, 31496 115 POKE_W dad + 540, 14061, 32257, 13912, -4738, 344, 28909, 32257, 28796, -4738, -132 116 POKE_W dad + 560, -4738, 380, 28909, 32257, 28760, -4738, 344, 14061, 32258, 13832 117 POKE_W dad + 580, 31727, 32259, 31496, 66, -4226, 66, -512, 100, -3714, 100 118 POKE_W dad + 600, -768, 276, 28915, 32257, 28692, -1024, 276, 25845, 32257, 25620 119 POKE_W dad + 620, -1792, 322, 31737, 32257, 31554, -2560, 776, 13912, 28927, 31747 120 POKE_W dad + 640, 28760, 13832, -1280 121 RETurn dad 122 END DEFine Ball16 123 : 124 :