[求助]GMS2的物理引擎是否是“连续”的?
题目表述的不是特别清楚,我用下面一张图来解释一下我的疑问
上图中room启动了物理引擎,白色和蓝色方块均为物理物体
白色方块最初的移动和跳跃分别通过调整phy_speed_x和phy_speed_y来实现
在跳跃起来后通过physics_pause_enable(true)命令来暂停物理引擎
之后通过调整白色方块的坐标来实现移动
再使用physics_pause_enable(false)来取消物理引擎的暂停效果后,可以看到白色方块会回到暂停的位置,保持暂停时的运动状态继续运动
如果尝试不修改整个room的物理状态,而是通过phy_active来关闭白色方块本身的物理状态,则如下图
白色方块在空中使用phy_active = false来离开物理计算
但这时修改白色方块的坐标(即修改x和y值)无法使白色方块移动
使用phy_active = true后白色方块保持之前的物理状态进行运动
由以上一个实验我产生了一个疑问,GMS2的物理引擎是否必须是“连续”的?
在阅读物理引擎的官方文档里,发现对物理的介绍提到过一句“Normally for a physics simulation to work, it must be continuous and cannot be stopped and started, or have instances suddenly moved from one place to another in the room.”
是否这就意味着我无法在游戏的部分过程中使用物理引擎来简化一些复杂运动的代码量(比如使用钩锁钩住移动的天花板,还可以调整钩锁长度的单摆运动),而部分简单运动则使用坐标相关代码?
我原本打算制作一个平台跳跃游戏,角色可以使用钩锁钩住墙壁或天花板来做单摆运动越过障碍,我也尝试过使用圆的方程来还原,勉强能够实现单摆运动,但如果钩住的天花板会移动,以及钩锁的长度可以在单摆运动中变化,按我现在的能力不用物理引擎还真写不出来,于是想到了在钩锁部分使用物理引擎来简化计算的方法,结果就像上图那样难以实现
我也尝试过纯粹使用物理引擎来写这个游戏,而且由于碰撞检测不再需要自己写代码,代码量减少了很多,然而……
由于使用了物理引擎后会计算object在碰撞后的角速度,或者站在悬崖边上时向下掉落的角速度(即使角度阻尼值写得很大也无法避免),如果加载画好的人物sprite就会变得很诡异
我也尝试过使用draw命令来避免人物sprite角度乱动的状态,但是由于物理引擎还是会计算站在悬崖边上时object向下落的情形,当站的过于靠边的情况下还是会出现运动轨迹诡异的情况
在尝试了很久也阅读了游戏的帮助文档以后确实找不到解决办法,因此想要请问各位大佬,GMS2里是否确实无法让物理引擎“不连续”?
不要用内置的物理
今天阅读了一些相关的开发教程,发现自己对物理引擎的理解还是不够深,目前对我自己提出的问题想到了一些解决办法
比如可以使用物理引擎来重写整个游戏,其中我遇到的问题和解决办法如下
1.物理引擎启动状态下无法使用修改object的x和y来进行物体移动
解决办法:使用phy_position_x和phy_position_y来替代x和y,效果一致
2.object在碰撞到墙壁的边角后会发生旋转导致动画变得很诡异
解决办法:在创建obj_player的时候加上phy_fixed_rotation = true即可
目前遇到的问题和解决办法基本是这样