25. NS BASIC Tech Note: NS BASIC goes Poof!           July 24, 1996

                      
--------------------------------------------------------------------------

I have been playing around with using viewffects for providing animaton 
when
opening/closing windows.  I have used ones such as DrawerEffect and
BarnDoorOpenEffect.  These are nice to provide some variation in the 
opening
and closing of windows.  I had been wanting, though without much luck, to 
be
able to make windows close with the poof & clouds you get when scrubbing 
out
something.

Through the help of Micael Engber (and his article in PIE Developers), 
James
Thiele, Oliver Veolckers, John Schettino, and Steve Weyers I have been able
to make it work in NS BASIC.  Without the help from these people, I would
still be struggling along.  Immediately below is the expanded code for
clarity, followed by the exact BASIC code.  If you do "poof out" a window, 
it
is best not to use an opening veiwEffect because it makes the ending screen
refresh non-standard.


The Detailed code:

// Provide the windowSpec of the window to be "poofed" to the function
FUNCTION poofItsGone(winToHide)
begin
// Isolate the original window spec so it isn't modified
     local poofBox := Clone(winToHide.viewBounds);
// copy the clouds
     local bma:=[Clone(© 53), Clone(© 54), Clone(© 55)];
// You must make the cloud bigger to cover the whole window (or the corners
will
// still show).  Make the number (3 below) bigger or smaller as required (a
smaller
// number will make the cloud larger, a larger number will make it smaller)
     local qWidth := (poofBox.right - poofBox.left) DIV 3;
     local qHeight := (poofBox.bottom - poofBox.top) DIV 3;
// Adjust the sides of the new viewbounds.
     poofBox.top := poofBox.top - qHeight;
     poofBox.left := poofBox.left - qWidth;
     poofBox.bottom := poofBox.bottom + qHeight;
     poofBox.right := poofBox.right + qWidth;
// Build a speacial window used just to refresh the screen area outside the
original
// window, don't worry because it won't show up on the screen
     local danQuayle := BuildContext({viewclass:74, viewFlags: 64,
viewBounds: poofBox});
// Make the poof sounds.
     PlaySound(© 314);
// Iterate thru a loop.
     foreach bm in bma do
          begin
          bm.bounds := poofBox;
// Show the cloud.
          GetRoot():CopyBits(bm, poofBox.left, poofBox.top, 8);
// I'm using a Newton 110, you may need to adjust the sleep time for your
Newton
// but it must be at least "1" or you won't see anything.
          Sleep(1);
// Hide the cloud.
          GetRoot():CopyBits(bm, poofBox.left, poofBox.top, 3);
          end;
// Hide the window so it doesn't reappear.
     winToHide:Hide();
// Open then close "danQuayle" to refresh the screen around the original
window
     danQuayle:Open();
     danQuayle:Close();
end


Now for the NS BASIC code:
In this case I am poofing out a window called aboutWin, with a window spec
called aboutWinSpec.  Any valid windowSpec can be substituted - this is a
general purpose code.

This line (0028 in my case) should be put in the main body of the program.

0028 FUNCTION poofItsGone(winToHide) BEGIN local poofBox :=
Clone(winToHide.viewBounds); local bma:= [Clone(© 53), Clone(© 54),
Clone(© 55)]; local qWidth := (poofBox.right - poofBox.left) DIV 3; local
qHeight := (poofBox.bottom - poofBox.top) DIV 3; poofBox.top := 
poofBox.top -
qHeight; poofBox.left := poofBox.left - qWidth; poofBox.bottom :=
poofBox.bottom + qHeight; poofBox.right := poofBox.right + qWidth; local
danQuayle := BuildContext({viewclass:74, viewFlags: 64, viewBounds:
poofBox}); PlaySound(© 314); foreach bm in bma do begin bm.bounds := 
poofBox;
GetRoot():CopyBits(bm, poofBox.left, poofBox.top, 8); Sleep(1);
GetRoot():CopyBits(bm, poofBox.left, poofBox.top, 3); end; 
winToHide:Hide();
danQuayle:Open(); danQuayle:Close(); end


This is the line that the GOTO/GOSUB in the windowSpec points to (0062 in 
my
case):

0062 LET unUsed := U:poofItsGone(aboutWinSpec)


This is my windowSpec (just for reference):

0325 LET aboutWinSpec := {GOTO: 0062, text: aboutText, viewbounds: {top: 
103,
bottom: 217, left: 46, right: 194}, viewFont: {family: 'espy, face: 0, 
size:
10}, viewJustify: 2, viewFormat: 
6*vfPen+4*vfRound+vfFrameMatte+vfFillWhite}



Many thanks to Matthew Riehl for this Tech Note! You can reach him at 
SharpsShtr© aol.com.