GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

173 信息 844 成员
游戏开发工具 GameMaker Studio 2 的讨论小组

[GMS2分享与求助]place_meeting和physics_test_overlap的差异

妹控的藤藤 2020-07-25

由于正在制作一个需要调用物理引擎平台跳跃游戏,尝试把非物理引擎下的平台跳跃系统重写进物理引擎下

在写状态机的时候遇到了place_meeting和physics_test_overlap的差异引起的问题

帮助手册的“Collision Checking”页面里的“Physics Collisions”标签下写到“When using the build in physics, the above collision functions are not guaranteed to work for physics enabled instances. This is mainly due to the fact that these instances no longer use the majority of the regular built in variables (instead, physics enabled instances have their own set of variables) and neither do they use the collision mask or bounding box, as they use fixtures instead. ”,简单来说就是因为物理object会使用fixture而非collision masks或bounding box,因此place_meeting等常用的Collision Checking命令无法很好地运行,实际强行使用也确实会出现一些运行不正常的情况(没有保存不正常例子的gif)

因此在使用物理引擎的情况下要进行Collision Checking,手册中仅提到了使用physics_test_overlap

单独建了一个实验室工程来说明问题

*以下代码中的obj_StaticParent指的就是蓝色方块

Image title


如上图所示,当使用代码

if physics_test_overlap(phy_position_x,phy_position_y+1,0,obj_StaticParent)

phy_speed_y = 0;

来判断白色方块是否站在蓝色方块上方时,由于右边方块与右侧的蓝色方块发生接触,physics_test_overlap的返回值为true,因此触发了phy_speed_y = 0,而左边的白方块则正常落到蓝色方块上后才触发phy_speed_y = 0

Image title


如上图,而如果用

if place_meeting(x,y+1,obj_StaticParent)

yspeed = 0;

来写判断白色方块是否在蓝色方块的上方,则会不会因为白色方块右侧紧贴蓝色方块而触发yspeed = 0,仅在下方接触到蓝色方块后触发yspeed = 0

Image title


同理在水平方向上,如上图

当使用

if physics_test_overlap(phy_position_x+1,phy_position_y,0,obj_StaticParent)

phy_speed_x = 0;

来判断白色方块是否在右侧碰撞到蓝色方块时,下面的白色方块会因为接触到了在下方的蓝色方块而返回true,进而phy_speed_x被赋值为0

Image title


如上图,如使用

if place_meeting(x+1,y,obj_StaticParent)

xspeed = 0;

来判断白色方块是否在右侧碰撞到了蓝色方块时,不会因为下方接触到了蓝色方块而返回true,能够正常使用

由以上实验可以判断出,physics_test_overlap命令会判断两个实例的fixture是否会“接触”,即fixture和fixture紧贴着而没有任何像素发生重合也会判断为true,

而place_meeting则会判断两个实例的collision masks或bounding box是否会“重合”,即两个实例仅collision masks或bounding box发生了重合才会返回true,否则即使是两个实例相距0像素紧贴在一起,返回值也会是false

这就是我发现的两个命令的差异

以下就是我遇到的问题

我原本写状态机的时候使用

if place_meeting(x,y+1,obj_StaticParent)

MyState = myState = playerstate.onGround;

来实现当玩家控制的object站在地面上(即判断下方1像素的位置是obj_StaticParent)则让状态机进入onGround状态

我在物理系统中替换成

if physics_test_overlap(phy_position_x,phy_position_y+1,0,obj_StaticParent)

MyState = myState = playerstate.onGround;

Image title


这种左右侧紧贴着墙壁的状态也会被认为是onGround,即使下方根本没有接触到obj_StaticParent

同理判断左右是否贴墙的时候也会受到上下影响

由于我没有系统的学过编程,除了对代码不熟悉以外更重要的就是缺乏程序员思维,这让我在遇到这个问题以后是在想不出变通解决之道,希望大佬不吝赐教

 
阿卡丽儿 2020-07-27

这个墙壁和地面是同一个物体吗,把他们分开才合理吧?

 
yellow 2020-07-27

我给你个建议,别用物理。白天有工作,晚上写一个例子给你参考,有问题可以联系我。

-------------------------更新--------------------------

不能传文件,我给你发个网盘链接,都是我以前写过的刚才给拼一拼,有啥问题凑合一下,意思肯定是出来了Image title

链接:https://pan.baidu.com/s/1wnXzKufy1ALcy6SSvzZ-zg
提取码:qtna

 

加入 indienova

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