C语言画图及小动画制作(graphisc.h函数入门)

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

  返回值:无

/*资料来自http://baike.baidu.com/view/1390221.htm?fr=ala0_1_1*/

于是我们在源代码中添加上这段代码:

/* 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

  返回值:无

/*资料来源http://baike.baidu.com/view/1390221.htm?fr=ala0_1_1*/

对于下面要用到的资料,就不在这里列出了。要学会查找资料。好好利用网络。

找到这个函数,就可以添加上如下的代码:

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文档下载地址:http://u.115.com/file/f2e2cd0bdc

小马哥哥

2010.09.08

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gracefulphoenix/archive/2010/09/08/5869828.aspx

你可能感兴趣的:(C语言画图及小动画制作(graphisc.h函数入门))