[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
From: BAS VAN GAALEN
Subj: Sin-curver Sprites
---------------------------------------------------------------------------
OB>> 1. Scrolling 256c fonts Fast and Smooth.
OB>> 2. Now to do it on top of graphics...
OB>> 3. 3D object engine - If someone can post me one or direct me
OB>> to build one.
OB>> 4. Shade Bobs/Whatever it called - Taking a shape and moving it
OB>> across the screen when it leaves trail. Then, moving again
OB>> on the trail will couse a stronger color to appear. n' on...
OB>> 5. Moving floor that is NOT a couse of a palette rotetion.
OB>> 6. 2D Scale procedure.
OB>> 7. Centered Stars. And SMOOTH ones.
OB>> 8. Vector Balls
I don't want to give it all away, but I just made some Shaded-bobs (or
whatever). It realy isn't difficult. It worked right away. Now YOU make a nicer
sin-curve and palette. Here's some source:
{ --- cut here --- }
{$G+}
program ShadingBobs;
const
Gseg : word = $a000;
Sofs = 75; Samp = 75; Slen = 255;
SprPic : array[0..15,0..15] of byte = (
(0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0),
(0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0),
(0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0),
(0,0,1,1,1,1,1,2,2,1,1,1,1,1,0,0),
(0,1,1,1,1,1,2,2,2,2,1,1,1,1,1,0),
(0,1,1,1,1,2,2,3,3,2,2,1,1,1,1,0),
(1,1,1,1,2,2,3,3,3,3,2,2,1,1,1,1),
(1,1,1,1,2,2,3,4,4,3,2,2,1,1,1,1),
(1,1,1,1,2,2,3,3,3,3,2,2,1,1,1,1),
(0,1,1,1,1,2,2,3,3,2,2,1,1,1,1,0),
(0,1,1,1,1,1,2,2,2,2,1,1,1,1,1,0),
(0,0,1,1,1,1,1,2,2,1,1,1,1,1,0,0),
(0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0),
(0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0),
(0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0),
(0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0));
type SinArray = array[0..Slen] of word;
var Stab : SinArray;
procedure CalcSinus; var I : word; begin
for I := 0 to Slen do Stab[I] := round(sin(I*4*pi/Slen)*Samp)+Sofs; end;
procedure SetGraphics(Mode : word); assembler; asm
mov ax,Mode; int 10h end;
function keypressed : boolean; assembler; asm
mov ah,0bh; int 21h; and al,0feh; end;
procedure DrawSprite(X,Y : integer; W,H : byte; Sprite : pointer); assembler;
asm
push ds
lds si,[Sprite]
mov es,Gseg
cld
mov ax,[Y]
shl ax,6
mov di,ax
shl ax,2
add di,ax
add di,[X]
mov bh,[H]
mov cx,320
sub cl,[W]
sbb ch,0
@L:
mov bl,[W]
@L2:
lodsb
or al,al
jz @S
mov dl,[es:di]
add dl,al
mov [es:di],dl
@S:
inc di
dec bl
jnz @L2
add di,cx
dec bh
jnz @L
pop ds
end;
procedure Retrace; assembler; asm
mov dx,3dah;
@l1: in al,dx; test al,8; jnz @l1;
@l2: in al,dx; test al,8; jz @l2; end;
procedure Setpalette;
var I : byte;
begin
for I := 0 to 255 do begin
port[$3c8] := I;
port[$3c9] := I div 3;
port[$3c9] := I div 2;
port[$3c9] := I;
end;
end;
procedure Bobs;
var X,Y : integer; I,J : byte;
begin
I := 0; J := 25;
repeat
X := 2*Stab[I]; Y := Stab[J];
inc(I); inc(J);
Retrace;
DrawSprite(X,Y,16,16,addr(SprPic));
until keypressed;
end;
begin
CalcSinus;
SetGraphics($13);
SetPalette;
Bobs;
SetGraphics(3);
end.
{ DrawSprite procedure taken from Sean Palmer (again).
It contained some minor bugs: [X] was added to AX, should be DI, and
jz @S was jnz @S, so the sprite wasn't drawn. Now it is...
And of course it was changed to INCREASE the video-mem, not to poke it.
If you get rid of the Retrace it goes a LOT faster. }
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]