如何让角色在撞墙后继续移动

我正在开发一款iPhone游戏。 有一个用户不应该能够穿过的喷泉。 现在,这个问题是关于检查圆点碰撞或类似的事情。 我正在检查碰撞CGRectIntersectsRect(character1.frame, fountain.frame)

但是,这是问题:如果我阻止这个人移动; 他将永远无法移动。 所以我试着用下面的方法来解决这个问题:

  if (character.center.y > fountain.center.y && CGRectIntersectsRect(character1.frame, fountain.frame) && g == false) { g = true; character1.center = CGPointMake(character1.center.x, character1.center.y-0.1); } if (character.center.x > fountain.center.x && CGRectIntersectsRect(character1.frame, fountain.frame)) { character1.center = CGPointMake(character1.center.x-0.1, character1.center.y); } if (character.center.y < fountain.center.y && CGRectIntersectsRect(character1.frame, fountain.frame)) { character1.center = CGPointMake(character1.center.x, character1.center.y+0.1); } if (character.center.x < fountain.center.x && CGRectIntersectsRect(character1.frame, fountain.frame)) { character1.center = CGPointMake(character1.center.x+0.1, character1.center.y); } 

这应该检查character1与喷泉相交的哪一边,然后通过递增或递减字符的x或y坐标来使其不与喷泉相交。 但是,这仍然给出奇怪的结果。 如果一直按住喷泉的顶部,那么它将沿着喷泉对角地移动,并且它将继续在喷泉的顶部向左移动。

一般来说,这种处理的方式是沿着碰撞正常方向向后移动。 你发现碰撞发生在轴上(法线是一个物理学术语,只要把它看作是指示你穿透另一个物体的方向的vector),然后你知道你要移回那个vector多远,不再是碰撞。参见http://gpwiki.org/index.php/Polygon_Collision获取更多信息&#x3002;

在角色移动到新的位置之前,我会检查碰撞。 所以当你更新角色的位置时,你知道它是有效的。