一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种状态机实现方法、装置、终端设备和可读存储介质与流程

2022-04-30 12:28:47 来源:中国专利 TAG:


1.本发明涉及在线角色扮演类游戏技术领域,尤其涉及一种状态机实现方法、装置、终端设备和可读存储介质。


背景技术:

2.在基于unity实现的大型多人在线角色扮演游戏(massively multiplayer online role-playing game,mmorpg)中,游戏角色状态机都是通过使用c#语言编写,一般会通过一种称为有限状态机的方式来实现游戏角色状态机一般有限状态机包括状态模块和状态转换模块,一个状态一般对应一个行为,对于一个行为,首先需要创建一个状态类,状态类里创建一个状态行为类,状态行为类执行完毕后,检测可以状态到下一个状态时,又需要创建一个状态转换类进行状态之间的转换。
3.这种频繁的创建类的操作会造成大量的gc(garbage collection,垃圾回收)开销,不利于程序执行效率,且在迭代开发过程中,对于游戏角色状态逻辑频繁改变和内容新增的需求时,每次都需要更改c#代码或者新增一个行为类来处理变化的情况,不能进行快速尝试,不利于快速迭代开发的情况。而且由于需要编写c#代码,每次更改或一些小的修改尝试,都需要程序员来编写代码完成,不够便捷。


技术实现要素:

