0

我有一个使用 UiKit 动态实现的简单游戏。游戏中有块(红色的)与网格对齐,如下图所示。块从顶部落下并停留在底部网格中

在此处输入图像描述

假设使用参考 1 调用底部网格行,我想检查块在哪个网格参考中。我通过使用 CGGeomentry、CGRectContainsPoint([grid frame] 来执行此操作,然后将网格编号即 1 分配给块。如上图所示,它适用于单个块。

现在看第二张图。

在此处输入图像描述

一旦第二个块堆叠在第一个块的顶部,您会注意到网格第 2 行和第二个块之间的间隙。一旦有更多的块堆叠在一起,这个间隙就会增加。由于这个间隙,CGRectContainsPoint 计算为超过 6 的网格行给出了错误的网格数。

换句话说,第一个块应该分配网格第 1 行,第二个块应该分配网格第 2 行。由于块的帧大小和网格帧大小相同,因此对于块 10 或块 100 应该是正确的。但是因为这个间隙,经过一些街区后,网格分配看起来不对,即街区 6 将网格编号设为 5。

我正在使用 UIKit 动力学重力行为来使块从顶部掉落,并使用碰撞行为来确定碰撞。我什至将弹性属性设置为 0.0 以降低弹性。

我的问题是为什么当网格框架大小和块框架大小相同时我会得到这个许可。他们不应该完全适合吗?我怎样才能摆脱这个许可?

当更多的块堆叠在下面的图片中时,你可以看到间隙越来越大 在此处输入图像描述

谢谢

4

1 回答 1

1

不要将 UIKit Dynamics 用于物理模拟。它不是为它设计的。它旨在创建赋予它们物理感的动画。

如果我在做这样的事情,我可能只会使用 UIKit 和 UIView 动画。

事实上,我在博客上写过类似的东西,它使用 AutoLayout 来放置可能有用的块?

你可以在这里看到自动布局游戏。

要么使用 SpriteKit,但仍然不使用物理。

对于大多数游戏,我会避免使用物理(即在重力或其他力下作用的物理物体)。甚至像马里奥(2D 侧平台游戏)和 Flappy Bird 这样的游戏也不使用物理。他们使用非常精确计算的动作。

马里奥中的跳跃实际上被分成几个不同的动画,以使用户更容易为跳跃计时和着陆。在大多数情况下,仅使用物理实际上会使游戏更难玩。

显然,像愤怒的小鸟这样的游戏是不同的,因为它们的本质需要物理来模拟小鸟的飞行和积木的下落。但是用户不与物理交互。它只是根据他们以前的行为进行的。

于 2014-08-21T08:03:15.737 回答