C2/C3 Wiki

C2/C3开发者的乐园

用户工具

站点工具


通过fsm实现游戏控制器

这是本文档旧的修订版!


为什么要用做游戏控制器?

我们制作游戏的时候会遇到这样的情况:我们制作好了一个游戏角色,希望能够控制他。 通常的情况,我们会对其进行键盘或者手柄等的按键设置。例如:W控制上,S控制下,AD控制左右。

这个时候问题来了,如果这个角色是个公用角色,在多人游戏的时候有N个玩家都可以控制他们自己的角色,该怎么办? 设置WASD和↑↓←→两套按键?不行,那样会让两个玩家键位控制同一个角色,或者同时控制了所有角色。

比较土的方法就是有多少个玩家就创建多少个精灵……但这方法太傻了。

所以这篇就是讲我们该如何用控制器的方法,在多人游戏里控制角色的。

控制器是什么?

控制器在本教程里是一个精灵,每当有一个玩家角色被创建的时候,就会同时创建一个控制器精灵与这个玩家角色进行对应匹配。 例如为角色和控制器都添加player的私有变量,在创建角色的时候会赋予角色playerID,与此同时将这个ID赋予控制器,使他们之间存在对应关系,方便选取。

控制器,就是连接操作和角色之间的一个中转器。 当按下键盘或手柄按键的时候,会通知与键位对应的控制器,再由控制器查找与其对应的角色,实现只针对这个角色的操作传递

控制器精灵,我做了个手柄的图标,但其实游戏里是看不到的:

控制器行为

控制器的作用,就是把我们输入的操作中转一下,再通过控制器的playerID查找和他匹配的角色,并告诉他输入了什么操作。 例如我按了J键,对应控制器的攻击。这样我在编写角色的攻击操作的时候就不需要写按J键攻击,而是抽象成为控制器的“攻击键”按下了,产生攻击。

为了方便的模拟按键的on pressed(按下)和is down(按住),我们需要在控制器上能够标记出这两个操作对应的结果。

这里推荐使用FSM行为,FSM行为可以轻易把按键操作转换为enter FSM和current FSM。在配置角色事件的时候将条件写为enter FSM = “攻击”或current state FSM = “攻击”。

为此,我们需要为控制器添加大量的FSM行为,每一个FSM对应一个按键。虽然丧心病狂,但其实一次写完就OK了:

按键的对应关系事件

多人游戏一般会有固定的键位操作,例如WASD对应1P,↑↓←→对应2P等等。如果是这样就可以简单的配置输入操作与控制器之间的关系了。 当然,如果是可变的键位与角色匹配关系,则需要再做一次对应处理。这个后面会再说。

这里先简单的展现一下按键对应的事件配置方法:

如图,首先pick到与键位对应的那个控制器,然后通过on pressed按键使对应的FSM行为进入on状态,通过not down来恢复到off状态

传递应用到角色事件里

控制器配置完毕后,就可以开始配置角色的事件了:

  • on pressed

通过检测jump的FSM enter “on”,了解到是哪个ID的控制器按了跳键。 接下来pick到与这个控制器对应的角色,并使其进入jump状态

  • is down

is down事件持续进行,所以就需要先判断角色在FSM下,并用for each遍历所有的控制器和角色。 通过角色pick到对应的控制器,检测到防御键处于持续按住的状态,于是进入防御状态。

未完待续

通过fsm实现游戏控制器.1517496731.txt.gz · 最后更改: (外部编辑)