为啥物体会相互夹住?
Posted
技术标签:
【中文标题】为啥物体会相互夹住?【英文标题】:why are objects clipping behind each other?为什么物体会相互夹住? 【发布时间】:2020-09-28 20:37:11 【问题描述】:我正在制作一个脚本,通过优先考虑 y 变量来对我的对象的深度进行排序,但随后会检查彼此接触的对象是否越靠右越深,但是对于最后一部分不起作用的某种原因。
代码如下:
ds_grid_sort(_dg,1,true);
_yy = 0;
repeat _inst_num
_inst = _dg[# 0, _yy];
with _inst
with other
if (x > _inst.x and y = _inst.y)
_inst.depth = depth + building_space;
_yy++;
我发现问题在于,当游戏检查 _inst
语句的 y = _inst.y
部分时,没有任何结果是真实的,但是看看它们是怎么回事没有任何意义在同一y坐标。有人可以告诉我我做错了什么吗?
【问题讨论】:
【参考方案1】:正如 Steven 所提到的,使用双等号进行比较 (y == _inst.y
) 和使用单个等号进行赋值 (_yy = 0;
) 是一种很好的做法,但 GML 并不关心您是否使用单个等号进行比较,所以它不会引起你的问题。尽管它在 GML 之外的几乎所有其他语言中都很重要。
据我了解,问题似乎是您对other
的使用。当您使用代码with other
时,它不会遍历所有其他对象,它只会抓取一个实例。您可以通过运行此代码并查看它显示多少调试消息来测试:
...
with other
show_debug_message("X: "+string(x)+"; Y: "+string(y));
...
您可以使用with all
。这将遍历所有对象或with object
,其中object
是对象或父对象。这将遍历该对象的所有实例。但是,这些函数都不会检查对象是否重叠(它只是要遍历所有对象),因此您必须检查碰撞。你可以这样做:
...
with all
if place_meeting(x, y, other)
if (x > _inst.x and y = _inst.y)
_inst.depth = depth + building_space;
...
我不知道您的其余代码是什么样的,但可能有一种更简单的方法可以实现您的目标。是否可以根据 x 和 y 变量初始设置深度?诸如depth = -x-y;
之类的东西? 对于不熟悉 GameMaker 的人来说,深度值较小的对象会绘制在深度值较高的对象之上;这就是为什么我建议将深度设置为-x-y
。 下面是该网格的视图(第一行和第一列是 x 和 y 变量;其他数字是对象的深度在那个位置):
拥有一个所有事物都在运行的方程式也将使得如果您有任何移动的东西(例如玩家),您可以轻松有效地更新它们的深度,以便能够相对于所有其他对象正确显示它们。
【讨论】:
【参考方案2】:我认为应该是y == _inst.y
。
但我不确定 GML 是否倾向于接受这种格式。
使用条件时最好使用==
检查它们是否相等。
【讨论】:
以上是关于为啥物体会相互夹住?的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D动画播放完毕后,为啥物体状体会默认回到之前的状态
为啥 Excel 2010 VBA 用户窗体文本框字体会根据框架的大小而变化?