VC绘图简易教程.docx
- 文档编号:23321500
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:43
- 大小:31.53KB
VC绘图简易教程.docx
《VC绘图简易教程.docx》由会员分享,可在线阅读,更多相关《VC绘图简易教程.docx(43页珍藏版)》请在冰豆网上搜索。
VC绘图简易教程
VC
绘
图
游
戏
编
程
入
门
——刘小备整理
目录
前言3
1:
创建新项目4
2:
简单绘图,学习单步执行5
3:
熟悉更多的绘图语句7
4:
结合流程控制语句来绘图9
5:
数学知识在绘图中的运用11
6:
实现简单动画13
7:
捕获按键,实现动画的简单控制13
8:
用函数简化相同团的制作16
9:
绘图中的位运算17
10:
用鼠标控制绘图/游戏程序21
11:
随机函数23
12:
数组25
13:
getimage/putimage/IMAGE的用法29
14:
通过位运算实现颜色的分离与处理31
15:
窗体句柄(windows编程入门)33
16:
设备上下文句柄(windows编程入门2)34
前言
学习目标
能做简单的图形小游戏
讲解以简单实用为主,不要指望看了这几篇文章就能过耳机考试
锻炼编程思想
学习方式
自学为主
学习要求
多实践
使用平台
VC++6.0
请到下载最新的EasyX,并安装
XXeasyx吧发帖说明
1:
创建新项目
学会在VC里面创建项目,并写简单的程序
VC写程序要有项目的概念,一个项目可以有多个.cpp文件,多个项目构成一个工作区。
记住这两个英文单词:
Workspace:
工作区
Project:
项目
以下是创建项目的视频演示:
下载VC6_new_project.zip,打开看看,flash格式的。
看明白后,自己动手简历项目试试,并输入以下代码:
#include
Voidmain()
{
Printf(“HelloWorld!
”);
}
然后输入以下代码试试(无需理解代码含义)
#include
#include
Voidmain()
{
Initgraph(640,480);
Line(200,240,440,240);
Line(320,120,320,360);
Getch();
Closegraph();
}
执行后应该可以看到屏幕正中央有一个十字。
成功,classover。
2:
简单绘图,学习单步执行
【本期目标】
学会简单绘图,并学会简单调试
先看看上一课的代码,我加上了注释
#include
#include
Voidmain()
{
Initgraph(640,480);//出生640*480的绘图屏幕
Line(200,240,440,240);//画线(200,240)-(440,240)
Line(320,120,320,360);//画线(320,120)-(320,260)
Getch();//按任意键
Closegraph();//关闭绘图屏幕
}
解释一下
1.创建的绘图屏幕640*480,表示横向有640个店,纵向有480个点。
注意:
左上角是原点(0,0),也就是说,y轴(向下为正)和数学的y轴是相反。
2.getch实现按任意键功能,按任意键后,程序继续执行,否则,程序会立刻执行closegraph以至于看不到绘制的内容。
【作业】
用线条画出更多的图形,要求不少于10条直线。
【学习单步执行】
完成作业后(务必完成),开始试着单步执行刚才的程序,有用绘图和多线程等因素的限制,请务必按照以下步骤尝试(熟练了以后就不用了):
1.将VC取消最大化,并缩小窗口,能看到代码就行。
2.按下F10(单步执行),会看到屏幕上出现一个黄色的小箭头,指示将要执行的代码。
3.当箭头指向initgrach语句时,按F10,能看到窗口发生了变化。
4.将新的绘图窗口和VC并排放,相互需要有覆盖。
这不很重要,否则绘图内容将会被VC窗口覆盖
5.按F1-执行getch后,记得激活绘图窗口,并按任意键,否则程序就不会继续执行。
6.closegraph后,直接按F5执行全部升序的程序,结束。
单步执行很重要,可以让你知道程序执行到哪里是什么效果,哪条语句执行除了问题等等。
更详细的调试资料,请打开:
下载里面的VC6_how_to_debug.zip
该文档写的调试的东西比较多,看一下大概有个了解,以后都会用到(不过以后我就不再讲了)
【作业2】
仍然是写一个用直线绘制的图形,并熟悉调试过程。
注:
1.许多学校都忽略了调试部分,如果你不曾用过调试,请务必熟悉该过程。
2.tc没有调试,请使用有调试功能的IDE
3:
熟悉更多的绘图语句
【学习目标】
学会更多的绘图语句
【常用的绘图语句】
Line(x1,y1,x2,y2);//画直线(x1,y1)-(x2,y2),都是整形
Cirele(x,y,r)//画圆,圆心(x,y),半径为r
Putplixel(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:
结合流程控制语句来绘图
【学习目标】
熟练使用循环、判断语句
【熟悉for语句】
这步需自学,看看自己手边的书,是怎样讲for语句的,简单看看就行
【范例】
例如,画10跳直线的代码
#include
#include
Voidmain()
{
Initgraph(640,480);
Fro(inti=100;i<200;i+=10)
Line(100,y,300,y)
Getch();
Closegraph();
}
换一下循环的范围和间隔,看看效果
还可以用来画渐变色,例如
#include
#include
Voidmain()
{
Initgraph(640,480);
For(inti=0;i<256;i++)
{
Setcolor(RGB(0,0,i));
Line(100,y,300,y);
}
}
【熟悉if语句】
这步需自学,看看自己手边的书,是怎样讲for语句的,简单看看就行
配合if语句,实现红色、蓝色交替画线:
、
#include
#include
Voidmain()
{
Initgraph(640,480);
For(inti=100;i<200;i+=10)
{
If(y/10%2==1)
Setcolor(RGB(255,0,0));
Else
Setcolor(RGB(0,00,255));
Line(100,i,300,i);
}
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
Voidmain()
{
Initgraph(640,480);
Intc;
For(inty=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
Voidmain()
{
Initgraph(640,480);
Intc;
Doublea;
Intx,y,r=200;
For(a=0;a { X=(int)(r*cos(a)+320+0.5); Y=(int)(r*sin(a)+240+0.5); C=(int)(a*255/(2*pi)+0.5); Setcolor(RGB(c,0,0)); Line(320,240,x,y); } Getch(); Closegraph(); } 【作业】 这次没什么作业,只是理解一下数学的重要性而已。 如果读者还在念书,请重视数学。 6: 实现简单动画 所谓动画,其实是连续显示一系列图形而已。 结合程序上,我们需要以下几个步骤: 1.绘制图像 2.延时 3.擦掉图像 循环以上即可实现动画。 举一个例子,我们实现一条直线从上往下移动: #include #include Voidmain() { Initgraph(640,480); For(inty=0;y<480;y++) { Setcolor(GREEN);//绘制绿色直线 Line(0,y,639,y); Seloop(10);//延时 Setcolor(BLACK);//绘制黑色直线,即擦掉之前的绿线 Line(0,y,639,y); } Closegraph(); } 也就是说,移动的间距越小、延时短,动画就会越细腻,但当画面教复杂时,会带来画面的闪烁(怎样消除闪烁是以后的话题) 【作业】 绘制一个沿45度移动的球,碰到窗口边界后反弹。 7: 捕获按键,实现动画的简单控制 最常用的一个捕获按键的函数: getch() 前几课,都把这个函数当做“按任意键继续”来用,现在我们用变量保存这个按键: charc=getch(); 然后再判断即可。 不过程序执行到getch()是会阻塞的,知道用户有按键才能继续执行。 可游戏中总不能因为等待按键而停止游戏执行吧? 所以,要有一个函数,判断是否有用户按键: kbhit()这个函数返回当前是否有用户按键,如果有,再用getch()获取即可,这样是不会阻塞的。 即: Charc; If(kbhit()) C=getch(); 举一个简单的例子,如果有按键,就输出相关按键。 否则,输出“。 ”。 每隔100毫秒输出一次。 按esc退出。 注: esc的ASCII码是27. 完整代码如下: #include #Include #include Voidmain() { Charc=0; While(c! =27) { If(kbhit()) C=getch(); Else C=‘.’; Printf(“%c”,c); Sleep(100); } } 结合上一课简单动画,就可以做出来靠按键移动的图形了吧,看一下代码,实现as控制圆的左右移动: #include #include Voidmain() { Initgraph(640,480); Intx=320; //画初始图形 Setcolor(YELLOW); Setfillstyle(GREEN); Fillellipse(x,240,20,20); Charc; While(c! =27)//获取按键 { C=getch(); //先擦出上次显示的旧图形 Setcolor(BLACK); Setfillstyle(BLACK); Fillellipse(x,240,20,20); //根据输入,计算新的坐标 Switch(c) { Case‘a’: X-=2;break; case‘d’: x+=2;break; } //绘制新的图形 Setcolor(YELLOW); Setfillstyle(GREEN); Fillellipse(x,240,20,20); //延时 Sleep(10); } Closegraph(); } 【作业】 请继续完成这个程序,实现以下功能: 1.上下的控制 2.边界的检测 3.结合kbhit实现惯性移动(即按一下方向键,圆就会一直向这个方向移动) 8: 用函数简化相同团的制作 总目录: (里面包括VC下graphics.h的配置方法) 实习中有许多类似的团,如果一一单独绘制,太麻烦。 于是,我们需要一个公用的绘制过程,就是函数。 例如,我们需要5个三角形,位于不同的位置。 我们可以将绘制单个三角形的过程写成函数,函数内是一个独立的程序段,这个绘制过程狠简单。 然后,在需要绘制的时候,调用这个函数即可。 可以通过参数来解决细微差异(图案的坐标、颜色等),例如: #include #include //在坐标(x,y)处,用颜色c绘制三角形 Voidsanjiaoxing(intx,inty,intc) { Setcolor(c);//设置画线颜色 //画三角形的三条边 Line(x,y,x+50,y); Line(x,y,xy,y+50); Line(x+50,y,x,y+50); } Voidmain() { Initgraph(640,480); Sanjiaoxing(100,100,RED); Sanjiaoxing(120,160,BLUE); Sanjiaoxing(140,220,GREEN); Sanjiaoxing(160,120,BLUE); Getch(); Closegraph(); } 再结合循环等控制条件,就能绘制更复杂漂亮的图案了。 试试运行下面程序,理解一下函数的用处。 #include #include Voidsanjiaoxing(intx,inty,intc) { Setcolor(c);//设置画线颜色 //画三角形的三条边 Line(x,y,x+10,y); Line(x,y,xy,y+10); Line(x+10,y,x,y+10); } Voidmain() { Initgraph(640,480); For(intx=10;x<640;x+=10) For(inty=0;y<480;y+=10) Sanjiaoxing(x,y,RGB(X*255/640,Y*255/480,0)); Getch(); Closegraph(); } 【作业】 1.绘制Windows自带游戏“扫雷”的初始界面。 9: 绘图中的位运算 位运算和位图有什么关系? 先举个例子来个感性认识: 使用XOR运算可以实现擦除图形后不破坏背景,这种时钟程序绘制表针是很有用的,稍后我们会给出这样的例子。 【位运算的运算法则】 位运算主要分4种: NOT、ANT、OR、XOR 位运算的运算对象是二进制数(十进制要转换为二进制,计算机会自动转换)。 运算法则如下: 1.NOT 表示去翻,将二进制位的1变0,、0变1。 C语言用符号~表示 如: 二进制: ~1101==0010 用十进制表示就是: ~13==2 2.AND 表示“并且”,只有两数的对应二进制位都为1,结果的二进制才为1;否则,结果的二进制位为0. C语言用符号&表示。 如: 二进制: 1101&0110==0100 用十进制表示就是13^&6=4 3.OR 表示“或者”,两数对应二进制位只要有一个是1,结果的二进制位就是1: 否则,结果的二进制位为0. C语言用符号|表示 如: 二进制: 0101|0110==0111 用十进制表示就是: 5|6=7 4.XOR 表示“异或”,两数的对应二进制位不同,结果的二进制位为1: 相同,结果的二进制位0. C语言用符号^表示。 如: 二进制: 0101^1110==1011 以上只是简单介绍一下,详细的还是轻大家看课本上的讲解。 【位运算的应用】 位运算的应用很多,例如ADN或OR在获取和设置标志位时经常使用。 更多的,以后大家会逐渐遇到,暂时先记下有这么回事。 这里着重说下XOR运算,它有一个重要的特效: (a^b)^b=a; 也就是说,a^b之后可能是某些其他数字,但只要再^b一下,就又变成了a 一些简单的加密就用的XOR这个特效。 至于绘图,加入a是背景图案,b是将要绘制的团,只要用XOR方式绘图,连晖两次,那么背景是不变的。 【演示】 我们来一个简单的XOR运算演示 #include #include Voidmain { Initgraph(640,480); Setlinestyle(PS_SOLID,NULL,10);//设置线宽为10 Rectangle(100,100,200,200);//画一个矩形,当背景。 Setwritemode(R2_XORPEN);//设置XOR绘图模式 Setcolor(RED) Line(50,0,200,300);//画线 Getch(); Line(50,0,200,300)//画线(XOR方式重复画线会回复背景图案) Getch(); Closegraph(); } 运行一下,看到第一次画线后,矩形与直线相交的部分,颜色变成了青色,青色就是白色和红色XOR的值。 当再次以红色画线时,青色部分就消失了,还原为完整的白色矩形框 【完整的范例】 来一个相对完整的范例吧,就是钟表程序,三个表针用的都是XOR方式绘制,请大家运行体会一下XOR的作用: #include #include #include VoidDraw(inthour,intminute,intsecond) { Doublea_hour,a_min,a_sec;//时、分、秒针的弧度值 Intx_hour,y_hour,x_min,y_min,x_sec,y_sec;//时分秒针的末端位置 //计算时分秒针的弧度值 a_sec=second*2*PI/60; a_min=minute*2*PI/60+a_sec/60; a_hour=hour*2*PI/12+a_min/12; //计算时分秒针的末端位置 X_sec=320+(int)(120*sin(a_sec)); Y_sec=240–(int)(120*cos(a_sec)); X_min=320+(int)(120*sin(a_min)); Y_min=240–(int)(120*cos(a_min)); X_hour=320+(int)(120*sin(a_hour)); Y_hour=240–(int)(120*cos(a_hour)); //画时针 Setlinestyle(PS_SDLID,NULL,10); Setcolor(WHITE); Line(320,240,x_hour,y_hour); //画分针 Setlinestyle(PS_SOLID,NULL,6); Setcolor(LIGHTGRAY); Line(320,240,x_min,y_min);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 绘图 简易 教程