Текущий архив: 2006.12.24;
Скачать: CL | DM;
Вниз
Эффект воды в 2D Найти похожие ветки
← →
Quattro © (2006-04-18 12:19) [0]Добрый день! скажите, пожалуйста, вы часом не знаете как реализовывается сие чудо в делфи??
увидел пример вот здесь, но он, к сожалению , на С++
http://ishodniki.ru/base/Cpp/cpp_specialfx.zip
← →
a22 © (2006-04-18 15:39) [1]Пример очень простой, вы поясните, что конкретно вам непонятно? Не описывать же весь принцип работы программы, которую вы сами представили как образец...
← →
ПЛОВ © (2006-04-19 14:41) [2]
> как реализовывается сие чудо в делфи??
Точно так же.
> что конкретно вам непонятно?
Непонятен, видимо, перевод с С++ на Паскаль... Сам испытывал поначалу затруднения, потом понял что нужно знать Си. Просто нужно и все, даже если ты пользуешься только Паскалем...
← →
mlm68 © (2006-04-23 21:05) [3]Интересный эффект, красиво. Попробую перевести в делфи
← →
Quattro © (2006-04-24 16:28) [4]В том то и дело, что Си я, к сожалению, не знаю..:(...почему не понимаю принцип действия..:(
← →
mlm68 © (2006-05-05 21:47) [5]Нифига не получается, нужно си учить:(((
← →
programania © (2006-05-07 23:05) [6]
program Wave; // Делает волны на экране
{$R-,S-,B-}
uses Graphics, forms, SysUtils, windows, Classes, mmSystem, dialogs;
const maxX=1280; maxY=960; q=24;
var
m: array[0..maxY+1, 0..maxX+1] of single;
v: array[1..maxY, 1..maxX,1..3] of byte;
a: array[1..q] of Graphics.tBitmap;
s: pbytearray;
d,w,h,hh,g,ww,dx,dy,x,y,f,i,k: integer;
b,e: Graphics.tBitmap;
ris: boolean=false;
ce: tCanvas;
z,r,w1,w2: extended;
pt,pn: tPoint;
t: cardinal;
uTimerID: uint=0;
mMsg: TMsg;
Procedure cb(var b: Graphics.tBitmap);
begin
b:=Graphics.tBitMap.create; b.pixelformat:=pf24bit; b.width:=w; b.height:=h;
end;
procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;
begin
ce.Draw(0,0,a[f]);
GetCursorPos(pt);
if abs(pn.x-pt.x)+abs(pn.y-pt.y)>100 then begin
ce.Draw(0,0,e);
if uTimerID<>0 then timeKillEvent(uTimerID);
halt;
end;
inc(f);
if f>q then f:=1;
end;
begin
w:=screen.width; if w>maxX then w:=maxX-1; ww:=w div 2;
h:=screen.height; if h>maxY then h:=maxY-1; hh:=h*4;
cb(b);
cb(e);
for i:=1 to q do cb(a[i]);
ce:=tCanvas.create;
ce.Handle:=GetDC(0);
e.canvas.CopyRect(rect(0,0,w,h), ce,rect(0,0,w,h));
with ce.font do begin size:=18; color:=$FF; style:=[fsBold] end;
ce.textOut(ww-60,h div 2-40," Подождите ");
for y:=0 to h-1 do move(e.ScanLine[y]^,v[y,1,1],w*3);
//расчет волн заранее
for f:=1 to q do begin
for y:=1 to h do
for x:=1 to w do begin
d:=ww-x;
r :=sqrt(sqr(d)+sqr(y)) +f*24; w1:=sin(r/48)*(127+f*2);
r :=sqrt(sqr(d)+sqr(hh-y))+f*17; w2:=sin(r/32)*(127-f);
z :=w1/3 + w2/4;
m[y,x]:=z;
if x=1 then m[y,0] :=z else
if x=w then m[y,w+1]:=z;
if y=1 then m[0,x] :=z else
if y=w then m[w+1,x]:=z;
end;
for y:=1 to h do begin
s:=a[f].scanLine[y-1];
g:=0;
for x:=1 to w do begin
dy:=y+trunc((m[y-1,x] - m[y+1,x])*4);
dx:=x+trunc((m[y,x-1] - m[y,x+1])*4);
if dy>h then dy:=y else if dy<1 then dy:=1;
if dx>w then dx:=w else if dx<1 then dx:=1;
k:=trunc(m[y,x]);
i:=v[dy,dx,1]+k; if i>255 then i:=255 else if i<0 then i:=0; s[g]:=i; inc(g);
i:=v[dy,dx,2]+k; if i>255 then i:=255 else if i<0 then i:=0; s[g]:=i; inc(g);
i:=v[dy,dx,3]+k; if i>255 then i:=255 else if i<0 then i:=0; s[g]:=i; inc(g);
end;
end;
end;
GetCursorPos(pn);
f:=1; //20 кадров в сек
uTimerID:=timeSetEvent (50,0,@FNTimeCallBack,0,TIME_PERIODIC);
while GetMessage(mMsg,0,0,0) do DispatchMessage(mMsg);
end.
Страницы: 1 вся ветка
Текущий архив: 2006.12.24;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.034 c