C语言画图及小动画制作(graphisc.h函数入门)
写此教程的目的是为了给Sarah一点小小的入门砖。本人非牛,出错在所难免。敬请原谅。
学了这么长时间的C语言,总不能还停留在对话框上。因此想着弄点图形出来。而C语言下有个graphics.h这个函数,就是干这事的。我们一起探索一下。
然而,毕竟是DOS时代的产物,VC是不支持此图形库的。因此我们要用TC去编译。到网上去下载一个win-tc2.0,我们开始我们的旅程。
打开win-tc的界面:
点击文件->使用模板创建->BGI图形编程模板:然后会出现这样的代码:
/* WIN-TC BGI 图形编程模板 */
#include "Conio.h"
#include "graphics.h"
#define closegr closegraph
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
int main(void)
{
initgr(); /* BGI初始化 */
/*****此部分添加你自己的代码,例如
line(25, 25, 220, 220);
circle(100, 100, 50);
等等*****/
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
}
一开始头文件: #include "Conio.h"
#include "graphics.h"
把这个图形库的头文件包含进去。
然后我们向下看主函数: void main(void)
{
}
首先要初始化图形,最后要结束图形模式。于是:
initgr(); /* BGI初始化 */
closegr(); /* 恢复TEXT屏幕模式 */
至于initgr()是怎么初始化的,这里不作讨论。有兴趣的自己查。
然后剩下的,就是到中间去添加代码了。
而graphics.h中包含了那些函数呢?可以去头文件里直接查看,或者百度。
通过查资料,我们很容易找到其中的函数。比如画直线的函数:
line() 画线函数
功能:函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。用法:该函数调用方式为void line(int startx,int starty,int endx,int endy);
说明:参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变。
此函数相应的头文件为graphics.h
返回值:无
/*资料来自
于是我们在源代码中添加上这段代码:
/* WIN-TC BGI 图形编程模板 */
#include "Conio.h"
#include "graphics.h"
#define closegr closegraph
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
int main(void)
{
initgr(); /* BGI初始化 */
/*****此部分添加你自己的代码,例如
line(25, 25, 220, 220);
circle(100, 100, 50);
等等*****/
line(20,20,300,300);
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
}
编译运行,然后出现了一条斜线。要注意的是,电脑的屏幕的坐标,是以左上角为(0.0)点的。
接下来,我们想,能不能把直线变得粗一点,或者变成点线,虚线呢?再查资料。
setlinestyle() 设置线型函数
功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽。用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int width);
说明:参数style为线型取值,也可以用相应名称表示,如表1-10中所示。
参数pattern用于自定义线图样,它是16位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定义线图样,与图样中“1”位对应的像素显示,因此,pattern=0xFFFF,则画实线;pattern=0x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0xFF00和0xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。
参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的。
若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。
Turbo C提供的线型与线宽定义在头文件graphics.h中,表1-10和1-11分别列出了参数的取值与含义。
表1-10 线型
名称
取值 含义 SOLID_LINE 0 实线 DOTTED_LINE 1 点线 CNTER_LINE 2 中心线 DASHED_LINE 3 虚线 USERBIT_LINE 4 用户自定义线型表1-11 线宽
名 称
取 值 说 明 NORM_WIDTH(常宽) 1 一个像素宽(缺省值) THICK_WIDTH(加宽) 3 三个像素宽这个函数的头文件是graphics.h
返回值:无
/*资料来源
对于下面要用到的资料,就不在这里列出了。要学会查找资料。好好利用网络。
找到这个函数,就可以添加上如下的代码:
setlinestyle(0,0,3);
因为是设置线型,所以要放在函数line()前面。
编译运行,是不是变粗了呢?(无法截屏,自己运行试试)
之后我们又想,能不能换个颜色?
继续查资料,可以找到setcolor();
于是在line()前面加上代码:
setcolor(10);
于是直线变成了绿色。换成其他的数字会变成其它的颜色。
很犀利吧。
接下来,自己去画圆,多边形,椭圆等等。把找到的资料都实验一遍。
接下来,我们讲一下动画。动画是由一帧一帧构成的。我们要用c语言模拟出这个过程来。比如第一帧:
setcolor(10);
line(20,200,220,200);
第二帧:
setcolor(10);
line(21,200,221,200);
第三帧,第四帧......
当第一帧结束后,我们要把它消除掉,怎么消除呢,最简单的方法就是覆盖。于是
setcolor(0);
而第一帧和第二帧之间,过度不能太快,需要做一下延迟,于是再加上
delay(5000);
最后程序变为:
/* WIN-TC BGI 图形编程模板 */
#include "Conio.h"
#include "graphics.h"
#define closegr closegraph
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
int main(void)
{
int i = 0;
initgr(); /* BGI初始化 */
/*****此部分添加你自己的代码,例如
line(25, 25, 220, 220);
circle(100, 100, 50);
等等*****/
while(1)
{
for(i = 20;i<600;i++)
{
setcolor(10);
line(i,200,i+200,200);
delay(5000);
setcolor(0);
line(i,200,i+200,200);
if(kbhit())
break; /*跳出循环*/
}
if(kbhit())
break;
}
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
}
注意这段代码,int i要在初始化图形前面。死循环中要有按键检测,不然真的死循环,你就等着死机吧。
编译运行,最后出现一条移动的直线。
到此,入门的就讲完了。我的水平也就到这里了。如果你们遇到什么问题,估计我也解答不了。(*^__^*) 嘻嘻……
最后出几道题吧;
1。画出一个小房子。
2。做两个小球直线碰撞
3。做一个小球在一个方框内碰撞,碰壁90度反弹。
4。做两个小球在一个方框内碰撞,小球间碰撞直线反弹。
5。多个小球在一个方框内碰撞。(泡跑屏保)
本文pdf文档下载地址:
小马哥哥
2010.09.08
本文来自CSDN博客,转载请标明出处: