draw的工作流程很特殊,在gm中,有一幅内置的画布
会保存即将发生的绘制工作,我们所有的绘制任务都在这块画布上进行
例如 draw_text()
,draw_sprite()
等
这块画布不在屏幕上显示,只有在每步
结束前,draw事件
进行时,才会被绘制到屏幕
上。这也是我们实际看到的东西,就像surface一样,你可以在surface上进行绘制工作,但只有将surface绘制到屏幕上才能被看见
Gm中有两个关键函数
screen_redraw()
调用绘图事件重绘房间。screen_refresh()
使用当前房间图像刷新显示(而不是使用绘图事件)。
F1帮助文档中的解释是:第一个 redraw 函数重绘了内置画布
,然后刷新屏幕图像
。第二个函数 refresh 只是刷新了一次屏幕图像
我们在其他的事件中进行绘制时并不会显示,是因为将东西都画到了内置的画布上,而我们在绘制到内置画布
上后,并没有调用第一个函数刷新屏幕
,等到每一步
的最后,也就是绘制事件
发生时,游戏执行了第二个函数,将内置画布
重绘
而gm在进行绘制时是按深度从大到小绘制贴图和精灵,绘制事件发生时,深度最大的是背景,所以首先会在内置画布
上绘制出背景,覆盖你在上一步和这一步内所有绘制在内置画布
上的东西,然后再执行其他的绘制任务,最后刷新屏幕
,将内置画布
上的东西绘制到屏幕
。因此给人造成在其他事件中进行绘制操作时无效的假象
step和draw的区别
Step事件:
只执行动作
Draw事件:
- 重绘画布 (执行默认的绘制动作,绘制房间背景和视角以及实例精灵,由深度决定绘制顺序)
- 执行动作并刷新屏幕 (执行draw事件里的动作如绘制表面,精灵和粒子等,同时每进行一次绘制刷新一次屏幕)
所以普通的步事件比draw事件执行要快
如果要使用step进行绘制的话,必须使用set_automatic_draw(0)
停止默认的绘制动作,否则在绘制事件发生时会清除全部内置画布的图像并且刷新屏幕,不仅会造成效率低下,还会发生闪屏
表面和draw事件发生冲突的原因也很简单,新建表面属于新建了一张新画布
,因此你使用时必须重新设定绘图目标到表面,并只能将表面绘制到屏幕
上