绘制事件

The Draw Event绘制事件类别包含所有事件,这些事件控制您运行游戏时在屏幕上看到的内容。它分为各种单独的事件,以更好地处理游戏的不同绘制要求。下图说明了事件的执行顺序:

Object Editor Draw Diagram普通的绘制事件瀑布分为三个子类型:绘制开始、标准绘制绘制结束事件。一般来说,您只需要使用标准绘制事件,并且您应该注意,房间中的所有实例都会在游戏的每一步触发此事件,因此只要实例具有 visible flag设置为 true。重要的是要理解,即使你在对象属性中没有为这个子事件定义任何东西(即:没有代码也没有动作),如果对象有一个指定的精灵,它仍然会有一个Draw事件被触发。这是因为GameMaker有两种方法在Draw事件中绘制东西:

其余的绘制事件将在下面列出的部分中进行说明:

 

绘制开始和绘制结束 绘制开始和绘制结束

除了主绘制事件之外,还有绘制开始绘制结束事件。它们的作用与标准绘制事件完全相同(即:它们将在游戏的每一步和所有视口中绘制您放入其中的任何内容),但是如果它们没有被显式地添加到对象,则它们不会"默认绘制"任何内容,并且它们总是在标准的Draw事件之前/之后运行。所以,当游戏运行时,你将总是有所有实例的Draw开始事件,然后是所有实例的Draw事件,最后是所有实例的Draw End事件。

通过这种方式,您可以在一个实例的绘制开始步骤中绘制内容或设置绘制属性,并确保具有标准绘制事件或绘制结束事件的所有实例都将使用这些属性或绘制第一个实例已绘制的内容。基本上,这是一种确保在特定时间绘制特定内容的可靠方法,就像开始步骤结束步骤事件一样。

GameMaker 中绘制东西时需要注意一些事情,无论是您正在绘制的精灵、着色器还是 3D 缓冲区:

 

绘制GUI绘制GUI

绘制 GUI 事件类型属于绘制事件类别,专为绘制不受视图相机比例或旋转影响的 GUI 元素而设计。这意味着您可以让一个实例为您的 HUD 或用户交互界面绘制所有元素,而不必将元素的所有位置基于房间内的实例位置或当前相机视图的位置。

在这些事件中绘图时,请务必了解,即使相机视图处于活动状态,绘图坐标也不会更改,并且(0,0)始终位于应用程序表面或显示屏的左手上角(请参阅本节底部的注释),默认宽度和高度为1:在不同层上的不同实例之间仍然保持深度顺序(因此,较高层上的实例将绘制在较低层上的实例之下)以及事件本身内,因为绘制GUI开始事件将首先为所有实例绘制,然后标准绘制GUI将为所有实例绘制,最后触发绘制GUI结束事件。

通过这种方式,您可以在一个实例中的绘制 GUI 开始中绘制东西或设置绘制属性,并确保具有标准绘制 GUI 或绘制 GUI 结束事件的所有实例都将使用这些属性或绘制第一个实例绘制的内容。基本上,这是一种确保某些东西在特定时间被绘制的可靠方法,就像 开始步骤结束步骤 事件所做的那样。

这些事件也可以和普通的Draw事件一起使用(Draw事件会受到摄像机视图位置、比例和旋转的正常影响)。如果你没有绘制事件,但你有一个绘制GUI事件,那么GameMaker仍然会默认为实例绘制精灵(如果它有的话),就像平常一样。

关于其他的绘制事件,Draw GUI事件将总是在普通绘制事件中绘制的任何东西上绘制。因此,如果你有一个实例在较低的层上有一个Draw GUI事件,它将在较高的层上有一个普通绘制事件的实例上绘制。如果两个实例都有一个Draw GUI事件,那么层的顺序将被尊重。

注意默认情况下,此事件将与应用程序表面大小(通常是房间或视口的大小)1:1绘制。这意味着当您在游戏选项中启用纵横比校正时,GUI将不会绘制在"信箱"游戏的黑条上。此行为可以使用display_set_gui_maximum函数,您还可以将GUI事件锁定为特定大小,然后使用函数自动缩放该大小以适应显示或应用程序表面尺寸display_set_gui_size .

 

绘制前和绘制后绘制前和绘制后

绘制前绘制后 事件是绘制事件类别的一部分。但是,与其他绘制事件不同,这些事件 直接 绘制到 显示缓冲区 ,显示缓冲区将是当前可见的所有视口的组合屏幕空间的大小, 窗口大小 (如果仅使用一个视口或根本不使用视口)。下图说明了这一点:

Object Editor Post Draw 所以,如果使用 Pre-DrawPost-Draw 事件,则绘制到全屏渲染目标 (显示缓冲区),该目标的大小与所有视口都适合的窗口大小相同。如果没有活动的视口,则将其设置为窗口本身的大小。

Pre-Draw事件在任何其他Draw事件之前触发,在其中您可以设置值,设置绘制属性,甚至绘制东西,而无需担心视口或GUI层的大小(GUI层大小可能与屏幕缓冲区相同,但可能不是,因为您可以在代码中设置GUI分辨率)。

值得注意的是,此事件发生在显示缓冲区为常规绘图而清除 之前 ,这意味着如果您没有在 房间编辑器 中关闭视图清除,则在预绘制事件中绘制的任何内容都不会被看到,因为第一个视口绘制将清除它。如果您希望能够通过视口本身进行查看,或者根本不使用视口,那么你也应该在 房间编辑器 中设置背景颜色为 0。

注意 如果您关闭这些选项,您可能会注意到在测试游戏时屏幕上绘制了不需要的伪影 (例如实例的 " 痕迹 ")。这是因为您直接在显示缓冲区的前一帧上绘制而未将其清除。但是您可以使用 draw_clear_alpha 自行完成此操作。

绘制后事件在所有标准绘制事件之后触发,但在绘制GUI事件之前触发。与绘制前事件一样,它基于显示缓冲区的大小,并位于绘图GUI事件之前,使您能够在不干扰任何HUD/GUI的情况下,简单轻松地在全屏基础上执行后期处理效果和其他操作你在游戏中可能会遇到的问题。

 

窗口大小调整窗口大小调整 HTML5

这个事件类型属于"绘制事件"类别,尽管它实际上并不绘制任何东西,但它会对 HTML5 上显示缓冲区中的更改做出反应。

在 HTML5 上,捕获画布的任何错误都很重要。此事件将执行此操作,并且在每次调整画布大小时触发,允许您在此处添加自定义代码,以根据需要调整视图大小或重新定位 HUD 元素。此函数是作为一种方便的方法提供的,以避免始终检查这些事情的步事件代码。

注意 您不能在此事件中绘制!它由绘制画布触发,仅用于捕获此更改。任何仍应完成的绘制都必须在其他绘制事件中完成。