Hardcore Programming Section
Binding Sprites to Sinewaves
Sinewaves?
Sinewaves bound to sprites present a variety of artistic effects. Here are some examples.

Acid Trip
Trippin' like it's 1996. Don't do it to all the tiles, or you might leave some addicts quivering on the floor!

Teleportation
Whoah! That dude just did this whoosh thing, then he was GONE! GONE! It was cool!

Really painful spell

Yikes! That guy just got all torn up! That evil mage there rolled his body up like an old matress! HOLY SHIT!

In other words, use your imagination.




In C games,  it's a trick used quite often to map a bitmap to a sinewave to give it a waving effect. Here's how to get the same effect in QB in a tile-based engine. If you run this program, you'll see that the effect is in fact, quite watery.

DEFINT A-Z

CONST WAVEHEIGHT = 2
CONST WAVESPEED = 1
CONST WAVEMOVE = 5

'here we dimension the memory we'll need.
'in an established tile engine, you'd still need the
'buffer tile. The original bitmap is stored there.
'Bitmap is where the altered tile is sent.
DIM bitmap(1 TO 20, 1 TO 20) AS INTEGER

DIM buffer(1 TO 20, 1 TO 20) AS INTEGER

'generates a random "water" bitmap.
 FOR b = 1 TO 20
  FOR c = 1 TO 20

      bitmap(b, c) = (c * 10) AND 255
    buffer(b, c) = bitmap(b, c)
   NEXT c
  NEXT b

DIM sinlookup(0 TO 381 + 400) AS INTEGER


FOR a = 0 TO 381 + 400
    sinlookup(a) = SIN((a) * 3.14159 / 180) * WAVEHEIGHT
NEXT a
a = 0


SCREEN 13

'labelling everything.
LOCATE 2, 4: PRINT "QBXL Tech Demo Number 1: Sinewaves"
LOCATE 10, 2: PRINT "Sinewave"
LOCATE 6, 23: PRINT "Result"
LOCATE 6, 13: PRINT "Original"

LOCATE 24, 1: PRINT "Press  'Q' to quit."



'drawing the stationary original
 FOR b = 1 TO 20
  FOR c = 1 TO 20
    PSET (b + 105, c + 50), buffer(b, c)
    PSET (b + 125, c + 50), buffer(b, c)
    PSET (b + 105, c + 70), buffer(b, c)
    PSET (b + 125, c + 70), buffer(b, c)
   NEXT c
  NEXT b


DO
   h = h + 1
   IF h = WAVESPEED THEN g = g + WAVEMOVE: h = 0
   IF g > 360 THEN g = 1


   LINE (a / 5, 100 - 20)-(a / 5, 100 + 20), 0
   PSET (a / 5, 100 + sinlookup(a)), 1


    IF a > (360) THEN a = 0
    a = a + 1
 'just for the hell of it, we draw a sinewave.
   LINE (a / 5, 100 - 20)-(a / 5, 100 + 20), 2
   PSET (a / 5, 100 + sinlookup(a)), 1


     'this is where we do the movement.
     FOR b = 1 TO 20
   WHILE e > 20: e = e - 20: WEND
   WHILE e < 1: e = e + 20: WEND
   e = b
  FOR c = 1 TO 20
   'part of drawing the line through the sinewave.
   'IF c MOD 4 = 0 THEN a = a + 1
   d = c + sinlookup((g) + (b * 20))'+ e) * 2
   WHILE d > 20: d = d - 20: WEND
   WHILE d < 0: d = d + 20: WEND

   IF d <> 0 THEN bitmap(b, c) = buffer(e, d)
  NEXT c
 NEXT b


'This renders the various tiles on the screen.
'You don't have to understand this if you have a
'working renderer.
 FOR b = 1 TO 20
  FOR c = 1 TO 20
    PSET (b + 175, c + 50), bitmap(b, c)
    PSET (b + 175, c + 70), bitmap(b, c)
    PSET (b + 195, c + 50), bitmap(b, c)
    PSET (b + 195, c + 70), bitmap(b, c)

   NEXT c
  NEXT b
   'wait for vsync.
   WAIT &H3DA, 8

   'quitting. Why is it here, rather than at the top?
   'no friggin' clue.
   key$ = INKEY$
   IF key$ = "q" THEN SCREEN 0: WIDTH 80: END

LOOP



-SJ Zero is on LSD. Why do you think he wrote this?.

 Comment on this article in our Forum