Animation Timing

 BBS: Inland Empire Archive
Date: 09-10-92 (11:40)             Number: 242
From: RICK PEDLEY                  Refer#: NONE
  To: BRIAN CUNNINGHAM              Recvd: NO  
Subj: Animation Timing               Conf: (2) Quik_Bas
 On 09-08-92 Matt Hart wrote to Brian Cunningham...

 BC>  BC> using a ON TIMER stament to interrupt a DO..LOOP after two
 BC>  BC> the way - is there any way to get an accurate fraction of a
 BC> second pause
 BC>      The ON TIMER event only checks after every statement
 BC> executes, and bloats your code pretty badly.  Look into
 BC> adding a timer look at the points you need it, perhaps
 BC> drawing your stuff, setting a variable to the next TIMER
 BC> setting it needs to look at:
 BC>
 BC> DrawRoutine:
 BC>      drawstuff
 BC>      NextEvent# = TIMER+.05#       ' 5 100's of a second
 BC> RETURN
 BC>
 BC> DO
 BC>      drawstuff
 BC>      DO UNTIL TIMER>NextEvent#
 BC>           keycheck$=inkey$
 BC>           if len(keycheck$) then gosub dokeystuff
 BC>      LOOP
 BC> LOOP

Here's something else that might work.  The WAIT &H3DA, 8 statement
waits for a vertical blank to occur before continuing program
execution, and these occur 60 times per second.  So to put a 1/15th
of a second pause between frames in an animation sequence, you
could do this (soodoughcode):

Move something
FOR x = 1 TO 4
   WAIT &H3DA, 8
NEXT x
Move it again

An added advantage besides the constant VBL rate on different computers
(because it's tied to the video firmware and not the CPU), is that
waiting for a vertical blank to occur before drawing will eliminate
most or all of the flicker you would normally see (i.e. objects only
partly drawn before it's time to put the next one on the screen). Try

this program with and without the WAIT I've REM'd out 5 lines from the
bottom:

'ROTBOX by R. Pedley, 92-03-16
'Rotates a small square on screen using two video pages to reduce flicker.
DEFINT A-Z

CONST AspectCorrection! = .73    'Pixels are taller than they are wide --
                                 ' adjust for various graphics modes.
                                 ' This ratio is about right for my monitor.
HalfDiagonal = 75                'Determines size of square.
CenterX = 320: CenterY = 175     ' - on a 0-639 x 0-349 screen.
ULX = CenterX - HalfDiagonal: IF ULX < 0 THEN ULX = 0    'Keeps coords of
ULY = CenterY - HalfDiagonal: IF ULY < 0 THEN ULY = 0    ' box to fill and
LRX = CenterX + HalfDiagonal: IF ULX > 639 THEN ULX = 639' clear old image.
LRY = CenterY + HalfDiagonal: IF ULY > 349 THEN ULY = 349

DIM Sine!(0 TO 359), Cosine!(0 TO 359)                  'Pre-calc all sine
FOR Angle = 0 TO 359                                    ' & cosine values.
   Radian! = Angle * .01745 '(rads per degree)
   Sine!(Angle) = SIN(Radian!) * HalfDiagonal * AspectCorrection!
   Cosine!(Angle) = COS(Radian!) * HalfDiagonal
NEXT Angle

SCREEN 9, 0                         'EGA: 640 x 350 x 16 colors.
COLOR 1, 1                          'Blue on blue.
CLS
ActivePage = 1                      'Page on which drawing takes place.
VisiblePage = 0                     'Page you're looking at.
SCREEN , , ActivePage, VisiblePage  'draw first box on page you can't see.
DO
   FOR Angle = 0 TO 89
      LINE (ULX, ULY)-(LRX, LRY), 1, BF 'Clear just the box area,
                                        ' much faster than CLS.
      y1 = CenterY + Sine!(Angle)
      x1 = CenterX + Cosine!(Angle)
      y2 = CenterY + Sine!(Angle + 90)
      x2 = CenterX + Cosine!(Angle + 90)
      y3 = CenterY + Sine!(Angle + 180)
      x3 = CenterX + Cosine!(Angle + 180)
      y4 = CenterY + Sine!(Angle + 270)
      x4 = CenterX + Cosine!(Angle + 270)
      LINE (x1, y1)-(x2, y2), 15
      LINE (x2, y2)-(x3, y3), 15
      LINE (x3, y3)-(x4, y4), 15
      LINE (x4, y4)-(x1, y1), 15
      PAINT (CenterX, CenterY), 15
      CIRCLE (CenterX, CenterY), 5, 0, , , AspectCorrection!
      PAINT (CenterX, CenterY), 0, 0
      ActivePage = ActivePage - 1 - 2 * (ActivePage = 0)   '0 <--> 1
      VisiblePage = VisiblePage - 1 - 2 * (ActivePage = 0) '1 <--> 0
      'WAIT &H3DA, 8  '<<<<---- Run, then remove the REM and run again.
      SCREEN , , ActivePage, VisiblePage 'switch active/visible page.
      IF LEN(INKEY$) THEN EXIT DO
   NEXT Angle
LOOP


... OFFLINE 1.40 * Stalker: One who hunts vegetables.

--- Maximus 2.01wb
 * Origin: The BULLpen BBS * Intel 14.4EX (613)549-5168 (1:249/140)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET