我对Game maker很新,我在使用某个功能时遇到了一些麻烦。
我正在进行类似乒乓球的比赛,当球与球的顶部或底部(较小的一侧,而不是面朝上)球和球拍冻结时,我遇到了一个问题。 / p>
球与桨的碰撞事件中唯一的代码是反转水平速度。
hspeed * = -1;
我理解这个问题,因为球已经与顶部接触,水平方向反转,但是它仍然与表面接触,因为切换速度没有改变所以再次反转,并陷入无限循环。
我已经尝试了很多东西来解决它,例如设置闹钟以检测球在一帧之后是否还在接触并且反转垂直速度(没有成功)
我还试图检查球顶部的y位置是否与桨底部的y位置相同(反之亦然),如果为真,则反转垂直速度。但又没有成功。
我确信如果使用正确的代码,这两种方法都有效,但我必须执行错误。
我应该用什么方法来制作它,这样如果球碰撞桨的顶部或底部,它就不会卡住,理想情况下只是反转垂直速度而不是水平速度?
我确信这有一个简单的解决方案,但因为我是新手,我无法解决它!
谢谢!
答案 0 :(得分:0)
我的解决方案是在球与球拍碰撞时改变实例。创建一个与当前对象几乎相同的对象,然后删除碰撞事件,但将create事件设置为以相反的速度移动。球会沿着你想要的方向移动,但不会被卡住。然后,您可以检查是否有空格,如果有,则将对象更改回原始球。
答案 1 :(得分:0)
首先,这是一个很好的问题。我不知道你是如何检查碰撞的,但是如果你在一个步骤事件中做(而不是碰撞事件或其他),你应该能够检查水平和垂直碰撞分开。例如(用桨对象的名称替换obj):
if (position_meeting(x-1, y, obj) || position_meeting(x+1, y, obj)) {
//horizonal collision
}
if (position_meeting(x, y-1, obj) || position_meeting(x, y+1, obj)) {
//vertical collision
}
这样可以检测到边缘情况,它会完全碰到一个角落,在这种情况下,你可能想要翻转两种速度。
你也可以做更像你建议的事情,即使是使用碰撞事件,只需检查球的x值(假设你的两个精灵都居中)是否小于{桨的x' -value加或减其宽度},表示垂直碰撞。