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