#include <vcl.h>
#pragma hdrstop
#include<math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "GIFImage"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TForm1 *Form1;
int dripnum;
drip *head;
int raining;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void TForm1::drawbackground()
{
Form1->Panel1->DoubleBuffered=true;
Form1->Image1->Canvas->Pen->Color=RGB(0,0,0);
Form1->Image1->Canvas->Brush->Color=RGB(0,0,0);
Form1->Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
Form1->Image1->Canvas->Brush->Style=bsClear;
}
//------------------------------------------------------------------------------
drip *TForm1::dripdata(void)
{
struct drip *node;
randomize;
node=(struct drip *)malloc(sizeof(struct drip));
node->bx=rand()%(Form1->Image1->Width);
node->by=rand()%(Form1->Image1->Height-200);
node->y=node->by+node->driplen;
node->ex=node->bx+TrackBar2->Position;
node->ey=330+rand()%100;
node->flag=1;
node->R=random(3);
node->color=RGB(random(255),random(255),random(255));
node->driplen=random(5)+8;
node->next=NULL;
return(node);
}
//----------------------------------------------------------------------
void TForm1::creatdripchain()
{
drip *p1,*p2;
int i;
p1=Form1->dripdata();
head=p1;
for(i=0;i<20;i++)
{
p2=Form1->dripdata();
p1->next=p2;
p1=p2;
}
}
//----------------------------------------------------------------------------
void TForm1::adripdata(drip *node)
{
randomize;
node->bx=rand()%(Form1->Image1->Width);
node->by=rand()%(Form1->Image1->Height-200);
node->ex=node->bx;
node->ey=330+rand()%100 ;
node->y=node->by+node->driplen;
node->flag=1;
node->R=random(3);
node->color=RGB(random(255),random(255),random(255));
node->driplen=random(5)+8;
}
//----------------------------------------------------------------------------
void TForm1::line(drip *node)
{
Form1->Image1->Canvas->Pen->Color=node->color;
Form1->Image1->Canvas->MoveTo(node->bx,node->by);
Form1->Image1->Canvas->LineTo(node->x,node->y);
}
//----------------------------------------------------------------------------
void TForm1::clearline(drip *node)
{
Form1->Image1->Canvas->Pen->Color=(0,0,0);
Form1->Image1->Canvas->MoveTo(node->bx,node->by);
Form1->Image1->Canvas->LineTo(node->x,node->y);
}
//----------------------------------------------------------------------------
void TForm1::fall(drip *node)
{
if(node->y>=node->ey)
{
clearline(node);
node->flag=0;
}
else
{
clearline(node);
node->x=node->bx+TrackBar2->Position;
node->bx=node->x-sin(TrackBar2->Position);
node->x=node->x+TrackBar2->Position/6;
node->y+=40;
node->by=node->y-node->driplen;//更新单个雨滴数据
line(node);//画出雨滴的新位置
}
}
//----------------------------------------------------------------------------
void TForm1::freespace(drip *node)
{
drip *p;
node=head;
while(node)
{
p=node;
node=node->next;
free(p);
}
}
//----------------------------------------------------------------------------
void TForm1::ripple(drip *node)
{
if(node->R>=25+random(5))
{
clearellipse(node);//清除最后出现的涟漪
adripdata(node);//重新更新雨滴的数据
}
else
{
clearellipse(node);//清除已出现的涟漪
node->R+=8+random(5);//更新涟漪数据
Form1->Image1->Canvas->Pen->Color=node->color;
Form1->Image1->Canvas->MoveTo(node->x,node->ey);
Form1->Image1->Canvas->Ellipse(node->x-node->R,node->ey-node->R/2,
node->x+node->R,node->ey+node->R/2);//画出涟漪
}
}
//---------------------------------------------------------------------------
void TForm1::clearellipse(drip *node)
{
Form1->Image1->Canvas->Pen->Color=RGB(0,0,0);
Form1->Image1->Canvas->MoveTo(node->x,node->ey);
Form1->Image1->Canvas->Ellipse(node->x-node->R,node->ey-node->R/2,
node->x+node->R,node->ey+node->R/2);
}
//---------------------------------------------------------------------------
void TForm1::rain(void)
{
drip *p;
p=head;
while(raining==1)
{
if(p==NULL)p=head;
else
{
if(p->flag==1)fall(p);
else ripple(p);
}
Application->ProcessMessages();
Sleep(2);//雨滴速度缓冲
p=p->next;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
StaticText1->Visible=false;
drawbackground();
creatdripchain();
raining=1;
BitBtn1->Enabled=false;
rain();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
raining=0;
freespace(head); //释放链表所占空间
Close();
}
//---------------------------------------------------------------------------