论GameMakerStudio对象实例的执行顺序(一)
对象实例顺序
上次我们共同讨论了事件的执行顺序,但那只能作为我们了解GMS运行机制的基础。要想真正掌握GMS的运行机制,我们还需对对象实例的执行顺序进行深入的研究与探讨。以下规则全部基于GMS1.4.1474版本测试验证。
如果大家想对GMS进行深入研究,欢迎来GameMaker深入研究群:133687276
直接进入正题。由于GMS是以实例为基本单元,所以程序里至少要包含一个实例才能运转。而实例的执行其本质是以事件为基础逐步推进的。正常情况下一个实例在一帧的周期内,所有事件只执行一次(当然也有例外,后面会进行探讨)。并且在一个事件里,所有实例执行结束后才会进入下一事件的执行。那么我们就以一个事件为基础,研究下事件里所有实例的执行顺序。
说到实例的执行顺序,可能很多人会想到id,或者是layer/depth(决定Draw事件的执行顺序)。其实实例的执行顺序并不像我们想象那么简单。除id与layer/depth外,我们还需考虑实例所属对象的这个因素。
在论GMS事件的执行顺序中,我们讨论过对象实例在房间编辑器里预建立,或在游戏过程中建立两种情况。其实对象实例的执行顺序也会受到这两种情况的影响。我们会分类进行讨论。
一、实例在游戏过程中创建
先来个简单点的:多对象单实例场景。说到对象的执行顺序,我们必须了解在GameMaker:Studio中的object_index属性,就是每个对象的编号。它是决定对象在事件中执行顺序的首要因素。这个对象的object_index属性,也就是在IDE中object树的前后顺序。从上至下(无论是否归纳为分组),编号从0到n。下图对象的object_index值:object2为0;object1为1;object3为2;object0为3。
而对象在事件中的执行顺序,我们还需要分为两部分来讨论:非Draw事件与Draw事件。原因是GMS为了让我们更好的掌控Draw事件的先后顺序,可以用layer/depth属性来进行控制。
1、在非Draw事件中,object_index小的先执行,反之。这个很容易理解,对象执行顺序,其实是按照IDE对象树自上而下的顺序(object_index)执行。以上图为例,对象在非Draw事件中的执行顺序为:object2、object1、object3、object0。
2、在Draw事件中,由于它也与layer/depth属性有关,所以还要分为两部分来讨论:layer/depth相同与layer/depth不同。
1)在多个对象的layer/depth属性相同的情况下,object_index不影响Draw事件的执行顺序!
2)当layer/depth属性不同时,layer/depth大(默认为0,可以为负数)的者优先执行,反之。
多对象单实例的情况已讨论完毕。接下来为单对象多实例场景:
1、非Draw事件中,实例的执行顺序完全依赖于id。id小者优先执行,反之。
2、而在Draw事件中,id大者优先执行,反之。
注意:实例在GMS2中draw事件的执行顺序与GMS1相反,还请大家各自试验与验证!
除多对象单实例,和单对象多实例的执行顺序外,还有多对象多实例场景。
1、非Draw事件中,执行顺序遵循object_index优先,实例id次之。
2、而在Draw事件中,执行顺序遵循layer/depth优先,实例id次之。如果layer/depth相同。执行顺序只与实例id有关。id大者优先执行,反之。
举个例子来验证下:
我们在IDE里建立了3个对象: object1(layer/depth 100)、object2(layer/depth 0)、object3(layer/depth 10)。对象的编号如下:
现在房间里有6个实例:id:100000(object1)、id:100001(object1)、id:100002(object3)、id:100003(object3)、id:100004(object2)、id:100005(object2)。
在step事件中,这6个实例的执行顺序为:
id:100004(object2)->id:100005(object2)->id:100000(object1)->
id:100001(object1)-> id:100002(object3)->id:100003(object3)
在draw事件中,这6个实例的执行顺序为:
id:100001(object1)-> id:100000(object1)-> id:100003(object3) ->
id:100002(object3)-> id:100005(object2)-> id:100004(object2)
如果你能够读懂这个例子,那表明你已理解了本部分内容。
二、实例在房间编辑器预创建
当我们在房间编辑器里创建了多个实例,我们可以在房间编辑器的setting选项中的Instance Order里,改变实例的执行顺序。
在Instance Order里,实例按照由上至下的顺序执行。这种行为你可以理解为修改了其id属性(实际id没变),后续的事件循环中,实例将遵循房间编辑器里在Instance Order修改的实例顺序,而不会遵循id原则。
需要注意的是,房间编辑器预建立的实例优先于游戏过程中创建的实例。
至此,对象实例执行顺序的基本原则已经讨论完毕。
简单总结下对象实例执行顺序的规则(“n、”与“n)”编号代表规则的先后顺。如果规则有冲突,以小编号规则为准):
对象执行顺序:
1、非draw事件:
object_index小者优先执行。
2、draw事件:
1)layer/depth大者优先执行。
2)object_index不影响执行顺序。
实例执行顺序:
1、非draw事件:
1)在房间编辑器中的实例的执行顺序,按照Instance Order自上而下的顺序执行。
2)在游戏过程创建的实例,id小者优先执行。
2、draw事件:
1)在房间编辑器中的实例的执行顺序,按照Instance Order自下而上的顺序执行。
2)在游戏过程中创建的实例,id大者优先执行(GMS2执行顺序相反)。
至此,对象实例的执行顺序讨论完毕。
真的结束了吗?其实还差得远呢。如果你觉得不够过瘾,那咱们就再进行更深一步的讨论。
具体见【论GameMakerStudio对象实例的执行顺序(二)】