GameMaker8.0 :新手教程 Part 18 -绘制图像-

分类栏目:gamemaker教程

621

GameMaker8.0 :新手教程 Part 18 -绘制图像-

1、draw事件

在GM8众多的事件中,有一个叫做draw的事件,即绘制事件。
GameMaker8.0 :新手教程 Part 18 -绘制图像-
绘制事件与步事件一样,是每一步都会执行一次的事件。
那么绘制事件和步事件有什么区别呢?
第一,执行顺序不同
现在来复习一下GM的事件执行顺序:
步开始事件
计时器事件
键盘事件
鼠标事件
步事件
(实例移动到新位置)
碰撞事件
步结束事件
绘制事件
绘制事件是一步之内最后执行的那个事件。
第二,功能不同
绘制事件是GM中唯一能够实现“绘制”的事件。正常情况下,draw_函数(即以draw_开头的函数及其衍生函数),只有写在绘制事件里才能生效。
准确的说,如果绘制目标是游戏屏幕,则必须经由绘制事件实现。后期我们会学到,可以改变绘制目标到表面(surface)上,这时draw_函数可以不写在绘制事件中。
第三,实例有隐藏的默认绘制事件
如果你没有给对象添加绘制事件,那么它的实例会自动包含一个隐藏的绘制事件,这个绘制事件只执行一个操作:绘制自身精灵,即相当于:
draw_sprite_ext(sprite_index, image_index, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);
如果你添加了绘制事件,那么原本的默认绘制事件会自动消失,也就是说实例不再绘制自己的精灵。你可以向绘制事件中添加上述代码来绘制自身精灵。在GMS中,你可以使用draw_self();代替,在GM8中,你也可以新建一个脚本drawSelf,写入上述代码,以后调用drawSelf();来绘制自身。
注意:
①通过绘制事件绘制的图案并不会影响到实例的碰撞盒,实例的碰撞盒只取决于自身的mask属性(受image_函数的影响)。
②绘制事件应保持纯粹。绘制事件每一步都执行一次,所以它看起来能承当步事件的所有职责。但是,不建议把draw_函数以外的代码,尤其是涉及到变量自增自减的代码放在绘制事件中执行。绘制事件应该只承担“绘制”这一功能。在讲解表面时我们会实际感受到问题。
③代码自上而下执行,在绘制事件中,后执行的绘制函数会把图像画在更表层,从而遮挡住先前执行的绘制函数的图像。但是,所有绘制的图像的深度都和实例的深度一致。

2、精灵的绘制

