GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

192 信息 1091 成员
游戏开发工具 GameMaker Studio 2 的讨论小组

论GameMakerStudio对象实例的执行顺序(一)

BloveStorm 2017-10-04

对象实例顺序

上次我们共同讨论了事件的执行顺序,但那只能作为我们了解GMS运行机制的基础。要想真正掌握GMS的运行机制,我们还需对对象实例的执行顺序进行深入的研究与探讨。以下规则全部基于GMS1.4.1474版本测试验证。

如果大家想对GMS进行深入研究,欢迎来GameMaker深入研究群:133687276

 

直接进入正题。由于GMS是以实例为基本单元,所以程序里至少要包含一个实例才能运转。而实例的执行其本质是以事件为基础逐步推进的。正常情况下一个实例在一帧的周期内,所有事件只执行一次(当然也有例外,后面会进行探讨)。并且在一个事件里,所有实例执行结束后才会进入下一事件的执行。那么我们就以一个事件为基础,研究下事件里所有实例的执行顺序。

说到实例的执行顺序,可能很多人会想到id,或者是layer/depth(决定Draw事件的执行顺序)。其实实例的执行顺序并不像我们想象那么简单。除idlayer/depth外,我们还需考虑实例所属对象的这个因素。

在论GMS事件的执行顺序中,我们讨论过对象实例在房间编辑器里预建立,或在游戏过程中建立两种情况。其实对象实例的执行顺序也会受到这两种情况的影响。我们会分类进行讨论。

 

一、实例在游戏过程中创建

先来个简单点的:多对象单实例场景。说到对象的执行顺序,我们必须了解在GameMaker:Studio中的object_index属性,就是每个对象的编号。它是决定对象在事件中执行顺序的首要因素。这个对象的object_index属性,也就是在IDEobject树的前后顺序。从上至下(无论是否归纳为分组),编号从0到n。下图对象的object_index值object2为0;object1为1;object3为2;object0为3。

Image title

而对象在事件中的执行顺序,我们还需要分为两部分来讨论:非Draw事件与Draw事件。原因是GMS为了让我们更好的掌控Draw事件的先后顺序,可以用layer/depth属性来进行控制。

 

1、在非Draw事件中,object_index小的先执行,反之。这个很容易理解,对象执行顺序,其实是按照IDE对象树自上而下的顺序(object_index)执行。以上图为例,对象在非Draw事件中的执行顺序为:object2object1object3object0

2、在Draw事件中,由于它也与layer/depth属性有关,所以还要分为两部分来讨论:layer/depth相同与layer/depth不同。

    1)在多个对象的layer/depth属性相同的情况下,object_index不影响Draw事件的执行顺序!

    2)当layer/depth属性不同时,layer/depth大(默认为0,可以为负数)的者优先执行,反之。

 

多对象单实例的情况已讨论完毕。接下来为单对象多实例场景:

1、非Draw事件中,实例的执行顺序完全依赖于idid小者优先执行,反之。

        2、而在Draw事件中,id大者优先执行,反之。

   注意:实例在GMS2中draw事件的执行顺序与GMS1相反,还请大家各自试验与验证!

 

除多对象单实例,和单对象多实例的执行顺序外,还有多对象多实例场景。

1、非Draw事件中,执行顺序遵循object_index优先,实例id次之。

2、而在Draw事件中,执行顺序遵循layer/depth优先,实例id次之。如果layer/depth相同。执行顺序只与实例id有关。id大者优先执行,反之。

 

举个例子来验证下:

我们在IDE里建立了3个对象: object1layer/depth 100)、object2layer/depth 0)、object3layer/depth 10)。对象的编号如下:

 Image title

现在房间里有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里,改变实例的执行顺序。

      Image title

Instance Order里,实例按照由上至下的顺序执行。这种行为你可以理解为修改了其id属性(实际id没变),后续的事件循环中,实例将遵循房间编辑器里Instance Order修改的实例顺序,而不会遵循id原则

需要注意的是,房间编辑器预建立的实例优先于游戏过程中创建的实例。

至此,对象实例执行顺序的基本原则已经讨论完毕。

 

简单总结下对象实例执行顺序的规则(“n、”与“n)”编号代表规则的先后顺。如果规则有冲突,以小编号规则为准):

对象执行顺序:

    1、非draw事件:

               object_index小者优先执行。

    2draw事件:

               1layer/depth大者优先执行。

                                                2object_index不影响执行顺序。

实例执行顺序:

   1、draw事件:

                                 1)在房间编辑器中的实例的执行顺序,按照Instance Order自上而下的顺序执行。

                                 2)在游戏过程创建的实例,id小者优先执行。

       2draw事件:

                         1)在房间编辑器中的实例的执行顺序,按照Instance Order自下而上的顺序执行。

                         2)在游戏过程中创建的实例,id大者优先执行(GMS2执行顺序相反)。

 

至此,对象实例的执行顺序讨论完毕。

真的结束了吗?其实还差得远呢。如果你觉得不够过瘾,那咱们就再进行更深一步的讨论。

具体见【论GameMakerStudio对象实例的执行顺序(二)】

(转发自:原日志地址
 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册