[翻译]模拟蛇的行为
本篇教程的范例下载 (翻译教程>蛇行为.zip,含有教程文档)
翻译:ws.s
原作者:Tutorial written by armed10Originally published on 7th, August 2015 - 1 revision
在本教程中,我将向您展示如何创建一个以蛇形方式跟随头部移动的sprite组。
你将学习到:
- 如何使用pin 行为
- 如何单独选择相同对象的2个不同的实例,并为这两者添加操作
- 使用uid 来 pick对象
本教程是为那些喜欢使用Construct 2的人编写的。如果您不知道Construct 2的基础知识,您可能在本教程中遇到麻烦。
注意:.capx的示范并不能直接使用。如果你想在你自己的游戏中实现这个功能,得重做链的创建以及角度。因为范例只考虑到游戏中只有一条蛇,如果想要多条蛇存在,需要自己添加一些判断。
对于这个例子,我使用了一个具有8方向行为的头。
- 创建一个新对象 - > Sprite
- 向它添加8方向行为
我做了一个小绿人作为头,称它为蛇(shake)。
接下来我们要创建尾巴。我们稍后将为尾部的所有部分重用此对象。我只是使用一个较小的绿色方块。
- 创建一个新对象 - > Sprite
- 将其放置在头部的左侧
我把它放在离头部左边16像素的位置。放得太远在系统旋转对象时会出现衔接的问题,这样已经是最合适的了。
为了能够选择相同对象的2个特定实例,并最终将它们彼此绑定,我们将创建一个家庭。
- 添加家庭(family)
- 只添加尾巴,别加头进来
- 将这个家庭(family) 命名为tailpiece2
由于所有的蛇尾部分必须能够固定,所以我给tailpiece(家庭) 添加了pin行为。
- 添加行为Pin给家庭
现在项目已经设置好了,我们可以去EventSheet编辑了!我创建了一个名为“snake”的事件表,并将它链接到我们设置的布局(layout)。
- 将布局事件表设置为新事件表(snake)
在这个事件表中,我们将使用on start of layout条件来生成剩余的尾件,并将所有内容绑定在一起。
在这个事件表中,我们创建一个子事件(sub-event)和2个局部变量(Local)。
- add event - >system - >on start of layout
- add sub event(添加子事件,当选择事件时按'B')
- add local value(当选择子事件时按'V') - > 命名为 uid1
- add local value(当选择子事件时按“V”) - >将其命名为uid2
它应该看起来像这样
该变量将用于引用2个实例。首先,我们将第一个(现在只有一个)固定到头部。行为应该在家庭(family)添加,而不是对象添加,因此在添加操作时请选择家庭(family)。
- 在sub-event中,添加操作 - > tailpiece2 - > Pin to object - > snake,ROPE STYLE!
- 添加操作 - >system- >set value - > uid1 to tailpiece2.UID
uid1变量现在包含要固定到的下一个部件的唯一标识符。如果你现在开始运行项目,你会有一个非常小的尾巴的头,但你会看尾巴会跟着头走并且转向的。
因为手动创建尾部的每个部分很枯燥,我们将添加一个for循环。这样你可以用1个变量控制尾巴的长度。
- 添加另一个空白子事件到布局开始(选择事件,然后按'B')
- 添加一个条件到这个新的子事件(选择它并按'C') - >系统 - >for (for循环)
我们现在不需要为循环命名,你可以设置循环的END index 值来决定蛇有多长的尾巴。我用了18。
在这个子事件中,我们将创建tailpiece对象,并设置位置。创建后,我们将它的UID保存在uid2中。
- add action - >system - >create object - > tailpiece,layer:0,X:tailpiece.X - (16 * loopindex),Y:tailpiece.Y
- add action - >system - >set value - > uid2=tailpiece .UID
这确保了现有的尾巴是被用作起点的,并且每个尾巴都比最后一个尾吧多出了16px。它应该看起来像这样。
现在来是最棘手的部分。
因为C2在创建实例时,会清除所有的pick的实例,然后选中当前创建的实例(这也是为什么你能在create object 后 设置该实例的属性,而不影响其他的实例)。
但是现在我们必须告诉Construct2去重新pick所有的tailpieces,
然后选择一个附件的一个实例通常与UID和另一个与家庭和UID。
- 添加sub-event
- 为sub-event添加条件 - >system - >pick all tailpiece
- 添加 sub-event - > tailpiece - >选择实例与UID uid1
- 添加条件sub-event - > tailpiece2 - >pick by uid = uid2
- 添加操作到sub-event - > tailpiece2 - > Pin to tailpiece ROPE STYLE!
- 将操作添加到sub-event - >系统 - >设置变量 - > uid1到uid2
新的sub-event将选择特定的tailpiece对象的实例,然后pin起来。然后将uid2赋值给下一个循环的uid1。
现在开始游戏你会发现这确实形成了一个蛇一样的行为,但是连接的方式很诡异,因为蛇尾根本不会跟着头部旋转。
- add event- >system - >every Tick
- 添加条件 - >system - >For Each,tailpiece2
- 添加sub-event - >系统 - >compare two values - > tailpiece2.IID> 0
- 添加操作到sub-event- > tailpiece2 - > set angle - > angle(Self.X,Self.Y,tailpiece2(tailpiece2.IID-1).X,tailpiece2(tailpiece2.IID-1).Y)
- 添加另一个子事件到原始事件 - > system - > else
- 添加action到sub-event - > tailpiece2 - >set angle - >angle(tailpiece2.X,tailpiece2.Y,snake.X,snake.Y)
这是做是为每段尾巴去跟随前一段尾巴的角度。除非它是最前面的,在这种情况下,你需要将它设置其角度跟着蛇头。
真的,你现在可以运行游戏了,看到你的蛇尾巴是不是很炫酷啊。我已经创建了一个.capx,因为这个教程可能有些难理解呢。
更完善的蛇行为
- 很多游戏使用圆形对象或不同的框架,而不仅仅是设置角度。这些技术可能在实际制作游戏时得到不错的效果。
- 有些游戏使用重力或其他力,在player静止不动时,尾巴会垂下来。如果有人感兴趣的话,我可能会制作相关的教程。
- 我的创作技巧中有一些大胆的假设。创建一个更加模块的蛇行为,便于重复利用,而不破坏一切。再次,如果需要,我可以改进本教程。
这个太有帮助了,谢谢
感谢白羊大神!
cool!这个3个要点在同一个范例里一起学习到很不错!感谢白羊大分享!