C语言图形化编程基础入门

上传人:飞*** 文档编号:40227579 上传时间:2018-05-24 格式:DOCX 页数:15 大小:71.30KB
返回 下载 相关 举报
C语言图形化编程基础入门_第1页
第1页 / 共15页
C语言图形化编程基础入门_第2页
第2页 / 共15页
C语言图形化编程基础入门_第3页
第3页 / 共15页
C语言图形化编程基础入门_第4页
第4页 / 共15页
C语言图形化编程基础入门_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《C语言图形化编程基础入门》由会员分享,可在线阅读,更多相关《C语言图形化编程基础入门(15页珍藏版)》请在金锄头文库上搜索。

1、二、C 的图形模式编程2.1 图形编程基础图形编程基础VC+EasyX 库里提供了图形函数就可以在 VC 环境下进行图形编程。对图形函数的操作都是在视口(Viewport) 上进行。用户可以在屏幕上定义大小不同的视口,若不定义视口大小,它就是整个屏幕。 视口是在图形屏幕状态下的概念,用户可访问的最小单位是一个像素(像素这一术语最初用来指显示器上最小的、 单独的发光点单元。然而现在,其含义拓宽为指图形显示器上的最小可访问点)。文本与图形都可以在视口上显示。图形视口的左上角坐标为(0,0)。 例如:分辨率为 640*480 的视口像素点的定位(640*480)的的图图形形视视口口(0,0)6391

2、 2 3 .479xy显示器在图形模式下工作时,显示的单位是像素点,通过控制各像素点的颜色和灰度等级来形成图形。因此绘 图的第一步是进行图形模式的初始化,系统进入绘图模式。 (1) initgraph() 图形初始化函数用法: HWND initgraph(int width,int height,int flag = NULL );示例:以下局部代码创建一个尺寸为 640x480 的绘图环境:initgraph(640, 480); 例 2-1:调用 initgraph()设置 640*480 的图形模式,在屏幕中央显示如下的图形。参考代码: #include #include int ma

3、in()initgraph(640, 480);line(200, 240, 440, 240);line(320, 120, 320, 360);getch();closegraph();return 0; 学习单步执行 试着单步执行刚才的程序,由于绘图和多线程等因素的限制,请务必按照以下步骤尝试(熟练了以后就不用了):1. 将 VC 取消最大化,并缩小窗口,能看到代码就行。 2. 按一下 F10(单步执行),会看到屏幕上出现一个黄色的小箭头,指示将要执行的代码。 3. 当箭头指向 initgraph()语句时,按 F10,能看到窗口发生了变化。 4. 将新的绘图窗口和 VC 并排放,相互不

4、要有覆盖。这步很重要,否则绘图内容将会被 VC 窗口覆盖。 5. F10 执行 getch 后,记得激活绘图窗口,并按任意键,否则程序不会继续执行。 6. closegraph 后,直接按 F5 执行全部剩余程序,结束。 单步执行很重要,可以让你知道程序执行到哪里是什么效果,哪条语句执行出了问题等等。 例 2-2:更进一步,打印出分辨率,并在屏幕中央显示如下的图形 参考代码 #include #include #include #define WIDTH 150 /*矩形的宽度*/ #define HEIGHT 100 /*矩形的高度*/ int startX,startY; /*矩形的左上角

5、坐标*/ int maxX; int maxY; void init(); /*图形模式的初始化*/ void showText(); /*显示文本*/ void drawK(); /*画图形*/ int main()init(); showText();drawK();closegraph();return 0; void init()initgraph(640,480);maxX = getmaxx();maxY = getmaxy();setbkcolor(BLACK); /*设置背景色为黑色*/cleardevice(); /*清屏*/ void showText()char str5

6、0;sprintf(str,“(%d,%d)“,maxX,maxY); /*将要显示的分辩率以字符串形式保存到 str*/outtextxy(maxX/4,maxY/4,str); /*在指定位置显示字符串 str*/ void drawK()startX = (maxX-WIDTH)/2;startY = (maxY-HEIGHT)/2;setcolor(WHITE);rectangle(startX,startY,startX+WIDTH,startY+HEIGHT);setcolor(YELLOW);line(startX,startY,startX+WIDTH,startY+HEIGH

7、T);line(startX+WIDTH,startY,startX,startY+HEIGHT);setcolor(RED);circle(maxX/2,maxY/2,30);getch(); /暂停,任意健继续 例 2-3:用若干个小矩形块画一个围墙的效果,如下图:参考代码: #include #include int maxX; int maxY; void init()initgraph(640,480);maxX = getmaxx()+1;maxY = getmaxy()+1; void drawWall(void)int i,j;int left,right,top,bottom