本节位于GML汉化文档43-44页。
GM用来绘制精灵的函数,大都以draw_sprite开头,例如上一节提到的draw_sprite_ext。其中ext指extend,即“扩展,延伸”。
这些函数常用的参数有:
sprite,指填入一个精灵名或索引。索引一般指用变量储存的值,如first = sprBlock3;draw_sprite(first, ...);。
subimg,即sub-image,子图,填入子图索引。填-1表示使用当前索引,等效于填入image_index。注意使用draw_系列函数不会影响image_speed,如果精灵是动态图,那么subimg填写-1时绘制的也是动态图。
x,y,将图像绘制在(x, y)的位置,其中图像的原点与(x, y)重合。
xscale, ysacle,缩放的比例,1为不缩放。
rot,即rotate,精灵旋转的角度,类似于image_angle。
alpha,绘制精灵的透明度,类似于image_alpha。
color,混合颜色,填写c_white表示原样绘制,类似于image_blend。混色是个复杂的话题,需要专门讲解,现在可以暂时理解为蒙上一层颜色。注意填写c_white图像会原样绘制,并不是没有发生混色,而是根据混色的原理,任意色+白色=原色。
draw_sprite(sprite,subimg,x,y) 在坐标(x,y)绘制子图像 subimg (-1 代表当前子图像,0到N代表各子图像编号)。(不包含颜色混合和阿尔法透明通道)
draw_sprite_stretched(sprite,subimg,x,y,w,h) 将精灵扩展填充至左上角坐标为(x,y),宽度高度分别为w,h的方形区域内。
draw_sprite_tiled(sprite,subimg,x,y) 将精灵作为图块在整个房间内进行绘制。(x,y) 是其中精灵的绘制坐标。
draw_sprite_part(sprite,subimg,left,top,width,height,x,y) 在坐标(x,y)绘制指定范围内的子图像的子图区域 (-1 代表当前子图像)(从子图像内位置 left,top,width,height )。
draw_sprite_ext(sprite,subimg,x,y,xscale,yscale,rot,color,alpha) 代表所要绘制的精灵,subimg 代表要绘制的具体子图像,(x,y) 代表绘制的坐标,(xscale,yscale) 代表要绘制的具体缩放尺寸, rot 代表图像逆时针旋转绘制的角度,color 代表需要混合的颜色(c_white 为默认值),alpha 代表要绘制的阿尔法透明通道数值(0 代表完全透明, 1 代表完全不透明)。这个函数可以创造很多的效果(比如部分透明的爆炸效果)。
draw_sprite_stretched_ext(sprite,subimg,x,y,w,h,color,alpha) 绘制精灵拉伸如此精灵填充在x,y,宽,高的区域里,color是混合色,alpha是透明度。
draw_sprite_tiled_ext(sprite,subimg,x,y,xscale,yscale,color,alpha) 绘制精灵贴图,精灵填充整个房间但是以scale比例,color颜色,alpha透明度。
draw_sprite_part_ext(sprite,subimg,left,top,width,height,x,y,xscale,yscale,color,alpha) 绘制精灵子图的部分(-1为当前子图)按照left,top,width,height尺寸,以scale比例,color颜色,alpha透明度。
draw_sprite_general(sprite,subimg,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha) 常规绘制函数,它绘制精灵子图的部分(-1=当前子图)按照left,top,width,height尺寸,以scale比例,rot旋转角度,四角混合颜色(左上,右上,右下,左下),alpha透明度。
对于函数draw_sprite_tiled,其实就是铺满整个屏幕,(x, y)指定其中一张图像的原点与(x, y)重合:
GameMaker8.0 :新手教程 Part 18 -绘制图像-
对于函数draw_sprite_part,是指绘制图像的一部分,这部分由四个参数决定,左上角坐标(left, top)(以图像左上角为原点),右下角坐标(left + width, top + height),然后将这部分图像绘制在(x, y)的位置,其中新图像的左上角(0, 0),也就是原图像的(left, top)与(x, y)重合。
对于函数draw_sprite_general,最好在学习混色之后再使用。

3、背景图片的绘制

背景图片的绘制与精灵的绘制几乎相同。区别在于背景图片一定是单张的,所以没有subimg这个参数。
draw_background(back,x,y) 绘制背景在坐标(x,y)。(不包含颜色混合和阿尔法透明通道)
draw_background_stretched(back,x,y,w,h) 将背景扩展填充至左上角坐标为(x,y),宽度高度分别为w,h的方形区域内。
draw_background_tiled(back,x,y) 背景作为片平铺在房间中,以(x,y)为起始点。
draw_background_part(back,left,top,width,height,x,y) 绘制背景部分,以左上为原点的x,y。
draw_background_ext(back,x,y,xscale,yscale,rot,color,alpha) 绘制背景按比例,旋转,混合色(用c_white为无混合)和透明度(0-1)。
draw_background_stretched_ext(back,x,y,w,h,color,alpha) 绘制背景拉伸以范围,混合颜色,透明度设定。
draw_background_tiled_ext(back,x,y,xscale,yscale,color,alpha) 绘制背景贴图填充整个房间但是以scale比例,color颜色,alpha透明度。
draw_background_part_ext(back,left,top,width,height,x,y,xscale,yscale,color,alpha) 绘制显示背景的部分,按照left,top,width,height尺寸,以scale比例,color颜色,alpha透明度。
draw_background_general(back,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha)常规绘制函数,它绘制背景的部分(-1=当前子图)按照left,top,width,height尺寸,以scale比例,rot旋转角度,四角混合颜色(左上,右上,右下,左下),alpha透明度。 注意旋转以左上为中心。
复制代码

4、基础形状绘制