4.一种状态机实现方法,所述方法包括:
5.获取每一个状态和每一个所述状态对应的开始节点、结束节点、行为节点、行为转换事件、状态转换事件和逻辑事件;
6.根据每一个所述状态和对应的所述开始节点、所述结束节点、所述行为节点、所述行为转换事件、所述逻辑事件和所述状态转换事件生成相应的状态配置文件;
7.在游戏启动时,将全部所述状态配置文件加载至游戏内存中;
8.根据全部所述状态配置文件得到游戏角色状态机。
9.上述状态机实现方法,所述获取每一个状态和每一个所述状态对应的开始节点、结束节点、行为节点、行为转换事件、状态转换事件和逻辑事件,包括:
10.在通过状态编辑器接收到状态创建指令时,创建所述状态;
11.在通过所述状态编辑器接收到所述状态的编辑指令时,打开所述状态并为所述状态自动添加所述开始节点和所述结束节点;
12.在通过所述状态编辑器接收到节点添加指令时,向所述开始节点和所述结束节点之间添加所述行为节点;
13.在通过所述状态编辑器接收到行为转换指令时,向被选定的节点添加相应的所述行为转换事件;
14.在通过所述状态编辑器接收到逻辑添加指令时,向被选定的节点添加对应的所述逻辑事件;
15.在通过所述状态编辑器接收到状态转换添加指令时,向所述状态添加对应的所述状态转换事件。
16.上述状态机实现方法,还包括:
17.在接收到逻辑更新指令时,更新被选定的所述逻辑事件和相应的所述状态配置文件。
18.上述状态机实现方法,每一个所述配置文件对应一个所述状态,所述根据全部所述状态配置文件得到游戏角色状态机,包括:
19.在执行完第i个状态后,利用所述第i个状态对应的第i个状态配置文件中的第i个状态转换事件确定是否执行第i 1个状态,1≤i≤i-1,i为状态总数;
20.若所述第i个状态转换事件确定执行所述第i 1个状态,则执行第i 1个状态。
21.上述状态机实现方法,每一个所述状态包括m个行为节点,所述状态的执行包括:
22.在接收到所述状态的执行指令后,基于所述开始节点的逻辑事件执行所述开始节点对应的开始行为;
23.在所述开始行为执行完成后,通过所述开始节点对应的所述行为转换事件基于第一个行为节点的逻辑事件执行所述第一个行为节点对应的第一个行为;
24.在执行完第m个行为动作后,通过第m个行为节点对应的所述行为转换事件基于第m 1个行为节点的逻辑事件执行第m 1个行为节点对应的第m 1个行为动作,1≤m≤m-1;
25.在执行完第m个行为动作后,通过所述第m个行为节点对应的所述行为转换事件基于所述结束节点的逻辑事件执行所述结束节点对应的结束行为。
26.上述状态机实现方法,在所述将全部所述状态配置文件加载至游戏内存中之后,还包括:
27.将全部所述状态配置文件中的全部所述开始节点、全部所述结束节点、全部所述行为节点、全部所述行为转换事件和所全部述逻辑事件转换成状态全局原生数据。
28.本发明还提供了一种状态机实现装置,包括:
29.获取单元,获取每一个状态和每一个所述状态对应的开始节点、结束节点、行为节点、行为转换事件、状态转换事件和逻辑事件;
30.生成单元,根据每一个所述状态和对应的所述开始节点、所述结束节点、所述行为节点、所述行为转换事件、所述逻辑事件和所述状态转换事件生成相应的状态配置文件;
31.加载单元,在游戏启动时,将全部所述状态配置文件加载至游戏内存中;
32.执行单元,根据全部所述状态配置文件得到游戏角色状态机。
33.上述状态机实现装置,所述获取每一个状态和每一个所述状态对应的开始节点、结束节点、行为节点、行为转换事件、状态转换事件和逻辑事件,包括:
34.在通过状态编辑器接收到状态创建指令时,创建所述状态;
35.在通过所述状态编辑器接收到所述状态的编辑指令时,打开所述状态并为所述状态自动添加所述开始节点和所述结束节点;
36.在通过所述状态编辑器接收到节点添加指令时,向所述开始节点和所述结束节点之间添加所述行为节点;
37.在通过所述状态编辑器接收到行为转换指令时,向被选定的节点添加相应的所述行为转换事件;
38.在通过所述状态编辑器接收到逻辑添加指令时,向被选定的节点添加对应的所述逻辑事件;
39.在通过所述状态编辑器接收到状态转换添加指令时,向所述状态添加对应的所述状态转换事件。
40.本发明还提供了一种移动终端,包括存储器以及处理器,所述存储器用于存储计算机程序,所述处理器运行所述计算机程序以使所述移动终端执行所述的状态机实现方法。
41.本发明还提供了一种计算机可读存储介质,其存储有所述移动终端中所使用的所述计算机程序。
42.本发明实施例公开了一种状态机实现方法、装置、终端设备和可读存储介质,该方法包括获取每一个状态和每一个所述状态对应的开始节点、结束节点、行为节点、行为转换事件、状态转换事件和逻辑事件,根据每一个所述状态和对应的所述开始节点、所述结束节点、所述行为节点、所述行为转换事件、所述逻辑事件和所述状态转换事件生成相应的状态配置文件,在游戏启动时,将全部所述状态配置文件加载至游戏内存中,根据全部所述状态配置文件得到游戏角色状态机。本发明的技术方案能够更加快速便捷的更改状态逻辑,不仅可以提高迭代开发的效率,还可以提高程序执行效率。
附图说明
43.为了更清楚地说明本发明的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对本发明保护范围的限定。在各个附图中,类似的构成部分采用类似的编号。
44.图1示出了本发明实施例提出的一种状态机实现方法的流程示意图;
45.图2示出了本发明实施例提出的一种状态机实现方法中获取信息的流程示意图;
46.图3示出了本发明实施例提出的另一种状态机实现方法的流程示意图;
47.图4示出了本发明实施例提出的一种状态机实现方法中状态执行的流程示意图;
48.图5示出了本发明的状态机实现装置的一个实施例的结构示意图。
49.主要元件符号说明:
50.9-状态机实现装置;1-获取单元;2-生成单元;3-加载单元;4-执行单元。
具体实施方式
51.下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。
52.通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
53.在下文中,可在本发明的各种实施例中使用的术语“包括”、“具有”及其同源词仅意在表示特定特征、数字、步骤、操作、元件、组件或前述项的组合,并且不应被理解为首先
排除一个或更多个其它特征、数字、步骤、操作、元件、组件或前述项的组合的存在或增加一个或更多个特征、数字、步骤、操作、元件、组件或前述项的组合的可能性。
54.此外,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
55.除非另有限定,否则在这里使用的所有术语(包括技术术语和科学术语)具有与本发明的各种实施例所属领域普通技术人员通常理解的含义相同的含义。所述术语(诸如在一般使用的词典中限定的术语)将被解释为具有与在相关技术领域中的语境含义相同的含义并且将不被解释为具有理想化的含义或过于正式的含义,除非在本发明的各种实施例中被清楚地限定。
56.实施例1
57.本技术的一个实施例,如图1所示,一种状态机实现方法包括以下步骤:
58.s100:获取每一个状态和每一个所述状态对应的开始节点、结束节点、行为节点、行为转换事件、状态转换事件和逻辑事件。
59.可以理解的,每一个游戏角色包括多个状态,每个状态包括开始行为、多个中间行为、结束行为,例如游戏角色的跳跃状态,其开始行为可以是站立行为、多个中间行为可以是跳跃1.5米、结束行为可以是站立行为。
60.需要说明的是,在编辑游戏角色状态时,获取游戏角色的每一个状态,并将一个状态分为多个行为,一个行为对应一个节点,其中每个状态都包括开始行为和结束行为,开始行为和结束行为分别对应开始节点和结束节点。
61.其中,开始节点、每一个行为节点都对应有一个行为转换事件,每一个行为转换事件用于在行为执行完成一个节点对应的行为后执行下一个节点对应的行为,例如,开始节点对应的行为转换事件用于在开始节点对应的行为执行完成后执行与开始节点相邻的第一个行为节点对应的动作。
62.其中,一个状态对应一个状态转换事件,每一个状态状态转换事件用于在一个状态结束后,根据状态转换事件判断是否可以进入下一状态。例如,游戏角色在完成跳跃后需要进行奔跑,当游戏角色完成跳跃状态后,可以通过执行状态转换事件判断是否可以进入奔跑状态。
63.其中,一个行为可以有多个逻辑事件,每个行为的逻辑通过相应的逻辑事件进行执行,例如执行开始行为,实际是执行开始行为中的所有逻辑事件。
64.如图2所示,一种状态机实现方法中获取信息的过程包括以下步骤:
65.s110:在通过状态编辑器接收到状态创建指令时,创建所述状态。
66.可以理解的,状态编辑器主要用于开发人员使用用户界面对状态逻辑进行查看和编辑,本技术中可以通过状态编辑器接收状态创建指令,基于状态编辑器模块创建一个新的状态,例如可以态编辑器的用户界面上预设一个创建按钮,通过用户界面上利用创建按钮创建一个状态。
67.s120:在通过所述状态编辑器接收到所述状态的编辑指令时,打开所述状态并为所述状态自动添加所述开始节点和所述结束节点。
68.可以理解的,在创建一个新的状态后,可以通过状态编辑器对该状态进行编辑,在打开该状态后,向该状态中添加开始节点和结束节点,例如创建一个跳跃状态,新创建的跳
跃状态并不包括行为,通过上述用户界面可以对跳跃状态进行编辑,打开新建的跳跃状态后,向该状态中添加开始节点和结束节点用于该状态的开始执行和结束该状态的执行。
69.s130:在通过所述状态编辑器接收到节点添加指令时,向所述开始节点和所述结束节点之间添加所述行为节点。
70.在创建一个状态后需要向该状态中添加多个行为节点以完成该状态,可以通过状态编辑器在开始节点和结束节点之间添加进行添加。或者需要对已有的状态文件进行编辑时,已有状态中的多个行为按照行为节点的方式进行显示,两个行为节点间通过连线的方式在状态编辑器的用户界面上进行显示。
71.示范性的,本实施例中可以在用户界面上设置一个节点添加按钮,当需要对一个状态进行编辑时,如增加新的行为节点时,可以通过节点添加按钮创建一个新的行为节点,用于更好的执行该状态。
72.s140:在通过所述状态编辑器接收到行为转换指令时,向被选定的节点添加相应的所述行为转换事件。
73.可以理解的,对一个状态进行编辑时,在状态中添加新的行为节点后,新的行为节点与其他行为节点之间需要通过行为转换事件进行连接,因此,可以在行为节点中创建相应的行为转换事件进行下一个行为的执行。
74.示范性的,本实施例中可以在状态编辑器的用户界面上设置转换事件的按钮,当需要添加行为转换事件时,可以通过转换事件按钮创建选定行为节点相应的行为转换事件,行为转换事件可以通过行为节点之间的连线进行显示。
75.s150:在通过所述状态编辑器接收到逻辑添加指令时,向被选定的节点添加对应的所述逻辑事件。
76.可以理解的,被选定的节点可以为新添加的行为节点或是现有状态中已有的行为节点。若被选定的节点为新添加的行为节点,在添加行为节点后,可以对新添加的行为节点相应的逻辑事件进行编辑;若被选定的节点为已有的行为节点,打开已有的行为节点,对相应的逻辑事件进行添加编辑。在新增逻辑事件时,只需要增加一个逻辑事件的枚举并编写对应的回调函数,然后将增加的枚举值和编写的回调函数指针一起注册到事件注册模块的逻辑事件字典中即可,程序启动时会自动把他们加载到内存中,以供事件管理器模块调用,事件注册模块用于注册逻辑事件和状态转换事件回调函数,事件管理器模块用于逻辑事件以及每个逻辑事件的具体执行。
77.示范性的,可以在状态编辑器的用户界面上设置事件增加的按钮,在选定行为节点后,可以通过事件增加的按钮创建一个逻辑事件,此外,也可以选择已有的逻辑事件类型,并设置其对应的参数。
78.s160:在通过所述状态编辑器接收到状态转换添加指令时,向所述状态添加对应的所述状态转换事件。
79.可以理解的,在接收到添加状态转换事件时,可以向相应的状态中添加状态转换事件。状态转换事件主要通过状态转换管理器模块进行执行,状态转换管理器模块主要负责执行某个状态的进入逻辑,在通过执行事件注册模块中已经注册的状态转换事件来完成状态转换管理器模块的进入逻辑,如果所有状态转换事件都执行通过,则可以进入该状态,否则不可以进入该状态。在新增状态转换事件时,只需要增加一个状态转换事件的枚举并
编写对应的回调函数,然后将增加的枚举值和编写的回调函数指针一起注册到事件注册模块的状态转换事件字典中即可,程序启动时会自动把他们加载到内存中,以供事件管理器模块调用,事件注册模块用于注册逻辑事件和状态转换事件回调函数。由此可知,在游戏开发过程中,如果是需要新增事件逻辑,开发人员可以不关注状态、行为等逻辑,只通过添加一个枚举和编辑相应回调函数实现事件注册,这样不仅可以避免编写代码的繁琐,降低开发人员工作量,也可以减少性能开销。
80.s200:根据每一个所述状态和对应的所述开始节点、所述结束节点、所述行为节点、所述行为转换事件、所述逻辑事件和所述状态转换事件生成相应的状态配置文件。
81.可以理解的,本实施例中每一个状态都有相应的状态配置文件,可以用于记录一个状态里的所有行为、自定义变量和状态逻辑等信息,并且每一个状态配置文件中只有一个开始行为和一个结束行为,其中,每一个状态配置文件否存储了该状态相应的对应的所述开始节点、所述结束节点、所述行为节点、所述行为转换事件、所述逻辑事件和所述状态转换事件等信息。
82.s300:在游戏启动时,将全部所述状态配置文件加载至游戏内存中。
83.当游戏启动时,把状态配置文件加载到游戏内存中,在创建角色时,可以根据状态配置文件中的内容创建对应的状态管理器,状态管理器里根据具体的事件逻辑执行游戏角色状态事件。
84.s400:将全部所述状态配置文件中的全部所述开始节点、全部所述结束节点、全部所述行为节点、全部所述行为转换事件和所全部述逻辑事件转换成状态全局原生数据。
85.可以理解的,在程序启动时,可以通过状态配置文件中的加载配置文件将全部状态配置文件都进行加载,部所述状态配置文件中的全部所述开始节点、全部所述结束节点、全部所述行为节点、全部所述行为转换事件和所全部述逻辑事件转换成状态全局原生数据。
86.s500:根据全部所述状态配置文件得到游戏角色状态机。
87.可以理解的,一个状态配置文件对应一个状态,在程序启动后,获取状态配置文件相应的数据,在执行的过程中,通过全部状态配置文件中的数据可以完成游戏角色状态逻辑的执行。
88.示范性的,一个状态可以包括多个行为,将全部状态配置文件中的数据在程序中加载完成后,读取全部状态配置文件可以通过上述状态转换事件确定一个状态是否可以开始执行,当开始执行一个状态后,对于状态中每个行为的逻辑通过逻辑事件进行执行,在一个行为执行完成后,通过行为转换事件进行下一个行为的执行,当所有的行为执行完成后,通过状态转换事件确定下一个可以执行的状态。当新建一个跳跃状态时,可以通过状态编辑器的用户界面进行新建,可以设置一个状态列表,用于显示已有状态,并设置添加按钮和保存按钮,用于添加新状态,可以将状态类型设置为跳跃并设置文件名称,点击保存按钮就可以通过状态编辑器将新建的状态以及相应的文件名称进行存储,并在指定目录下创建相应的文件;在新建一个跳跃状态后,可以通过状态编辑器对该状态进行编辑,设置打开状态按钮,点击按钮会出现已有的状态列表,选择跳跃状态,就会打开刚创建的跳跃状态面板视图,此时该视图中已经包含一个开始行为和一个结束行为;而后可以向跳跃状态中添加行为节点,设置行为id为3,即创建一个新的行为,用于播放起跳动画;选中开始节点,为其添
加第一行为转换事件,并将第一行为转换事件通过连线的方式指向行为id为3的节点;选定行为id为3的行为节点,向其中添加“播放动画”的逻辑事件,并设置该逻辑事件相应的参数;还可以创建行为id为4的行为节点,用于执行开启跳跃运动的逻辑,选定行为id为4的行为节点向其中添加相应的“开启跳跃运动”的逻辑事件,还可以通过自定义面板创建一个自定义变量height1,height1的值可以设置为1.5,把height1自定义变量作为参数添加到“开启跳跃运动”逻辑事件参数中,该参数可以表示为玩家角色在跳跃状态中可以跳至1.5米高;可以向行为id3的节点添加第一行为转换事件,在状态编辑器中通过连线的方式表示执行行为id为4的节点;在设置选定节点的逻辑事件时按照添加新行为节点进行设置,在添加逻辑事件后为上一个节点添加行为转换事件,并创建执行新行为节点所需要的行为节点和相应的逻辑事件及转换事件,直至编辑到结束行为节点即完成了跳跃状态的所有行为逻辑。
89.如图3所示,玩家角色状态实现的具体步骤如下:
90.s510:在执行完第i个状态后,利用所述第i个状态对应的第i个状态配置文件中的第i个状态转换事件确定是否执行第i 1个状态,1≤i≤i-1,i为状态总数;
91.s520:若所述第i个状态转换事件确定执行所述第i 1个状态,则执行第i 1个状态。
92.可以理解的,在读取状态配置文件中状态全局原生数据时,可以通过状态管理器模块对状态配置文件中的所有数据进行执行。在执行完第1个状态后,利用所述第一个状态对应的状态转换事件确定下一个可执行的状态,下一个可执行的状态为第二个状态,其中1≤i≤i-1,i为状态总数。
93.s600:在接收到逻辑更新指令时,更新被选定的所述逻辑事件和相应的所述状态配置文件。
94.可以理解的,在需要对某个状态进行修改时,需要对其逻辑进行修改,可以通过状态编辑器查看和操作对应的状态逻辑,在对逻辑进行编辑修改后,可以通过状态编辑器把最新的状态逻辑保存到对应的配置文件中;此外,在程序运行过程中,也可以通过状态编辑器对更新后的状态逻辑进行保存,程序通过状态配置文件中的加载配置文件重新载入所有的状态配置文件,并重新生成对应的状态全局原生数据。
95.示范性的,在游戏运行过程中,可以通过状态编辑器中的自定义变量对行为逻辑进行修改。例如将玩家角色的跳跃高度从发1.5米改为2.5米,首先可以通过状态编辑器,打开跳跃状态面板,跳跃状态面板中设有自定义变量子面板,打开该面板中的自定义变量子面板,从变量中找到height1变量,把其value1由1.5改成2.5,点击“保存配置”按钮,就可以将更新后的状态逻辑保存到配置文件中;在状态编辑器还可以设有加载按钮,点击加载按钮,运行中的游戏会将更新后的状态配置文件加载到内存中的全局原生数据模块中,在此时的游戏中,再次点击跳跃按钮或触发跳跃状态,就可以查看跳跃高度变为了2.5米。由此可知,在更改逻辑事件时,通过状态编辑器对选定逻辑事件的参数进行编辑,可以减少开发人员工作量,且在运行时重新加载配置文件,可以较大程度上提高游戏的开发效率。
96.本发明的技术方案能使在需要对游戏角色状态逻辑进行修改或添加时更加快速便捷,不仅可以提高迭代开发的效率,还可以提高程序执行效率。
97.实施例2
98.如图4所述,一种状态的执行方法具体步骤如下:
99.s10:在接收到所述状态的执行指令后,基于所述开始节点的逻辑事件执行所述开始节点对应的开始行为;
100.s20:在所述开始行为执行完成后,通过所述开始节点对应的所述行为转换事件基于第一个行为节点的逻辑事件执行所述第一个行为节点对应的第一个行为;
101.s30:在执行完第m个行为动作后,通过第m个行为节点对应的所述行为转换事件基于第m 1个行为节点的逻辑事件执行第m 1个行为节点对应的第m 1个行为动作,1≤m≤m-1。
102.s40:在执行完第m个行为动作后,通过所述第m个行为节点对应的所述行为转换事件基于所述结束节点的逻辑事件执行所述结束节点对应的结束行为。
103.可以理解的,一个状态可以包括m个行为、一个开始行为和一个结束行为,1≤m≤m-1,一个行为可以表示为一个行为节点,在接收到状态执行指令后,首先执行开始节点相应的开始行为,在执行完开始行为里的所有逻辑事件后,通过行为管理器模块的行为转换事件进行第一个行为的执行,在执行完第一个行为后,通过行为管理器模块的行为转换事件进行下一个行为的逻辑事件的执行,依次执行该状态的m个行为,在执行完第m个行为动作后,通过第m个行为节点对应的行为转换事件执行结束节点相应的结束行为中的逻辑事件,当结束行为中的逻辑事件执行完成后,该状态执行结束。
104.示范性的,本实施例中的状态机可以包括状态管理器模块、行为管理器模块、事件管理器模块、事件注册模块、状态转换管理器模块、状态配置文件模块和状态编辑器模块。
105.状态管理器模块用于当前状态以及触发当前状态的行为管理模块,在执行完成全部状态配置文件中的第一个状态后,利用相应的状态转换事件确定下一个可以执行的状态,其中每一个状态的多个行为通过行为转换事件模块和事件管理器模块进行执行。
106.状态管理器模块包括:当前状态id、当前行为id、行为管理模块指针和状态全局原生数据类指针等内容,具体执行步骤如下:在进入到一个状态后,首先记录当前状态id,根据当前状态id从状态配置文件模块中生成的全局状态原生数据中获取当前状态原生数据类指针,从当前状态原生数据类指针中获取开始行为id赋值给当前行为id,并以此作为当前状态的开始行为id;调用行为管理器模块的onenter函数,onenter函数表示进入一个行为时将要进入的函数,根据当前行为id从状态全局原生数据类指针中获取行为全局原生数据类指针作为参数传递给行为管理器模块,并且可以对行为是否进行和行为是都离开进入标记。在执行完上述步骤对一个状态初始化完毕后,需要对状态中的行为进行执行,首先执行一次行为管理器模块的onexecute函数,onexecute函数表示在一个行为初始化完毕后,在后续的行为执行过程中都使用该函数,根据该函数返回值iret确定下一次的执行方式,当iret小于0,则表明执行该行为时发生了错误,记录异常信息,抛出错误异常,结束这次状态执行;当iret等于1,则表明这次行为的执行需要等待后续帧才能执行完毕,状态管理器模块将进入等待状态,之后利用ontick函数处理需要多帧才能处理完成的行为,具体为当标记行为处于进入且未离开状态时,需要再次执行onexecute函数对该行为进行处理;当iret等于0,则表示本次行为正常执行结束。在行为管理器模块的onexecute函数正常执行结束后,可以通过状态管理器模块的onexit函数处理一个行为的结束以及结束后的执行方式,首先执行一次行为管理器模块的exit函数,根据该函数返回值nextactionid确定下次
的执行方式,若该函数返回值nextactionid小于0,则表明本次状态执行发生了错误,记录异常信息,抛出错误异常,结束这次状态的执行,若该函数返回值nextactionid等于0,则表明本次状态执行结束,调用exitstate函数,exitstate函数用于表示本次状态执行结束,当调用exitstate函数时,需要清空onenter函数中初始化的所有数据,将行为标记为离开,此时需要调用状态管理器模块的ontrans函数,用于确定下一次所要进入执行的状态;若该函数返回值nextactionid大于0,则表明本次行为结束后,仍有后续行为需要执行,则将下一个行为id赋值给当前行为id,而后再执行一次onexecute函数。
107.行为管理器模块用于管理当前行为以及当前行为对应的逻辑事件和行为转换事件执行逻辑,行为管理器模块主要包括事件管理模块指针、行为全局原生数据类指针、当前的逻辑事件id、下一个行为转换事件id和用于多帧执行的事件全局原生数据类指针等内容。在对每个行为进行执行时,需要先执行onenter函数,对一些执行时所需的数据进行初始化,具体内容为先将下一个行为转换事件id初始化为0,即将下一个行为转换事件id的初始值设为0,将行为全局原生数据类指针初始化为该函数参数执行的行为全局原生数据类指针,初始化当前逻辑事件id为0,初始化用于多帧执行的事件全局原生数据类指针为0。
108.其中,行为管理器模块的onexecute函数用于行为的具体逻辑执行,负责执行行为里的每个逻辑事件,具体为获取逻辑事件相应的当前逻辑事件id,当当前逻辑事件id小于0时,使用行为全局原生数据类指针记录的开始事件id,将开始事件id赋值给当前逻辑事件id,此时所要执行的行为是开始行为;当用于多帧执行的事件全局原生数据类指针不为空时,则将执行doeventwait函数,函数doeventwait包括以下步骤:根据用于多帧执行的事件全局原生数据里的事件id执行事件管理模块的onexecute函数,并记录该函数返回值iret;若iret小于0,则表示发生错误,执行结束,抛出异常;若iret等于1,则表示正常执行了逻辑事件,继续等待下帧进行执行;若iret等于0,则表明逻辑事件正常执行,也不需要等待,直接执行行为管理器模块中的onexit函数;当用于多帧执行的事件全局原生数据类指针为空值时,则从行为全局原生数据类中获取该行为相应的逻辑事件的总数,从当前逻辑事件id开始,即开始行为时进行执行,到遍历执行所有的逻辑事件,每次遍历均通过执行函数doeventseq,并根据函数doeventseq的返回值nseqret确定后续的执行逻辑,若nseqret小于0,则表明逻辑事件执行发生了错误,记录错误信息,退出循环;若nseqret等于1,则表明逻辑事件正常执行且进入了多帧执行逻辑,记录当前的事件原生数据类指针给用于多帧执行的事件全局原生数据类指针,而后将再次执行onexecute函数;若nseqret等于0,则表明逻辑事件正常执行,也不需要等待,直接执行onexit函数。
109.其中,行为管理器模块的onexit函数用于处理逻辑事件的结束以及结束后的执行方式,首先调用事件管理模块的onexit函数,并记录事件管理模块的返回值transeventid,即为行为转换事件id,若返回值transeventid小于0,则表明发生了错误,记录错误信息,则直接返回transeventid,表示结束执行;若返回值transeventid大于0,则表明有后续的逻辑事件,将行为转换事件id赋给下一个行为转换事件id,返回1;若返回值transeventid等于0,则表示没有后续逻辑事件,下一个行为转换事件id赋值为0,且返回0。行为管理器模块中的exit函数用于处理一个行为执行结束时,根据其返回值决定下个行为执行方式,若下一个行为转换事件id等于0,直接返回0,表明没有后续行为;若下一个行为转换事件id小于0,则表明发生了错误,返回-1,表示执行结束;若下一个行为转换事件id大于0,则将从全局
原生数据中获取转换事件全局原生数据类指针,获取其第一个参数作为下一个行为id,并将其作为返回值进行返回,执行结束。所谓遍历是指沿着某条搜索路线,依次对树(或图)中每个节点均做一次访问。函数doeventseq包括以下步骤:调用事件管理模块的onexecute函数,根据当前逻辑事件id获取相应的逻辑事件全局原生数据类指针传递给该函数;调用事件管理模块的执行函数,并记录该函数返回值iret,根据iret的值作为函数返回值,进而函数doeventseq执行完毕。
110.事件管理器模块用于负责逻辑事件以及每个逻辑事件的具体执行逻辑,主要包括逻辑事件全局原生数据类指针、事件已运行帧数和逻辑转换事件返回类型,事件管理器模块包括onenter函数、onexecute函数和onexit函数。onenter函数用于对逻辑事件全局原生数据类指针、事件已运行帧数和逻辑转换事件返回类型进行初始化,onexecute函数包括从逻辑事件全局原生数据类指针中获取当前事件id,根据当前事件id等一些参数,从事件注册模块中的逻辑事件字典中获取对应事件的函数指针,然后调用函数,进行逻辑事件的执行,并记录逻辑事件返回值iret,iret小于0,则表明逻辑事件执行发生了错误,直接返回该值,执行结束;若iret等于1,则表明逻辑事件正常执行,但是多帧执行的事件,需要等待下一帧继续执行,返回1;若iret等于0,则表明逻辑事件正常执行了,也不需要等待。在执行一次逻辑事件后,对事件已运行帧数增加一。此外,当执行某一逻辑事件时(即调用上述事件管理器模块的onexecute函数)时,将调用到事件注册模块管理的逻辑事件字典中存储的某个逻辑事件id对应的函数回调,调用该函数即执行了一次逻辑事件。在调用回调函数执行逻辑事件时,开销很小。对逻辑事件进行执行时,根据逻辑事件的类型,会针对性的处理逻辑转换事件返回类型,用作下个行为的执行策略的依据,逻辑事件可以分为:正常类逻辑事件(只有个一个默认返回值,对应的逻辑转换事件返回类型的值为1),检查类逻辑事件(有两个返回值,返回true则逻辑转换事件返回类型为1,返回false则逻辑转换事件返回类型为2),比较类逻辑事件(有三个返回值,返回等于则逻辑转换事件返回类型为1,返回小于则逻辑转换事件返回类型为2,返回大于则逻辑转换事件返回类型为3),之后执行事件管理器模块的onexit函数。
111.其中事件管理器模块的onexit函数用于根据逻辑转换事件返回类型对逻辑事件的执行进行判断,若逻辑转换事件返回类型小于1则返回-1,表明发生了错误;若逻辑转换事件返回类型大于3,则返回0,表明正常执行了,没有后续行为了;非步骤1和2的情况,则返回逻辑转换事件返回类型表明正常执行了,但有后续的行为需要继续执行。
112.事件注册模块用于注册逻辑事件和状态转换事件回调函数,在游戏程序启动时,就需要完成逻辑事件和状态转换事件的注册回调。事件注册模块主要是通过c#函数回调机制以及dictionary(字典类)进行事件的注册。
113.状态转换器模块用于执行某个状态的进入逻辑,即通过执行上述事件注册模块中已经注册的状态转换事件来完成,如果所有状态转换事件执行通过,则可以进入相应的状态,否则不可以进入该状态。状态转换器模块中主要包括负责状态转换事件执行的ontrans函数,执行步骤为:获取行为转换事件全局原生数据指针,通过转换事件全局原生数据指针获取状态转换事件总数,从状态转换事件为0时开始执行,对状态转换事件总数进行遍历操作,遍历操作如下:从转换事件全局原生数据指针中获取全局原生事件数据类指针,根据转换事件全局原生数据指针调用事件注册模块里的状态转换注册模块,具体执行状态转换事
件逻辑,记录状态转换事件返回值(iret),若iret小于0,表明发生了错误,结束循环,返回错误值iret;若iret大于0,表明正常执行,但不满足某个状态的进入条件,结束循环;若iret等于0,表明本次转换事件正常执行且满足条件,执行步骤,继续执行循环中下一个状态转换事件,直到所有状态转换事件都执行完毕,表明可以进入该状态,否则不可以进入该状态。
114.状态配置文件模块用于存储游戏角色中全部状态配置文件,一个状态配置文件存储了一个状态里的所有行为和自定义变量,在状态配置文件中,每个行为可以包括:加载配置文件、自定义变量、行为id、行为类型、编辑器名称、逻辑事件组和行为转换事件数组,行为id用于唯一标识一个行为;对于行为类型,可以用0表示一般行为,1表示开始行为,2表示结束行为;编辑器名称用于显示在状态编辑器上该行为的名称;逻辑事件数组用于记录该行为所拥有的所有逻辑事件;行为转换事件数组用于记录一个行为所拥有的所有行为转换事件。
115.每个逻辑事件可以包括逻辑事件id、逻辑事件类型、逻辑事件参数和返回值参数,其中逻辑事件id用于唯一标识该事件;逻辑事件类型即对应在事件注册模块中注册的逻辑事件枚举类型,在具体执行逻辑事件时,可以通过该类型从事件注册模块找到对应的逻辑事件回调函数并进行执行;每个逻辑事件可以由1到5个参数组成,逻辑事件参数用于在调用逻辑事件回调函数时,作为具体的函数参数进行传递,从而可以模拟编程语言中的函数参数传递机制,完成某些参数传递工作,可以表示为:param1、param2、param3、param4和param5,且每个参数类型可以是:int、float、string、vars其中的一种,vars类型即自定义变量类型,在回调函数执行时,会读取内存中保存的该自定义变量的值;返回值参数用于计算类的逻辑事件中用于模拟编程语言中的计算函数的返回值,在获取到该函数的返回值后,将该返回值存储到相应的状态配置文件中的自定义变量模块中。每个转换事件包括:行为转换事件id、行为转换事件类型和行为转换事件参数,行为转换事件id用于唯一标识该事件;行为转换事件类型用于具体行为管理器模块里判断下一个行为时使用,该事件类型即对应c#代码中在事件注册模块中注册的行为转换事件的枚举类型,用于在行为管理器模块里判断下一个行为;行为转换事件参数用于行为执行结束时标记下一个执行行为id,可以用param1表示。
116.此外,状态配置文件模块中还存在自定义变量部分,在每个状态配置文件里都保存了属于该状态的全部自定义变量,可以用于预设数据,示范性的,可以通过状态编辑器模块提前设置一些运行时需要的数据,或是在运行时需要计算临时报错的一些数值。对于每一个自定义变量包括:用于唯一标识变量的变量id、用于在编辑器上显示变量名称的变量名称、用于记录变量的类型的变量类型,变量类型可以包括四种类型:int,string,float,vector3,以及变量数值等部分,其中变量数值可以用value1,value2,value3表示,当变量类型为vector3(三维向量)时,变量数值可以为value1,value2,value3,除vector3类型外,其他都类型时变量数值只有value1表示。加载配置文件部分具体步骤可以表示为:在程序启动时,把全部状态配置文件都进行加载,存储到全局数据模块中生成状态全局原生数据,执行行为的逻辑事件时,再从全局数据模块中获取对应状态的全局数据类指针,根据配置文件中执行对应的逻辑事件和行为转换事件以及对应的状态转换事件,上述全局数据模块可以在运行时重新进行加载,即可以通过编辑器界面创建一个新状态或是更改现有状态中
的某一行为,在新建或修改后,程序可以重新加载配置文件到全局数据模块中生成对应的全局原生数据,待游戏下次运行到该状态时,即用最新的数据执行该状态的最新逻辑,即完成了实时更新操作,大大的提高了开发效率。
117.状态编辑器模块主要用于使用界面操作的方式查看和编辑状态行为逻辑。此外,上述行为管理器模块的onenter函数、状态管理器模块的onenter函数和事件管理器模块的onenter函数表示不同的函数;上述行为管理器模块的onexecute函数、状态管理器模块的onexecute函数和事件管理器模块的onexecute函数表示不同的函数,以及上述行为管理器模块的onexecute函数、状态管理器模块的onexecute函数和事件管理器模块的onexecute函数表示不同的函数。
118.实施例2
119.如图5所述,一种状态机实现装置9包括:获取单元1、生成单元2、加载单元3和执行单元4。
120.获取单元1,获取每一个状态和每一个所述状态对应的开始节点、结束节点、行为节点、行为转换事件、状态转换事件和逻辑事件;生成单元2,根据每一个所述状态和对应的所述开始节点、所述结束节点、所述行为节点、所述行为转换事件、所述逻辑事件和所述状态转换事件生成相应的状态配置文件;加载单元3,在游戏启动时,将全部所述状态配置文件加载至游戏内存中;执行单元4,根据全部所述状态配置文件得到游戏角色状态机;其中所述获取每一个状态和每一个所述状态对应的开始节点、结束节点、行为节点、行为转换事件、状态转换事件和逻辑事件,包括:在通过状态编辑器接收到状态创建指令时,创建所述状态;在通过所述状态编辑器接收到所述状态的编辑指令时,打开所述状态并为所述状态自动添加所述开始节点和所述结束节点;在通过所述状态编辑器接收到节点添加指令时,向所述开始节点和所述结束节点之间添加所述行为节点;在通过所述状态编辑器接收到行为转换指令时,向被选定的节点添加相应的所述行为转换事件;在通过所述状态编辑器接收到逻辑添加指令时,向被选定的节点添加对应的所述逻辑事件;在通过所述状态编辑器接收到状态转换添加指令时,向所述状态添加对应的所述状态转换事件。
121.本实施例公开的状态机实现装置9通过获取单元1、生成单元2、加载单元3和执行单元4的配合使用,用于执行上述实施例所述的状态机实现方法,上述实施例所涉及的实施方案以及有益效果在本实施例中同样适用,在此不再赘述。
122.可以理解,本发明实施例涉及一种测试终端,包括存储器和处理器,所述存储器用于存储计算机程序,所述计算机程序在所述处理器上运行时执行本发明实施例所述的状态机实现方法。示范性的,测试终端包括pc、笔记本电脑和其他终端设备。
123.可以理解,本发明实施例涉及一种可读存储介质,其存储有计算机程序,所述计算机程序在处理器上运行时执行本发明实施例所述的状态机实现方法。
124.在本技术所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和结构图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在作为替换的实现方式中,方框中所标注的功能也可以以不同于
附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,结构图和/或流程图中的每个方框、以及结构图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
125.另外,在本发明各个实施例中的各功能模块或单元可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或更多个模块集成形成一个独立的部分。
126.所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是智能手机、个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
127.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献