编程论坛's Archiver

ensonpan3927 发表于 2006-12-4 15:50

[求助]c图形的擦除问题与动画问题

<P>向各位求救了!我的问题就是:运动的小圆在运动后怎么把前面的小圆擦除掉?有什么函数吗?谢谢了!<BR>程序如下:</P>
<P>#include&lt;graphics.h&gt;<BR>#include&lt;stdio.h&gt;<BR>#include&lt;dos.h&gt;<BR>main()<BR>{<BR>    int gdriver=DETECT,gmode,y=180,i;</P>
<P>   initgraph(&amp;gdriver,&amp;gmode,"");  /*初始化图形系统*/<BR>   cleardevice();<BR>   rect();/*调用画图函数*/</P>
<P>    for(i=0;i&lt;5;i++)   /*点(120,180)到点(120,120)的数据发送*/<BR>   {<BR>   setcolor(RED);<BR>   outtextxy(90,100,"line is free,send message!");<BR>   circle(120,y,2);<BR>   sleep(1);<BR>   y=y-14;<BR>   y--;<BR>   }</P>
<P>   getch();<BR>   closegraph();<BR>}</P>
<P>rect()<BR>{</P>
<P>   setbkcolor(GREEN);  /*背景颜色*/<BR>   setlinestyle(SOLID_LINE,3,3);/*设定线的类型*/<BR>   line(90,120,510,120);   /*画直线*/<BR>   line(120,120,120,180);<BR>   line(240,120,240,180);<BR>   line(360,120,360,180);<BR>   line(480,120,480,180);<BR>   setcolor(YELLOW);<BR>   setfillstyle(SOLID_FILL,LIGHTGRAY); /*填充矩形颜色*/<BR>   bar(90,180,150,240);   /*画巨型框*/<BR>   bar(210,180,270,240);<BR>   bar(330,180,390,240);<BR>   bar(450,180,510,240);<BR>   outtextxy(95,210,"site 1");   /*在矩形框内标明站点序号*/<BR>   outtextxy(215,210,"site 2");<BR>   outtextxy(335,210,"site 3");<BR>   outtextxy(455,210,"site 4");</P>
<P>}<BR></P>

一笔苍穹 发表于 2006-12-4 17:34

可以用清屏函数clear(),不过每画一步都清一次屏实在太影响效率了,可以直接用画圆函数在原位置上用背景色再画一次,就可以覆盖掉原先的那个了。<BR>另,XOR模式也是一个办法,不过我不喜欢,也就不多说了。

ensonpan3927 发表于 2006-12-4 18:43

<P>谢谢斑竹,可是c函数里有“清屏函数clear()”吗?还有用背景色重画圆那小圆的颜色不是跟背景色一样了吗?效果就不好了,还望斑竹再指教一下!</P>

一笔苍穹 发表于 2006-12-5 10:24

A.如果球的背景是单色,那你可以在画新球之前先用背景色在老位置上画个球,用以覆盖原来的球,这不存在效果好不好的问题;<BR>B.如果球的背景不是单色(比如是图案),那可以在画球之前先用getimage()函数把将要用来作画的一块小区域保存起来,球的位置变动要重画之前先用putimage()将上面保存的那块区域原处显示出来,这样背景图案就恢复了。这样,再保存下一个要“弄脏”的位置,画球,再恢复……这就是“脏矩形”算法的基本思路。<BR>你的程序无外乎以上两种情况,是哪种你选哪个方案,实现过程中出了问题是代码组织的问题,多思考多调试,搞定它要的只是时间。

一笔苍穹 发表于 2006-12-5 10:26

另,clear()更正为cleardevice()因为我几乎不用graphics库,所以函数名记不太清。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.