本节位于GML汉化文档45-46页。
GM提供了一些基础形状的绘制函数,例如线,三角形,圆等。
绘制基础形状比绘制图像要复杂一点,因为在绘制基础形状之前,你需要先设定绘制参数:
draw_set_color(col) 设置当前绘制颜色。
draw_set_alpha(alpha) 设置当前绘制时的阿尔法透明通道值。(从0 到1,0代表完全透明,1代表完全不透明)。
复制代码
draw_set_color(col)的参数col可以填写GM8提供的常量,如下:
c_aqua 水色
c_black 黑色
c_blue 蓝色
c_dkgray 深灰
c_fuchsia 紫红
c_gray 灰色
c_green 绿色
c_lime 石灰色
c_ltgray 浅灰
c_maroon 赤褐色
c_navy 深蓝
c_olive 茶青色
c_orange 橙色
c_purple 紫色
c_red 红色
c_silver 银色
c_teal茶绿色
c_white白色
c_yellow 黄色

你也可以使用make_color_rgb(red, green, blue)和make_color_hsv(hue, saturation, value)的返回值,关于这两个函数的参数请参考第十章RGB与HSV
另外,你也可以使用"$"代表十六进制颜色,比如$D1124A,但是注意,GM的颜色十六进制并不是传统RGB的顺序,而是BGR顺序,也就是说,$0000FF不是蓝色而是红色。虽然不知道为什么GM8要使用这种奇怪的顺序,但是这个“优良传统”一直延续到了GMS2之中,所以值得注意。
注意,这两个函数是全局设置,一旦调用,整个游戏所有地方都会使用你设置的值。所以,要养成绘制结束后设置回默认值的好习惯:
draw_set_color(c_blue);
draw_set_alpha(0.5);
绘制的内容。。。
draw_set_color(c_white);
draw_set_alpha(1);

除了对颜色和透明度的设置,对于圆形有一个特别的设置:
draw_set_circle_precision(precision) 设置绘制圆的精度,就是由多少段组成,精度必须在4-64之间并被4整除,这也被使用在椭圆和圆角方形中。
参数precision填不同值的效果如下:
GameMaker8.0 :新手教程 Part 18 -绘制图像-
GM提供了以下基本图形的绘制:
draw_point(x,y) 在坐标(x,y) 上绘制一个使用当前颜色的点。
draw_line(x1,y1,x2,y2) 从坐标(x1,y1)到(x2,y2)绘制一条直线。
draw_line_width(x1,y1,x2,y2,w) 从坐标(x1,y1)到(x2,y2)绘制一条直线,宽为w。
draw_rectangle(x1,y1,x2,y2,outline) 在指定坐标之间绘制一个矩形。outline指定是只描绘边框(真 true),还是要填充整个区域(假 false)。
draw_roundrect(x1,y1,x2,y2,outline) 在指定坐标之间绘制一个圆角矩形。outline指定是只描绘边框(真 true),还是要填充整个区域(假 false)。
draw_triangle(x1,y1,x2,y2,x3,y3,outline) 在指定坐标之间绘制一个三角形。outline指定是只描绘边框(真 true),还是要填充整个区域(假 false)。
draw_circle(x,y,r,outline) 以坐标(x,y)为圆心,r为半径绘制一个圆形。outline指定 是只描绘边框(真 true),还是要填充整个区域(假 false)。
draw_ellipse(x1,y1,x2,y2,outline) 绘制一个椭圆。outline 指定是只描绘边框(真 true),还是要填充整个区域(假 false)。
draw_arrow(x1,y1,x2,y2,size) 绘制一个从坐标(x1,y1)到(x2,y2) 的箭头。size指定箭头的尺寸,单位像素。
draw_button(x1,y1,x2,y2,up) 绘制一个按钮,up 指定按钮状态为上(1)还是下(0)。
draw_path(path,x,y,absolute) 通过这个函数你可以从房间坐标(x,y)开始绘制一条指定的路径path。如果absolute为真,路径就会以原先设定的位置进行绘制,而x和y就被无视 了。
draw_healthbar(x1,y1,x2,y2,amount,backcol,mincol,maxcol,direction,showback,showborder) 绘制一个血条。(或者其他任何一种表现数值变化的颜色条,比如:攻击力)。(x1,y1)和(x2,y2)代表整个条的范围。amount代表条内颜色填充程度的百分比(从0到100)。backcol为条的背景颜色,mincol和maxcol代表条从0 到100之间的颜色变化。中间值在两端颜色之间渐变。direction代表条的绘制方向。0代表从左边开始,1代表从右边开始,2代表从上开始,3代表从下开始。showback 指定是否显示背景框,showborder 指定是否显示边框。
同样的,绘制基本图形的深度也与实例保持一致,并且后绘制的图案会覆盖在先绘制的图案上。