Category : Pascal Source Code
Archive   : SPRITES.ZIP
Filename : DEMO6.PAS

 
Output of file : DEMO6.PAS contained in archive : SPRITES.ZIP

(* ************************************************************** *)
(* *)
(* SpriteDemo6.Pas *)
(* *)
(* This program shows how to use sprites for multiple page *)
(* animation. The basic strategy is to use three pages: *)
(* the colorscreen, a hidden workbuffer which is a identical *)
(* and may be written to unseen, and a third buffer which is *)
(* the part of the scene that does not change. One creates *)
(* the background and stores it both in backgroundbuffer and *)
(* in the workbuffer. Next, one writes to the workbuffer *)
(* ( that is, draws the sprites ). Next the workbuffer is *)
(* displayed by transferring it to the colorscreen. Then one *)
(* erases the workbuffer by transferring the backgroundbuffer *)
(* to it. The now blank workscreen can again be modified, *)
(* displayed, and erased again ... and again ... and ... *)
(* *)
(* The workbuffer and the backgroundbuffer each use 16K of *)
(* your data segment ( 32K out of your total of 64K ). You can *)
(* easily reduce this to 16K if after writing the background- *)
(* buffer you store it in the heapspace rather than in the *)
(* the data segment. However, in this small program it is not *)
(* necessary. *)
(* *)
(* These techniques are similar to those of Demo1, but the *)
(* present example is more complicated. *)
(* *)
(* (c) Donald L. Pavia *)
(* Ver 2.0 Department of Chemistry *)
(* Western Washington University *)
(* Bellingham, Washington 98225 *)
(* January 25, 1986 *)
(* *)
(* ************************************************************** *)

program SpriteDemo6;

{----------------------------------------------------------------------------}
{$I Sprites.Lib}
{----------------------------------------------------------------------------}

const SoundOn : boolean = true;

var k,l : integer;

{----------------------------------------------------------------------------}
procedure Introduction;

begin
TextColor (3);
gotoxy (2,5); write ('TURBO PASCAL');
TextColor (1);
gotoxy (7,7); write ('SPRITE DESIGNER');
TextColor (3);
gotoxy (12,9); write ('AND');
TextColor (1); write (' ANIMATION PACKAGE ');
TextColor (3); write ('DEMO');
gotoxy (1,21); write ('Action Continues Until a KeyPress');
gotoxy (1,23); write ('Donald Pavia, December 1985');
gotoxy (29,17); TextColor (2);
gotoxy (25,17); write ('Press ');
TextColor (3);
read (kbd,Wait);

end; { procedure Introduction }
{----------------------------------------------------------------------------}

BEGIN
clrscr;
GraphColorMode; GraphBackGround (1); Palette (2);

WorkBuffer := ColorBuffer; { copy blank screen into workbuffer }

LoadTable ('DEMO1.TAB'); { load the table of sprites }

Introduction;

REPEAT
{----- Create BackGround Screen and Display ------------------}

for times := 1 to 14 do
begin { XorSpriteW writes to hidden workbuffer }
{ - row of 14 dwarf sprites is created }

Sprite := Table[ 9]; { Dwarf1 - upper body }
XorSpriteW (20 * times,90);

Sprite := Table[17]; { Dwarf2 - lower body }
XorSpriteW (20 * times,110);

end;

ColorBuffer := WorkBuffer; { display workbuffer }

BackGroundBuffer := WorkBuffer; { copy workbuffer into background }
{ to use for refresh of workbuffer }
{------------------------------------------------------------}

Repeat
count := 8;

(* ******* REPEAT LOOP ONE ************************************* *)

repeat

{-- Display Cycle One ----------------------------------------}
{ write to blank workbuffer }
count := count + 8;

Sprite := Table[12]; XorSpriteW (220,20); {Dragon}

Sprite := Table[2]; {Dog1}
if count < 307 then XorSpriteW (count,153);

Sprite := Table[5]; {Duck1}
if count < 300 then XorSpriteW (count+8,141);

Sprite := Table[20]; {Boy1}
if (count >48) and (count < 204) then XorSpriteW (count-40,140);

Sprite := Table[20]; {Boy1}
if count >= 204 then XorSpriteW (164,140);

ColorBuffer := WorkBuffer; { display workbuffer }
WorkBuffer := BackGroundBuffer; { erase workbuffer }

