logo资料库

VC-easyx绘图游戏简易教程.doc

第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
资料共32页,剩余部分请下载后查看
1:创建新项目
2:简单绘图,学习单步执行
3:熟悉更多的绘图语句
4:结合流程控制语句来绘图
5:数学知识在绘图中的运用
6:实现简单动画
7:捕获按键,实现动画的简单控制
8:用函数简化相同图案的制作
9:绘图中的位运算
10:用鼠标控制绘图/游戏程序
11:随机函数
12:数组
13:getimage / putimage / IMAGE  的用法 getimage
14:通过位运算实现颜色的分离与处理
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; // 画初始图形
分享到:
收藏