The zoom effect used on Vision Factory's cracktro
-------------------------------------------------
Here is a small explanation about the zoom effect
I used in the Vision Factory win32 port.
First of all, I won't post the full code of it
since all the rest can be found directly here
on DBF-GVY Forum (music, loading an image, scroller)
So, we gonna start with the basic: drawing a line...
A line is made of points, pixels..so, to put a point
on screen, I'll use:
FeedPixels ( X , Y , rgb(255,255,255) )
(yes you need the sub but it's included, and thanks to
it's author...just I don't remember who write it.
Let me know and i'll correct it of course!)
So, you wrote a white point on screen, at position X-Y.
Now, you can use a loop to draw a line like this:
FOR X=1 TO 100
FeedPixels ( X , Y , rgb(255,255,255) )
NEXT
Here, we have a line from 1 to 100 at Y. (exemple 1.bas)
I hope you follow till here since we gonna make...a square
Using the same idea:
FOR Y=1 TO 100
FOR X=1 TO 100
FeedPixels ( X , Y , rgb(255,255,255) )
NEXT
NEXT
We have now a square of 100*100 with upper left corner @ 1,1 (X,Y)
with that in mind, you see it's not complicated to increase/decrease
its size) by using other variables: Minimum size, Maximum size.
With only those 2 variables it won't work: you need to know if
you need to increase or to decrease its size...
  if SQ_Size=SQ_Max_Size then Temp_Orientation=1 'Is the square at the max size?
  if SQ_Size=SQ_Min_Size then Temp_Orientation=0 'Is the square at the min size?
  if Temp_Orientation=0 then SQ_Size=SQ_Size+2
  if Temp_Orientation=1 then SQ_Size=SQ_Size-2
 Â
  For Y=1 to SQ_Size
 Â
    For X=1 To SQ_Size
      FeedPixels(X , Y,rgb(102,102,102))
    Next
 Â
  Next
(exemple 2.bas)
SO far, so good: we have one cube and its size changes as expected..so, let's add a second
square just next to him...but the coordinates changes!
No big deal in fact: we have the size of our square in realtime (woaow ;p):
  if SQ_Size=SQ_Max_Size then Temp_Orientation=1 'Is the square at the max size?
  if SQ_Size=SQ_Min_Size then Temp_Orientation=0 'Is the square at the min size?
   Â
  if Temp_Orientation=0 then SQ_Size=SQ_Size+2
  if Temp_Orientation=1 then SQ_Size=SQ_Size-2
 Â
  FOR I=0 to 2
   Â
    For Y=1 to SQ_Size
   Â
      For X=(I*SQ_Size) + 1 to (I*SQ_Size)+ SQ_Size
        FeedPixels(X , Y,rgb(102,102,102))
      Next
   Â
    Next
   Â
  Next
So, we only draw 2 now, but have a closer look:
For X=(I*SQ_Size) + 1 to (I*SQ_Size)+ SQ_Size
=> SQ_Size is the actual size of the screen..so to display the square at
      the right place, we added a variable ("I" .. not very original) and we
  calculate it's position: if its the second square, it's 2 (i=2) * the actual square size
Easy no? (Exemple 4.bas)
hey, but wait a minute...it's not a chessboard, there is only one color so far!
True...so, let's not put some space between the two grey one.
First, we'll just change our source:
For X=(2*I*SQ_Size) + 1 to (2*I*SQ_Size)+ SQ_Size
Now, we have 2 squares zooming and one empty space in between.....time to add the second color, no?
By adding FeedPixels(X , Y + SQ_Size,rgb(255,255,255))Â next to the first one FeedPixels and it'll make it!
(Exemple 5.bas)
We're almost done, it's getting close...but well, now, we have to fill the empty space..and don't forget to mix
colors....it's grey-white-grey..and not grey-grey-grey .... or no chessbord

Well, just add those 2 lines and it's filled:
FeedPixels(X + SQ_Size , Y,rgb(255,255,255))Â Â Â Â Â Â Â Â
        FeedPixels(X + SQ_Size , Y + SQ_Size,rgb(102,102,102))
Now we have 8 squares zooming..but not the full screen yet! (exemple 6.bas)
So, now we calculate the amount of squares, depending on it actual size:
  SQ_Amount_H=Screen_H/SQ_Size 'how many squares to draw (height)
  SQ_Amount_W=Screen_W/SQ_Size 'how many squares to draw (width)
So, we can replace the " FOR I=0 to 2" by "FOR I=0 to SQ_Amount_H" ....
do
  if SQ_Size=SQ_Max_Size then Temp_Orientation=1 'Is the square at the max size?
  if SQ_Size=SQ_Min_Size then Temp_Orientation=0 'Is the square at the min size?
   Â
  if Temp_Orientation=0 then SQ_Size=SQ_Size+1
  if Temp_Orientation=1 then SQ_Size=SQ_Size-1
 Â
  SQ_Amount_H=Screen_H/SQ_Size 'how many squares to draw (height)
  SQ_Amount_W=Screen_W/SQ_Size 'how many squares to draw (width)
 Â
 Â
  For J=0 to SQ_Amount_W
    For I=0 to SQ_Amount_H
      For Y=(2*I*SQ_Size) + 1 to (2*I*SQ_Size)+ SQ_Size
        For X=(2*J*SQ_Size) To (2*J*SQ_Size)+ SQ_Size
          FeedPixels(X , Y,rgb(102,102,102))
          FeedPixels(X , Y + SQ_Size,rgb(255,255,255))
          FeedPixels(X + SQ_Size , Y,rgb(255,255,255))       Â
          FeedPixels(X + SQ_Size , Y + SQ_Size,rgb(102,102,102))
        Next
      Next
    Next
  Next
 Â
 Â
  ptc_update(@screenbuffer(0))
  ERASE screenbuffer
 Â
loop until inkey$ = CHR$(27)
And yes..it's done

 (exemple final.bas)
There are probably tons of other methods...I found that one and it worked.
If you have any comment, suggestion, improvement, ... it's always welcome!
Cheers,
Druid