|
楼主 |
发表于 2020-4-6 20:46:28
|
显示全部楼层
方法补帖如下:
//画圆,至少需要指定半径,和它的色,暂时就定这么多了
ab::ab(int R, int C):p(NULL),left(0),top(0),right(0),bottom(0),s(0),
c(C),l(R+R),w(R+R),n(0),statu(0),mx(0),my(0)
{
/*
以上的"构造器"是抄写于默认的那段文字,只是把两个变量初始化为了入参变量,含意是:
圆的长,宽是2倍的半径,颜色也被存储到成员数据s中去了,
目前只做了这两个事. 下面开始画圆
*/
setcolor(c);
circle(R,R,R);//circle()是头文件的方法,暂时不重要,画圆用的,将来再解释它.
setfillstyle(1,c);//设置填充,以后再说
floodfill(R,R,c); //填充,... 实心圆已画好
/*
下面开始储存这个圆的各种属性了
首先需要得到这个画面的大小,然后需要申请同样大小的内存来存储这个图形,同时
给也初始化的大小等相关值并存储待用:
*/
right=l; //l在 初始化器 中已经存储好值 l== R+R
bottom=w;//同上. left和top都为0,代表左上角顶点处,不变化
//代表这个矩形里的图形,需要占用的字节数,将来需要改变它的大小时,可以改动s的值
s=imagesize(left,top,right,bottom);
//依靠大小,申请内存,并用指针 p指向这块内存.
p= new int[s] ;
//有了内存,开始 使用头文件的方法来复制这个图形到内存
getimage(left,top,right,bottom,p);
//复制完毕,恢复默认颜,并清场
setcolor(WHITE);
cleardevice();
}
void ab:: init(int x, int y)
{
left = x;
top = y;
right = left + l;
bottom = top + w;
putimage(left,top,p,1);//以头文件1的方式摆出图形,是按位异或:指不消除其它未重合的图形
statu=1; //状态置为1,代表已激活,可以活动了
n=1;
mx=10;
my=10; //步幅都为1
}
void ab:: move()
{
//怎么动呢?
putimage(left,top,p,1); //原地摆放图形 若完全重合,就会消失这个图形
left += mx;
top += my;
right = left + l;
bottom = top + w;
putimage(left,top,p,1); //再次摆放出来
}
void ab :: screen()
{
/*
当靠边时,需要改变mx my的值,并使判定到边的条件失效
*/
if(left<=0 && mx<0 ) //当球左移到屏左之内时 并球是从右至左运动时
{
putimage(left,top,p,1); //先消除跳出的球
left = 1; //还要使条件脱离
mx *= -1; //还要向反方向移动
right= left + l; //还要使球右边到左边的直径始终正确
putimage(left,top,p,1); //再次摆放出来 以下以此类推...
}
else if( bottom>=getmaxy() ) //球下到屏下时
{
putimage(left,top,p,1);
bottom = getmaxy()-1;
my+=2;
mx+=5;
my *= -1;
top = bottom - w;
putimage(left,top,p,1);
n++;
}
else if( right>=getmaxx() ) //球右到屏右时
{
putimage(left,top,p,1);
right = getmaxx()-1;
mx *= -1;
left = right - l;
putimage(left,top,p,1);
}
else if( top<=0 ) //球上到屏上时
{
putimage(left,top,p,1);
top = 1;
my *= -1;
bottom = top + w;
putimage(left,top,p,1);
}
} |
|