8、;setbkcolor(BLACK);cleardevice();setlinecolor(WHITE);left = 50;right = maxX-50;top = 50;bottom = maxY-50;for(i=left;i #include #include int main()initgraph(640, 480);for(int y=100; y #include #include #define PI 3.14 int main()initgraph(640, 480);int c;double a;int x, y, r = 200;for(a = 0; a #includ

9、e void main()initgraph(640, 480);for(int y=0; y #include void main()initgraph(640, 480);for(int x=100; x #include typedef structint x; /球心坐标int y;int r; /球半径int dx; /x 方向上的偏移int dy; /y 方向上的偏移 Ball; /定义一个球类型void initBall(Ball *ball,int x,int y,int r) /初始化一个球 ball-x = x;ball-y = y;ball-r = r;ball-dx =

10、 3;ball-dy = 3; void draw(Ball ball) /画一个实心球setcolor(YELLOW);setfillcolor(RED);fillcircle(ball.x, ball.y, ball.r); void clear(Ball ball) /擦除球setcolor(BLACK);setfillcolor(BLACK);fillcircle(ball.x, ball.y, ball.r); void move(Ball *ball,int W,int H) /调整球的位置,即新球设置一个新位置ball-x+=ball-dx;ball-y+=ball-dy;if(

11、ball-xr|ball-xW-ball-r) /x 方向上边界检查,超出则换方向ball-dx=-ball-dx;if(ball-yr|ball-yH-ball-r) /y 方向上边界检查,超出则换方向ball-dy=-ball-dy; void main()initgraph(640, 480);Ball ball;initBall(while(!kbhit()draw(ball);Sleep(10);clear(ball);move(closegraph(); 点评:对复杂的图案如果要移动,每次都重新绘制显然效率很低,移动的时候会出现严重的屏幕闪烁。而 getimage / putima

12、ge 的效率十分高,我们可以将复杂的图案用 getimage 保存下来,然后再逐步 putimage 实现复杂图 案的移动。 方法二方法二:利用屏幕图像存储再放的方法实现。同制作幻灯片一样,将整个动画过程变成一个个片断,然后存到显示缓 冲区内,当把它们按顺序重放到屏幕上时,就出现了动画效果,这可以用 getimage()和 putimage()函数来实现暂时(略)2.4 捕获按键,实现动画的简单控制捕获按键,实现动画的简单控制 最常用的一个捕获按键的函数:char getch(void ) ; char ch = getch(); 不过程序执行到 getch() 是会阻塞的,直到用户有按键才能

13、继续执行。可游戏中总不能因为等待按键而停止游戏执行 吧?所以,要有一个函数,判断是否有用户按键。 int kbhit(void) 这个函数判断当前是否有用户按键,如果有,返回为真,没有键按下,返回为假。 kbhit()和 getch()配合使用,先判断是否有键按下,如有键按下再用 getch() 获取即可,这样是不会阻塞的。 例 2-9:编程实现,如果有按键,就输出相关按键,否则,输出“.”。每隔 100 毫秒输出一次,按 ESC 退出。 #include #include #include #define ESC 27 void main()char c = 0;while(1) if (k

14、bhit()c = getch();if(c=ESC) break;else c = .;printf(“%c“, c);Sleep(100); 结合前面的简单动画,就可以做出来靠按键移动的图形了,看以下代码,实现 a 、s 键控制球的左右移动: 算法如下: char ch; 显示球; while(1) if(kbhit() ch = getch(); 擦除球; 根据按键不同,设置球的新位置; 显示球; 例 2-10:代码参考:(在例 2-8 基础个修改) void main()initgraph(640, 480);Ball ball;initBall(draw(ball); while(t

15、rue)if(kbhit()char ch = getch();if(ch= =27) break; /ESC 键的 ASCII 码值为 27else clear(ball); move( draw(ball); closegraph(); void move(Ball *ball,int W,int H,char dir) /调整球的位置,即新球设置一个新位置if(dir=a) ball-x-=ball-dx;if(dir=s) ball-x+=ball-dx;if(ball-xr|ball-xW-ball-r) /x 方向上边界检查,超出则换方向ball-dx=-ball-dx;if(ball-yr|ball-yH-ball-r) /y 方向上边界检查,超出则换方向ball-dy=-ball-dy; 通常来说,getch() 可以返回用户键入的字符。对于一些小游戏,希望用方向键控制的时候,怎么做呢? 简单来说,当 getch() 返回 0 或 0xE0 时,就表示用户按了功能键,这时候需要再调用一次 getch()。第二次 getch() 返回的值表示功能键,比如: 72 表示 上(UP) 80 表示 下(DOWN)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号