VCeasyx绘图游戏简易教程Word格式.docx

上传人:b****5 文档编号:16264358 上传时间:2022-11-22 格式:DOCX 页数:14 大小:22.61KB
下载 相关 举报
VCeasyx绘图游戏简易教程Word格式.docx_第1页
第1页 / 共14页
VCeasyx绘图游戏简易教程Word格式.docx_第2页
第2页 / 共14页
VCeasyx绘图游戏简易教程Word格式.docx_第3页
第3页 / 共14页
VCeasyx绘图游戏简易教程Word格式.docx_第4页
第4页 / 共14页
VCeasyx绘图游戏简易教程Word格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

VCeasyx绘图游戏简易教程Word格式.docx

《VCeasyx绘图游戏简易教程Word格式.docx》由会员分享,可在线阅读,更多相关《VCeasyx绘图游戏简易教程Word格式.docx(14页珍藏版)》请在冰豆网上搜索。

VCeasyx绘图游戏简易教程Word格式.docx

[常用的绘图语句]

line(x1,y1,x2,y2);

简单看一下绘图库的帮助文件,了解更多的绘图语句。

2.绘制更丰富的图形内容,不低于20行。

3.将延时语句适当的插入上个作业的代码中,看看执行效果。

注:

绘图语句不需要记住,用的时候翻翻手册就行。

-4:

结合流程控制语句来绘图

[范例]

例如,画10条直线的代码:

for(inty=100;

y<

200;

y+=10)

line(100,y,300,y);

换一下循环的范围和间隔,看看效果。

还可以用来画渐变色,例如:

for(inty=0;

256;

y++)

{

setcolor(RGB(0,0,y));

}

[熟悉if语句]

这步需要自学,看看自己手边的书,是怎样讲if语句的,简单看看就行。

配合if语句,实现红色、蓝色交替画线:

if(y/10%2==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(先算乘法再算除法可以提高精度)

看代码:

intc;

480;

c=y*255/479;

setcolor(RGB(0,0,c));

line(0,y,639,y);

试试效果吧。

2.画一个圆形的渐变色

首先,我们要用到圆形的基本公式:

x*x+y*y=r*r

让弧度从0~2*,然后需要根据弧度和半径算出(x,y),

用pi表示圆周率

用r表示半径

用a表示弧度(小数)

用c表示颜色

x=r*cos(a)

y=r*sin(a)

c=a*255/(2*pi)

看看代码:

doublea;

intx,y,r=200;

for(a=0;

a<

PI*2;

a+=

x=(int)(r*cos(a)+320+;

y=(int)(r*sin(a)+240+;

c=(int)(a*255/(2*PI)+;

setcolor(RGB(c,0,0));

line(320,240,x,y);

6:

实现简单动画

所谓动画,其实是连续显示一系列图形而已。

结合到程序上,我们需要以下几个步骤:

1.绘制图像

2.延时

3.擦掉图像

循环以上即可实现动画。

举一个例子,我们实现一条直线从上往下移动:

每隔100毫秒输出一次。

按ESC退出。

ESC的ASCII码是27。

完整代码如下:

charc=0;

while(c!

=27)

if(kbhit())

c=getch();

else

c='

.'

;

%c"

c);

Sleep(100);

结合上一课的简单动画,就可以做出来靠按键移动的图形了吧,看以下代码,实现as控制圆的左右移动:

intx=320;

上下的控制;

2.边界检测;

3.结合kbhit实现惯性移动(即按一下方向键,圆就会一直向这个方向移动)

上下左右等按键的控制,会返回2个字符。

由于该系列教程面向初学者,因此有兴趣的请查看MSDN。

8:

用函数简化相同图案的制作

实际中有许多类似的图案,如果一一单独绘制,太麻烦。

于是,我们需要一个公用的绘制过程,就是函数。

例如,我们需要画5个三角形,位于不同的位置。

我们可以将绘制单个三角形的过程写成函数,函数内是一个独立的程序段,这个绘制过程很简单。

然后,在需要绘制的时候,调用这个函数即可。

可以通过参数来解决细微差异(图案的坐标、颜色等),例如:

绘制Windows自带游戏“扫雷”的初始界面。

9:

绘图中的位运算

位运算和绘图有什么关系?

先举个例子来个感性认识:

使用XOR运算可以实现擦除图形后不破坏背景,这在时钟程序中绘制表针是很有用的。

稍后我们会给出这样的例子。

一、位运算的运算法则

位运算主要分4种:

NOT、AND、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;

C语言用符号|表示。

0101|0110=0111

5|6=7

4.XOR

表示“异或”,两数的对应二进制位不同,结果的二进制位为1;

相同,结果的二进制位为0。

C语言用符号^表示。

0101^1110=1011

以上只是简单介绍一下,详细的还是请大家看课本上的讲解。

二、位运算的应用

位运算的应用很多,例如AND和OR在获取和设置标志位时经常使用。

更多的,以后大家会逐渐遇到,暂时先记下有这么回事。

这里着重说一下XOR运算,它有一个重要的特性:

(a^b)^b=a

也就是说,a^b之后可能是某些其它数字,但是只要再^b一下,就又成了a。

一些简单的加密就用的XOR的这个特性。

至于绘图,假如a是背景图案,b是将要绘制的图案,只要用XOR方式绘图,连续绘两次,那么背景是不变的。

三、演示

我们来一个简单的绘图XOR运算演示:

.

下面举一个综合的例子(我偷点懒,直接粘贴的绘图库帮助里面的鼠标范例),该程序会用红色的点标出鼠标移动的轨迹,按左键画一个小方块,按Ctrl+左键画一个大方块,按右键退出:

画一个填充的三角形,要用鼠标点选三角形的三个顶点。

提示:

可以用fillpoly函数画多边形。

2.写一个“涂格子(也叫点灯)”的游戏。

详细规则可以试玩网上的各种版本。

3.如果有精力,尝试写一个扫雷吧(这个有点难度,能实现多少就实现多少,无法实现的功能先放下)。

11:

随机函数

[随机函数简介]

游戏中,许多情况都是随即发生的。

还有一些图案程序,例如屏保,也是随即运动的。

这就需要用随机函数。

随机函数很简单,只有一个:

rand()

该函数返回0~32767之间的一个整数。

(不需要记住32767这个数字,大概知道这个范围就行了)

该函数在头文件<

中,使用前记得引用。

[简单测试]

来写个程序测试一下:

intr;

for(inti=0;

i<

10;

i++)

r=rand();

%d\n"

r);

执行后,可以看到输出了10个随机数字。

[指定范围的随机函数]

实际中,我们经常要产生指定范围的随机函数,通常我们用求余数的办法。

例如,产生0~9之间的随机数,只需要将任意产生的随机数除以10求余数即可。

求余数的运算符号是%,我们可以这样做:

r=rand()%10;

修改前面的测试程序执行后可以看到,产生的数字都是小于10的。

如果是1~6之间的怎样求呢?

r=rand()%6+1;

无论产生什么样范围的随机函数,都是通过各种运算将随机数的范围[0,32767]修改为自己需要的范围。

[随机种子]

做了多次试验,我们会发现一个问题:

虽然产生的数字是随机的,但每次产生的数字序列都一样。

为了解决这个问题,我们需要用“随机种子”。

随机函数的产生原理简单来说,就是:

前一个随机函数的值,决定下一个随机函数的值。

根据这个原理我们可以知道:

只要第一个随机函数的值确定了,那么后面数字序列就是确定的。

如果我们想的得到不同的数字序列,我们需要确定第一个随机函数的值,对于设置第一个随机函数的值,叫做设置“随机种子”。

易知,随机种子设置一次即可。

设置随机种子的函数如下:

srand(种子);

通常,我们用当前时间来做随机种子:

srand((unsigned)time(NULL));

因为使用time函数,所以记得引用<

[绘图中的应用]

来一个简单的程序,在屏幕上任意位置画任意颜色的点(按任意键退出):

srand((unsigned)time(NULL));

intx,y,c;

while(!

kbhit())

x=rand()%640;

y=rand()%480;

c=RGB(rand()%256,rand()%256,rand()%256);

putpixel(x,y,c);

1.回顾一下第6课“实现简单动画”的作业:

绘制一个沿45度移动的球,碰到窗口边界后反弹。

将这个球改为任意方向运动,碰到边界后任意反弹。

12:

数组

[一维数组]

数组可以实现批量操作。

比如,我们产生10个随机数,产生后先保存起来,然后输出最大的:

intn[10];

inti;

for(i=0;

n[i]=rand()%1000;

回顾一下上一节课的作业,绘制一个任意反弹的球。

这次,将程序修改成屏幕上有10个任意反弹的球。

2.如果反弹的不是球,而是点呢?

再将某些点之间用线连起来,就可以做一个屏保“变幻线”的程序了。

试试做一个。

3.看完前面的12节课,像贪吃蛇、俄罗斯方块这样的程序都可以做了吧,有时间就尝试写一下。

如果遇到问题,贴吧里贴出来,大家一起讨论。

13:

getimage/putimage/IMAGE 

的用法

getimage/putimage这一组命令和IMAGE对象可以实现加载图片或保存指定区域等功能,下面逐个介绍。

(有点类似tc中的imagesize)

[加载图片]

实现加载图片主要分三步:

1.定义IMAGE对象

2.读取图片至IMAGE对象

3.显示IMAGE对象

很简单,我们看一下完整的代码:

IMAGEimg;

用线条、圆等各种基础绘图语句画一个“汽车”,然后用getimage/putimage实现该“汽车”的平滑移动。

2.自己学一下帮助中BeginBatchDraw/FlushBatchDraw/EndBatchDraw三个函数,可以进一步优化“平滑移动”的效果。

这三个命令挺简单的,一看就懂。

14:

通过位运算实现颜色的分离与处理

[颜色基础]

在EasyX库中,颜色是一个int类型的数据,转换为16进制后的颜色格式是0xbbggrr,其中,bb/gg/rr分别表示两位十六进制的蓝/绿/红颜色值,每种颜色的范围是0x0~0xff,转换为十进制就是0~255。

举几个颜色标示的例子:

颜色 

直接表示 

RGB宏标示

纯绿色 

0x00ff00 

RGB(0,255,0)

青色 

0xffff00 

RGB(255,255,0) 

注:

青=蓝+绿

中灰色 

0x7f7f7f 

RGB(127,127,127)

黄色 

0x00ffff 

RGB(0,255,255) 

黄=红+绿

例如设置绘图颜色为黄色,可以多种方法,例如:

setcolor(YELLOW);

setcolor(RGB(0,255,255));

setcolor(0x00ffff);

[获取颜色]

getpixel是用来获取屏幕颜色的函数,其返回值为int类型的颜色。

例如:

intc=getpixel(100,100);

该语句将返回坐标(100,100)位置的颜色。

[颜色分离与处理]

有时候我们需要修改颜色某一位的值,这时,可以通过位运算来实现。

比如,我们想把某一个点的颜色的红色部分去掉,可以这么做:

c&

=0xffff00;

putpixel(100,100);

我们来看一个完整的程序,这个程序,将图片左半部中的红色“去掉”了,就像是显示器“缺色”的效果:

实现提高/降低图像亮度的程序。

2.自己搜索“灰度算法”,实现彩色图像转换为灰度图像。

(0)

回复

1楼

2010-06-2714:

37

举报 

|

BestAns

吧主

9

关于效率问题,暂时不在讨论范围之内。

有兴趣的可以看看这篇关于灰度算法效率的文章:

转自:

彩色转灰度算法彻底学习 

搜索:

图形学 

file:

Name:

彩色转灰度算法彻底学习

Author:

zyl910

Version:

Updata:

2006-5-22

最近突然又对图形学有了兴趣,翻出了多年前学习图形学的笔记,感触良多。

于是将它们整理好发了上来。

一、基础

对于彩色转灰度,有一个很著名的心理学公式:

Gray=R*+G*+B*

二、整数算法

而实际应用时,希望避免低速的浮点运算,所以需要整数算法。

注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:

Gray=(R*299+G*587+B*114+500)/1000

RGB一般是8位精度,现在缩放1000倍,所以上面的运算是32位整型的运算。

注意后面那个除法是整数除法,所以需要加上500来实现四舍五入。

就是由于该算法需要32位运算,所以该公式的另一个变种很流行:

Gray=(R*30+G*59+B*11+50)/100

但是,虽说上一个公式是32位整数运算,但是根据80x86体系的整数乘除指令的特点,是可以用16位整数乘除指令来运算的。

而且现在32位早普及了(AMD64都出来了),所以推荐使用上一个公式。

三、整数移位算法

上面的整数算法已经很快了,但是有一点仍制约速度,就是最后的那个除法。

移位比除法快多了,所以可以将系数缩放成2的整数幂。

习惯上使用16位精度,2的16次幂是65536,所以这样计算系数:

*65536=≈19595

*65536+=+=≈38469

*65536+=+=7472

可能很多人看见了,我所使用的舍入方式不是四舍五入。

四舍五入会有较大的误差,应该将以前的计算结果的误差一起计算进去,舍入方式是去尾法:

写成表达式是:

Gray=(R*19595+G*38469+B*7472)>

16

2至20位精度的系数:

Gray=(R*1+G*2+B*1)>

2

Gray=(R*2+G*5+B*1)>

3

Gray=(R*4+G*10+B*2)>

4

Gray=(R*9+G*19+B*4)>

5

Gray=(R*19+G*37+B*8)>

6

Gray=(R*38+G*75+B*15)>

7

Gray=(R*76+G*150+B*30)>

8

Gray=(R*153+G*300+B*59)>

9

Gray=(R*306+G*601+B*117)>

10

Gray=(R*612+G*1202+B*234)>

11

Gray=(R*1224+G*2405+B*467)>

12

Gray=(R*2449+G*4809+B*934)>

13

Gray=(R*4898+G*9618+B*1868)>

14

Gray=(R*9797+G*19235+B*3736)>

15

Gray=(R*39190+G*76939+B*14943)>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1