[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
DD> could anyone tell me how to simulate realtime moving watersurface ripples
DD> on a mode13h vga graphic picture ? something like getting the location of a
DD> pixel and then set that pixel at another location according to a sine orr
DD> a cos wave or something... i feel it has to be something lake that..
Is this what you had in mind?
{$G+}
Uses
Crt;
Const
SinTabSize = 2048;
SinTabAmp = 128;
Type
ScrType = Array[0..199,0..319] of Byte;
ScrPtr = ^ScrType;
SinTabType = Array[0..SinTabSize-1] of Integer;
SinTabPtr = ^SinTabType;
Var
VisualScreen,BufferScreen : ScrPtr;
SinTab : SinTabPtr;
Procedure SetMode13;Assembler;
Asm
mov ax,0013h
int 10h
End;
Procedure PutPixel(Scr:ScrPtr;x:Integer;y,Col:Byte);Assembler;
Asm
les di,Scr
xor bh,bh
mov bl,y
shl bx,6
add bh,y
add bx,x
add bx,di
mov al,Col
mov es:[bx],al
End;
Procedure CopyScr(Source,Dest:ScrPtr);Assembler;
Asm
push ds
les di,Dest
lds si,Source
mov cx,16000
db 66h
rep movsw
pop ds
End;
Procedure FillScr(Scr:ScrPtr;Col:Byte);Assembler;
Asm
les di,Scr
mov al,Col
mov ah,al
db 66h
shl ax,16
mov al,col
mov ah,al
mov cx,16000
db 66h
rep stosw
End;
Procedure SetupSinTab;
Var
n : Integer;
a,ast : Real;
Begin
a:=0;
ast:=2*pi/SinTabSize;
For n:=0 to SinTabSize-1 do
Begin
SinTab^[n]:=Round(SinTabAmp*Sin(a));
a:=a+ast
End
End;
Procedure DrawRipples;
Var
Ang1,Ang2 : Integer;
x,z : Integer;
Px,Py,Height : Integer;
Begin
Ang1:=0;
Ang2:=0;
Repeat
FillScr(BufferScreen,200);
For z:=-30 to -10 do
For x:=-20 to 20 do
Begin
Height:=
SinTab^[(Ang1+x*32) and (SinTabSize-1)]+
SinTab^[(Ang2+z*32) and (SinTabSize-1)];
Px:=64*x div z;
Py:=(Height+240) div z;
PutPixel(
BufferScreen,
159+Px,
99-Py,
31-((Height+256) div 64)
)
End;
CopyScr(BufferScreen,VisualScreen);
Ang1:=Ang1+17;
Ang1:=Ang1 and (SinTabSize-1);
Ang2:=Ang2+12;
Ang2:=Ang2 and (SinTabSize-1)
Until KeyPressed
End;
Begin
VisualScreen:=Ptr($A000,0);
New(BufferScreen);
New(SinTab);
SetupSinTab;
SetMode13;
DrawRipples;
TextMode(LastMode)
End.
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]