Construct2/3

创建于:2017-02-24

创建人: iconboy

103 信息 417 成员
Construct2/3 引擎开发专题

[制作分享]如何实现伪物理的称重解谜

potion 2018-09-04

这是最近正在开发的一个解谜功能。我希望制作一个按钮,通过踩下这个按钮打开某个机关(或别的功能)。

最初的设计非常简单,踩在上面=开机关。后来发现太简单了,加了按 ↓ 蹲下打开。

后来,我为角色添加了拿箱子的功能,突然想到了重量作为解谜要素的点子,于是这个功能开发就正式开始了。

1 重量计算


首先确定主角有一个重量值,可被举起来的物件也有重量。当角色将物体举起来的时候,将该物体的重量值累加到角色身上。

在按钮上,则需要添加一个需要多少重量的数值参数,例如我目前设置的100。

最后,判定角色踩在按钮上:

  • 为角色脚下添加一个虚拟点,比角色的高度低2个像素
  • 判定这个虚拟点和按钮重叠
  • 判定角色的重量+所持物品的重量和按钮的重量需求关系,相减得出还差多少重量才能开门

weight.gif

2 按钮的高度匹配

在这里我使用了一个小技巧:

  • 数字的插值,让重量不是直接到达相减值,而是慢慢到达
  • 为了让按钮逐步向下沉,我需要想办法让按钮的高度和当前显示的数字(缓动数字)能够匹配上。
  • 按钮的踩下高度是一个序列帧动画。计算当前重量/重量需求,可以得到一个当前重量的百分比,用这个百分百对应序列帧的帧数。这样,按钮的高度就和当前的重量匹配上了。 button1.png
  • 甚至我可以将门的打开进度,也许用这个方法可以做那种限时通过的门?

door.gif

3 修改方案

紧接着我发现一个问题:只有主角踩在按钮上的时候按钮才能称重。但是物体单独放在上面的时候重量都不会改变:

image.pngimage.pngimage.png

以上3种情况(甚至叠着多个箱子)都会无法称重。

解决方案:

  • 在按钮上添加变量,记录当前按钮上所有的物体+角色的重量,用于和重量需求做比较
  • 当按钮被创建的时候,为按钮创建一个虚拟碰撞体。这个碰撞体用来检测按钮上到底都放了什么,他们的重量是多少,并记录所有物体的重量总和
    •       碰撞体的宽度=按钮宽度    
    •       碰撞体的高度=按钮向上检测到屋顶(或其他阻挡物)
    •       image.pngimage.pngimage.png    
  • 接下来就是计算检测环节了:
    • 计算碰撞区域内的角色重量+手持物体重量,须满足角色并没有跳起来,处于地面(包括站在其他物体上)
    • 计算碰撞区域内的所有物体的重量,须满足物体没有在空中,处于地面(包括落在其他物体上),并且没有被玩家拿着)
    • 最后将所有物体的重量相加计算出当前按钮上所有物体的综合重量
  • 注意,这个解决方案并不完美,例如在L拐角的位置,按钮上方有半个阻挡块,或有其它新规则物体的情况。但在当前规则下应该足够使用了。所以当游戏添加新的规则时还需要注意不要与其冲突。

万岁!完成了

GIF.gifGIsF.gif

近期喜欢的会员

 
离砂 2018-09-07

很棒,很有趣

 

加入 indienova

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