2017-05-09 105 views
1

我对游戏制造者来说很新奇,而且我在功能上遇到了一些麻烦。粘在表面游戏机上的球

我正在做一个类似pong的游戏,当球与桨的顶部或底部(较小的一侧,而不是面对)球和桨冻结时,我遇到了一个问题。

我在碰撞事件中使用桨的唯一代码是颠倒水平速度。

hspeed * = -1;

我明白这个问题,因为球已经与顶部接触,水平方向反转,但它仍然与表面接触,因为动力速度没有改变,所以再次反转,并卡在一个无限循环。

我试过很多事情要解决它,如设置报警检测如果球在一帧后,仍然触摸并扭转垂直速度(没有成功)

我也试过检查球顶部的y位置是否与桨叶底部的y位置相同(反之亦然),如果是,则反转垂直速度。但再次没有成功。

我敢肯定,如果使用了正确的代码,这两种方法都能正常工作,但我必须执行错误。

我应该使用什么方法来使它与桨的顶部或底部相碰撞,它不会卡住,理想情况下只是反转垂直速度而不是水平速度?

我敢肯定,这有一个简单的解决方案,但因为我是新的,我无法解决它!

谢谢!

回答

0

我的解决方案是当球与桨碰撞时更改实例。创建一个与当前对象几乎相同的对象,然后删除碰撞事件,但将创建事件设置为以反向速度移动。球会按照你想要的方向移动,但不会卡住。然后您可以检查是否有空的空间,如果有,请将对象改回原始球。

+0

我不建议为这个简单的东西创建另一个实例。 – Timtech

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值加或减其宽度},这将表示垂直碰撞。