level 11
(零)
很多 GM 玩家不明白:绘制表面是做什么的?
简单来理解吧:它就是个画图板。
它可以和原本的游戏画面叠加在一起,组成复杂的游戏画面。
另一个很大的疑问是:为什么不直接把表面上的图像,绘制到原本的游戏画面上?
区别在于原本的游戏画面是要逐帧刷新的,GM 默认为30fps 。
而绘制表面可以做到想刷新时再刷新。既然应用了绘制表面,十有八九在从创建到销毁的过程中,把刷新都省掉了。
请记下这些结论吧:
不用绘制表面,“在画面上”可以做到应用绘制表面的效果。
应用绘制表面,“在效率上”大幅超越不用绘制表面的效果。
绘制表面其实是个用来优化的功能。不仅仅是运行效率方面,制作时根据情况决定使用绘制表面,可以为你省很多事。
2009年12月08日 07点12分
1
level 11
(一)
下面开始讲范例。
大部分是官坛 Sonica2 童鞋写的,我做了一些有利于教学的改动。
首先创建一个脚本叫做 scr_getrandom :
-------------------------------------------------------
// 在鼠标圆形区域内找到随机点
length = random(64)
dir = random(360)
posx = mouse_x+lengthdir_x(length,dir)
posy = mouse_y+lengthdir_y(length,dir)
-------------------------------------------------------
它的作用是在鼠标附近找一个随机点。
在这个范例里,我用该随机点的坐标来画香菇。
2009年12月08日 07点12分
2
level 11
(二)
创建一个对象叫做 obj_draw :
创建事件中写:
-------------------------------------------------------
// 设定记录鼠标位置的变量
posx = mouse_x
posy = mouse_y
// 创建表面,并指定它为绘制目标
surface = surface_create( window_get_width(), window_get_height() )
surface_set_target( surface )
-------------------------------------------------------
这里注意一下表面的两个重要相关函数。
surface_create() 创建表面。一切有关表面的操作,都要先创建表面才能执行。
surface_set_target() 指定绘制表面目标。一般来讲,默认表面是一般的游戏屏幕。如果要在新表面上绘制东西,就要用到这句。
2009年12月08日 07点12分
3
level 11
(三)
STEP 事件中的代码:
-------------------------------------------------------
if mouse_check_button( mb_left )
{
surface_set_target( surface );
repeat( 2 )
{
scr_getrandom();// 在鼠标圆形区域内找到随机点
draw_sprite( spr_mushroom,0,posx,posy );// 绘制蘑菇
surface_reset_target();// 绘制表面层还原为默认
}
}
else
{
surface_reset_target();// 绘制表面层还原为默认
}
-------------------------------------------------------
这段根据玩家是否按下左键,决定是否向表面绘制香菇。
repeat( 2 ) 重复执行。这是一个特意提供用来改造的地方。主要是考虑到如果要改成绘制色点、水滴、血迹等图像,有需要重复执行多次的情况,只需替换素材后改改数字。
surface_reset_target() 绘制目标还原为默认。这是用来与其它范例结合的语句。在本范例中,只向表面绘制,原本用不到这句。考虑到如果玩家会在后边加上向默认表面或其它表面绘制的语句,因此加上。
2009年12月08日 07点12分
4
应该是:repeat( 2 ) { scr_getrandom();// 在鼠标圆形区域内找到随机点 draw_sprite( spr_mushroom,0,posx,posy );// 绘制蘑菇 } surface_reset_target();// 绘制表面层还原为默认
2014年09月17日 12点09分
level 4
也就是说使用绘制新的表面可以做到:只刷新部分地方
而如果使用原有表面绘制就是刷新全屏,浪费时间是吧
2009年12月13日 13点12分
9
level 8
好像很有用,我正愁怎么解决全屏图片的效率问题。顶了。
2009年12月13日 16点12分
11
level 0
表面可不可以绘制动态的?,显示效果会不会照draw差一些
DANTE
2009年12月14日 00点12分
13
level 8
我想做个全屏震动效果,然后就开一个对象截屏震动然后消失,反复好几次。然后帧速从60掉到35。不过要是独显应该没什么感觉。
2009年12月14日 01点12分
14
level 11
表面绘制动态即我们看到的模糊之类的特效。
全屏震动效果可以使用 view 的随机振动,参考吧主的喷火小龙~
2009年12月14日 07点12分
15
level 7
弱弱的问一个问题
假设我做了一个长条形的surface,我要按照这个surface的中点进行旋转后显示,请问有什么函数无……
2009年12月14日 10点12分
16
level 6
surface = surface_create( window_get_width(), window_get_height() )
可否设置只在一部分的范围绘制?
假如可以
那draw_sprite( spr_mushroom,0,posx,posy );//
posx与posy的值是对应整个游戏萤幕还是可绘制范围
2010年06月01日 06点06分
21
level 11
1、 你可以创建范围的 surface
2、 surface 坐标
2010年06月01日 06点06分
22
level 0
是不是可以将surface理解成一个巨大的精灵?
每次修改surface只是编辑精灵
而最后执行的只有draw精灵
2010年06月01日 07点06分
23