{ 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. }