开始小球位于屏幕中央,然后以一定的方向运动,当小球碰到边缘时,被反弹回来
相关函数:getimage()函数 putimage()函数
[此贴子已经被作者于2007-1-15 16:15:20编辑过]
/******************************************************************************/
/* 关于小球碰到边缘后反弹回来的动画演示 */
/* 主要过程位于 Draw()函数中 */
/* 作者:cdmalcl 日期:1.16 */
/******************************************************************************/
#include <graphics.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define PI 3.14
#define Cr 7 /* 圆球半径 */
#define Clc 5 /* 圆球边线颜色 */
#define Cc 4 /* 圆球颜色 */
#define BKC 1 /* 方框背景颜色参数 */
#define BKC_O 1 /* 外框背景颜色 */
#define OUT_W 5 /* 外框宽度 */
#define BKLC_O 3 /* 外框边线颜色 */
#define LA_W 10 /* 栅格宽度 */
#define SIDE_RX 30 /* 框右下角X轴值 */
#define SIDE_RY 30 /* 框右下角Y轴值 */
#define SIDE_LX 30 /* 框左上角X轴值 */
#define SIDE_LY 30 /* 框左上角Y轴值 */
void Init(); /* 初始化操作 */
void View(); /* 动画演示入口 */
void InitView(); /* 动画初始化 */
void DrawBK(); /* 绘制背景 */
int GetView(); /* 获取圆球图案 */
int GetBKview(int x ,int y); /* 获取圆球经过的背景图案 */
int DrawView(int x ,int y); /* 绘制圆球 */
int ClearView(int x ,int y); /* 绘制圆球经过的背景图案 */
void Draw(); /* 动画过程 */
int GMaxX,GMaxY; /* 此图形模式下的X和Y轴的最大值 */
unsigned CBKview[2*Cr][2*Cr]; /* 圆球背景图案 */
unsigned Cview[2*Cr][2*Cr]; /* 圆球图案 */
float Ca; /* 圆球初始发射角度 */
int main(void)
{
Init();
View();
getch();
}
/*******************初始化操作*************************************************/
void Init()
{
int gd = DETECT,gm = 0;
initgraph(&gd ,&gm ,"");
GMaxX = getmaxx();
GMaxY = getmaxy();
srand((unsigned)time(NULL));
}
/*******************动画演示入口***********************************************/
void View()
{
int r ,i ,j;
InitView();
Draw();
}
/*******************动画初始化*************************************************/
void InitView()
{
Ca=random(360);
GetView();
DrawBK();
GetBKview(GMaxX/2 ,GMaxY/2);
ClearView(GMaxX/2 ,GMaxY/2);
DrawView(GMaxX/2 ,GMaxY/2);
getch();
}
/*******************绘制背景***************************************************/
void DrawBK()
{
int i ,j;
int sx ,sy;
sx = (GMaxX-SIDE_RX-SIDE_LX)/LA_W;
sy = (GMaxY-SIDE_RY-SIDE_LY)/LA_W;
setcolor(BKLC_O);
setfillstyle(1 ,BKC_O);
rectangle(SIDE_LX-OUT_W ,SIDE_LY-OUT_W ,GMaxX-SIDE_RX+OUT_W ,GMaxY-SIDE_RY+OUT_W);
floodfill(SIDE_LX-OUT_W+1 ,SIDE_LY-OUT_W+1, getcolor());
setcolor(BKC+1);
setfillstyle(1 ,BKC+4);
rectangle(SIDE_LX ,SIDE_LY ,GMaxX-SIDE_RX ,GMaxY-SIDE_RY);
floodfill(SIDE_LX+1 ,SIDE_LY+1, getcolor());
setcolor(BKC);
for(i = 1;i<=sx;i++)
{
line(SIDE_LX+2+i*10 ,SIDE_LY+1 ,SIDE_LX+2+i*10 ,GMaxY-SIDE_RY-1);
}
for(i = 1;i<=sy;i++)
{
line(SIDE_LX+1 ,SIDE_LY+2+i*10 ,GMaxX-SIDE_RX-1 ,SIDE_LY+2+i*10);
}
setcolor(BKC+6);
for(i = 1;i<=sx;i++)
{
line(SIDE_LX+1+i*10 ,SIDE_LY+1 ,SIDE_LX+1+i*10 ,GMaxY-SIDE_RY-1);
}
for(i = 1;i<=sy;i++)
{
line(SIDE_LX+1 ,SIDE_LY+1+i*10 ,GMaxX-SIDE_RX-1 ,SIDE_LY+1+i*10);
}
}
/*******************获取圆球图案***********************************************/
int GetView()
{
int i ,j;
setcolor(Clc);
setfillstyle(1,Cc);
fillellipse(GMaxX/2+Cr ,GMaxY/2+Cr ,Cr-1 ,Cr-1);
for(i = 0;i<Cr*2;i++)
for(j = 0;j<Cr*2;j++)
{
Cview[j][i] = getpixel(GMaxX/2+j ,GMaxY/2+i);
}
cleardevice();
}
/*******************获取圆球经过的背景图案*************************************/
int GetBKview(int x ,int y)
{
int i ,j;
for(i = 0;i<Cr*2;i++)
for(j = 0;j<Cr*2;j++)
{
CBKview[j][i] = getpixel(j+x ,i+y);
}
}
/*******************绘制圆球***************************************************/
int DrawView(int x ,int y)
{
int i ,j;
for(i = 0;i<Cr*2;i++)
for(j = 0;j<Cr*2;j++)
{
if(Cview[j][i])
putpixel(j+x ,i+y ,Cview[j][i]);
}
}
/*******************绘制圆球经过的背景图案*************************************/
int ClearView(int x ,int y)
{
int i ,j;
for(i = 0;i<Cr*2;i++)
for(j = 0;j<Cr*2;j++)
{
putpixel(j+x ,i+y ,CBKview[j][i]);
}
}
/******************************************************************************/
/* 动画过程 */
/* 1↑0 */
/* Cd ← → */
/* 2↓3 */
/******************************************************************************/
void Draw()
{
int i ,j;
int x ,y ,xr ,yr ,Space = 8;
int MaxX ,MaxY ,MinX = SIDE_LX ,MinY = SIDE_LY ,flag = 0;
int Cd;
float Car , xs, ys;
Cd = Ca/90;
Car= (Ca-Cd*90)*PI/180;
xs = Space*cos(Car);
ys = Space*sin(Car);
MaxX = GMaxX-SIDE_RX-2*Cr;
MaxY = GMaxY-SIDE_RY-2*Cr;
x = GMaxX/2;
y = GMaxY/2;
while(!kbhit())
{
xr += ((Cd == 1)||(Cd == 2))? (-1)*xs: xs;
yr += ((Cd == 1)||(Cd == 0))? (-1)*ys: ys;
ClearView(x ,y);
/* 判断是否碰撞: */
if(xr < MinX)
{
Cd = (Cd == 1)? 0: 3;
}
else
{
if(xr > MaxX)
{
Cd = (Cd == 0)? 1: 2;
}
}
if(yr < MinY)
{
Cd = (Cd == 1)? 2: 3;
}
else
{
if(yr > MaxY)
{
Cd = (Cd == 2)? 1: 0;
}
}
/* 。 */
x += ((Cd == 1)||(Cd == 2))? (-1)*xs: xs;
y += ((Cd == 1)||(Cd == 0))? (-1)*ys: ys;
xr = x;
yr = y;
GetBKview(x ,y);
DrawView(x ,y);
delay(1000);
}
}