1:创建新项目
自己动手建立项目试试,并输入以下代码:
#include
void main()
{
}
printf("Hello World!");
然后,输入以下代码试试(无需理解代码含义):
#include
#include
void main()
{
initgraph(640, 480);
line(200, 240, 440, 240);
line(320, 120, 320, 360);
getch();
closegraph();
}
执行后应该可以看到屏幕正中央有一个十字
2:简单绘图,学习单步执行
#include // 绘图库头文件,绘图语句需要
#include // 控制台输入输出头文件,getch()语句需要
void main()
{
initgraph(640, 480); // 初始化 640x480 的绘图屏幕
line(200, 240, 440, 240); // 画线(200,240) - (440,240)
line(320, 120, 320, 360); // 画线(320,120) - (320,360)
getch(); // 按任意键
closegraph(); // 关闭绘图屏幕
}
解释一下:
1. 创建的绘图屏幕 640x480,表示横向有 640 个点,纵向有 480 个点。注意:左上角是原
点(0,0),也就是说,y 轴和数学的 y 轴是相反的。
2. getch 实现按任意键功能,按任意键后,程序继续执行。否则,程序会立刻执行 closegraph
以至于看不到绘制的内容。
[作业]
用线条画出更多的图形,要求不少于 10 条直线。
[学习单步执行]
完成作业后(务必完成),开始试着单步执行刚才的程序,由于绘图和多线程等因素的限制,
请务必按照以下步骤尝试(熟练了以后就不用了):
1. 将 VC 取消最大化,并缩小窗口,能看到代码就行。
2. 按一下 F10(单步执行),会看到屏幕上出现一个黄色的小箭头,指示将要执行的代码。
3. 当箭头指向 initgraph 语句时,按 F10,能看到窗口发生了变化。
4. 将新的绘图窗口和 VC 并排放,相互不要有覆盖。这步很重要,否则绘图内容将会被 VC
窗口覆盖。
5. F10 执行 getch 后,记得激活绘图窗口,并按任意键,否则程序不会继续执行。
6. closegraph 后,直接按 F5 执行全部剩余程序,结束。
单步执行很重要,可以让你知道程序执行到哪里是什么效果,哪条语句执行出了问题等等。
3:熟悉更多的绘图语句
[常用的绘图语句]
line(x1, y1, x2, y2); // 画直线 (x1,y1)-(x2,y2),都是整形
circle(x, y, r); // 画圆,圆心为(x,y),半径为 r
putpixel(x, y, c); // 画点(x,y),颜色 c
还有很多,如画椭圆、圆弧、矩形、多边形,等等,请参考绘图帮助文件(目录页的绘图库
的下载里面有)
[设置颜色]
setcolor(c); // 设置绘图颜色,如 setcolor(RED)设置为红色等
常用的颜色常量可以用:
BLACK 黑 DARKGRAY 深灰
BLUE 蓝 LIGHTBLUE 亮蓝
GREEN 绿 LIGHTGREEN 亮绿
CYAN 青 LIGHTCYAN 亮青
RED 红 LIGHTRED 亮红
MAGENTA 紫 LIGHTMAGENTA 亮紫
BROWN 棕 YELLOW 黄
LIGHTGRAY 浅灰 WHITE 白
[配出更多的颜色]
颜色除了前面写的 16 种以外,还可以自由配色。格式:
RGB(r, g, b)
r / g / b 分别表示红色、绿色、蓝色,范围都是 0~255。
例如,RGB(255,0,0) 表示纯红色。
红色和绿色配成黄色,因此 RGB(255,255,0) 表示黄色。
嫌调色麻烦可以用画笔里面的调色试试,调好了以后直接将数值抄过来就行。
例如,画两条红色浓度为 200 的直线,可以写:
setcolor(RGB(200,0,0));
line(100,100, 200,100);
line(100,120, 200,120);
[用数字表示颜色]
除了用 RGB(r,g,b)方式外,还可以用 16 进制表示颜色,格式:
0xrrggbb
例如,setcolor(0xff0000) 和 setcolor(RGB(255,0,0)) 是等效的。
[延时语句]
这个很简单 Sleep(n) 就可以表示 n 毫秒的延时。例如延时 3 秒,可以用 Sleep(3000);
[作业]
1. 简单看一下绘图库的帮助文件,了解更多的绘图语句。
2. 绘制更丰富的图形内容,不低于 20 行。
3. 将延时语句适当的插入上个作业的代码中,看看执行效果。
注:绘图语句不需要记住,用的时候翻翻手册就行。
4:结合流程控制语句来绘图
[范例]
例如,画 10 条直线的代码:
#include
#include
void main()
{
initgraph(640, 480);
for(int y=100; y<200; y+=10)
line(100, y, 300, y);
getch();
closegraph();
}
换一下循环的范围和间隔,看看效果。
还可以用来画渐变色,例如:
#include
#include
void main()
{
initgraph(640, 480);
for(int y=0; y<256; y++)
{
setcolor(RGB(0,0,y));
line(100, y, 300, y);
}
getch();
closegraph();
}
[熟悉 if 语句]
这步需要自学,看看自己手边的书,是怎样讲 if 语句的,简单看看就行。
配合 if 语句,实现红色、蓝色交替画线:
#include
#include
void main()
{
initgraph(640, 480);
for(int y=100; y<200; y+=10)
{
if ( y/10 % 2 == 1)
// 判断奇数行偶数行
setcolor(RGB(255,0,0));
else
setcolor(RGB(0,0,255));
line(100, y, 300, y);
}
getch();
closegraph();
}
[作业]
1. 画围棋棋盘。
2. 画中国象棋的棋盘
3. 画国际象棋的棋盘,看手册找到颜色填充语句,实现过期象棋棋盘的区块填充。
4. 自学 while 语句。
学到这里,已经可以画出很多东西了。把自己想象中的图案绘制一下吧。
5:数学知识在绘图中的运用
1. 最简单的,来个全屏的渐变色吧,是上一课的扩展。就是需要将 0~255 的颜色和 0~479
的 y 轴对应起来
c 表示颜色,范围 0~255
y 表示 y 轴,范围 0~479
于是:
c / 255 = y / 479
c = y / 479 * 255 = y * 255 / 479 (先算乘法再算除法可以提高精度)
看代码:
#include
#include
void main()
{
initgraph(640, 480);
int c;
for(int y=0; y<480; y++)
{
c = y * 255 / 479;
setcolor(RGB(0,0,c));
line(0, y, 639, y);
}
getch();
closegraph();
}
试试效果吧。
2. 画一个圆形的渐变色
首先,我们要用到圆形的基本公式:
x*x + y*y = r*r
让弧度从 0~2*3.14,然后需要根据弧度和半径算出(x,y),
用 pi 表示圆周率
用 r 表示半径
用 a 表示弧度(小数)
用 c 表示颜色
于是:
x=r*cos(a)
y=r*sin(a)
c=a*255/(2*pi)
看看代码:
#include
#include
#include
void main()
{
initgraph(640, 480);
int c;
double a;
int x, y, r=200;
for(a=0; a
#include
void main()
{
initgraph(640, 480);
for(int y=0; y<480; y++)
{
// 绘制绿色直线
setcolor(GREEN);
line(0, y, 639, y);
// 延时
Sleep(10);
// 绘制黑色直线(即擦掉之前画的绿线)
setcolor(BLACK);
line(0, y, 639, y);
}
closegraph();
}
再看一个例子,实现一个圆从左往右跳动:
#include
#include
void main()
{
initgraph(640, 480);
for(int x=100; x<540; x+=20)
{
// 绘制黄线、绿色填充的圆
setcolor(YELLOW);
setfillstyle(GREEN);
fillellipse(x, 100, 20, 20);
// 演示
Sleep(500);
// 绘制黑线、黑色填充的圆
setcolor(BLACK);
setfillstyle(BLACK);
fillellipse(x, 100, 20, 20);
}
closegraph();
}
也就是说,移动的间距小、延时短,动画就会越细腻。但当画面较复杂时,会带来画面的闪
烁(怎样消除闪烁是以后的话题)。
7:捕获按键,实现动画的简单控制
最常用的一个捕获按键的函数:getch()
前几课,都把这个函数当做“按任意键继续”来用,现在我们用变量保存这个按键:
char c = getch();
然后再做判断即可。
不过程序执行到 getch() 是会阻塞的,直到用户有按键才能继续执行。可游戏中总不能因
为等待按键而停止游戏执行吧?所以,要有一个函数,判断是否有用户按键:kbhit()
这个函数返回当前是否有用户按键,如果有,再用 getch() 获取即可,这样是不会阻塞的。
即:
char c;
if (kbhit())
c = getch();
举一个简单的例子,如果有按键,就输出相关按键。否则,输出“.”。每隔 100 毫秒输出一
次。按 ESC 退出。
注:ESC 的 ASCII 码是 27。
完整代码如下:
#include
#include
#include
void main()
{
char c = 0;
while(c != 27)
{
if (kbhit())
c = getch();
else
c = '.';
printf("%c", c);
Sleep(100);
}
}
结合上一课的简单动画,就可以做出来靠按键移动的图形了吧,看以下代码,实现 a s 控
制圆的左右移动:
#include
#include
void main()
{
initgraph(640, 480);
int x = 320;
// 画初始图形