C語言畫圖及小動畫製做(graphisc.h函數入門)

C語言畫圖及小動畫製做(graphisc.h函數入門)編程

寫此教程的目的是爲了給Sarah一點小小的入門磚。本人非牛,出錯在所不免。敬請原諒。網絡

學了這麼長時間的C語言,總不能還停留在對話框上。所以想着弄點圖形出來。而C語言下有個graphics.h這個函數,就是幹這事的。咱們一塊兒探索一下。函數

然而,畢竟是DOS時代的產物,VC是不支持此圖形庫的。所以咱們要用TC去編譯。到網上去下載一個win-tc2.0,咱們開始咱們的旅程。動畫

打開win-tc的界面:.net

點擊文件->使用模板建立->BGI圖形編程模板:而後會出現這樣的代碼:htm

/* WIN-TC BGI 圖形編程模板 */blog

#include "Conio.h"教程

#include "graphics.h"ci

#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

相關文章
相關標籤/搜索