{-- Display Cycle Two ----------------------------------------}
{ write to blank workbuffer }
count := count + 8;

Sprite := Table[13]; XorSpriteW (220,20); {Dragon2}

Sprite := Table[3]; {Dog2}
if count < 307 then XorSpriteW (count,153);

Sprite := Table[6]; {Duck2}
if count < 300 then XorSpriteW (count+16,136);

Sprite := Table[21]; {Boy2}
if (count > 56) and (count < 212) then XorSpriteW (count-40,140);

Sprite := Table[20]; {Boy1}
if (count > 212) then XorSpriteW (164,140);

ColorBuffer := WorkBuffer; { display workbuffer }
WorkBuffer := BackGroundBuffer; { erase workbuffer }

{-------------------------------------------------------------}
{ naive attempt at dog bark }
if SoundOn then begin
if ((count > 32) and (count < 128))
or (count > 210) then begin
Sound ( 40); delay (10); Sound (120); delay (20);
Sound (400); delay (15); Sound (880); delay (20);
Sound (1600); NoSound; end; end;
{-------------------------------------------------------------}

until count >= 340;

(* ******* END LOOP ONE ****************************************** *)

count := 4;

(* ******** REPEAT LOOP TWO ************************************* *)

repeat
{-- Display Cycle Three --------------------------------------}
{ write to hidden workbuffer }
count := count + 8;

Sprite := Table[12]; XorSpriteW (220,20); {Dragon}

Sprite := Table[23]; XorSpriteW (244,20); {Blast}

Sprite := Table[2]; {Dog1}
if count < 307 then XorSpriteW (count,153);

Sprite := Table[5]; {Duck1}
if count < 300 then XorSpriteW (count+8,141);

Sprite := Table[22]; {Boy3}
if count < 180 then XorSpriteW (164,140);

if (count >= 180) and (count < 204) then begin
Sprite := Table[20]; {Boy1}
XorSpriteW (164,140); end;

Sprite := Table[20]; {Boy1}
if count >= 204 then XorSpriteW (count-40,140);

ColorBuffer := WorkBuffer; { display workbuffer }
WorkBuffer := BackGroundBuffer; { erase workbuffer }

{-- Display Cycle Four ---------------------------------------}
{ write to hidden workbuffer }
count := count + 8;

Sprite := Table[13]; XorSpriteW (220,20); {Dragon2}

Sprite := Table[3]; {Dog2}
if count < 307 then XorSpriteW (count,153);

Sprite := Table[6]; {Duck2}
if count < 300 then XorSpriteW (count+16,136);

Sprite := Table[22]; {Boy3}
if (count < 188) then XorSpriteW (164,140);

if (count >= 188) and (count < 212) then begin
Sprite := Table[20]; {Boy1}
XorSpriteW (164,140); end;

Sprite := Table[21]; {Boy2}
if count >= 212 then XorSpriteW (count-40,140);

ColorBuffer := WorkBuffer; { display workbuffer }
WorkBuffer := BackGroundBuffer; { erase workbuffer }

{--------------------------------------------------------------}
{ barking again }
if SoundOn then begin
if ((count > 32) and (count < 128))
or (count > 210) then begin
Sound ( 40); delay (10); Sound (120); delay (20);
Sound (400); delay (15); Sound (880); delay (20);
Sound (1600); NoSound; end; end;
{-------------------------------------------------------------}

until count >= 340;

(* ******** END LOOP TWO ************************************* *)

Until keypressed;

{---------------------------------------------------------------------}
FIllChar (ColorBuffer,16192,0); { erase everything }
FillChar (WorkBuffer,16192,0); { clrscr doesn't }
FillChar (BackGroundBuffer,16192,0); { work in graphics }

gotoxy (10,10); write ('Repeat Again ? Y/N ? ');
repeat
read (Kbd,Again);
until UpCase(Again) in ['Y','N'];

FillChar (WorkBuffer,16383,0);
{---------------------------------------------------------------------}

UNTIL UpCase(Again) = 'N';

gotoxy (1,23);
TextMode (c80); clrscr; { exit gracefully }

END.


  3 Responses to “Category : Pascal Source Code
Archive   : SPRITES.ZIP
Filename : DEMO6.PAS

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/