在精灵套件中发生碰撞时停止对象

Posted

技术标签:

【中文标题】在精灵套件中发生碰撞时停止对象【英文标题】:Stopping objects when collision occurs in sprite kit 【发布时间】:2014-06-27 21:11:42 【问题描述】:

我正在使用 Apple 的 SpriteKit 和 SKPhysics 构建一个游戏,它们使用根据用户输入在屏幕上移动的方块。我遇到了碰撞问题,如果它们发生碰撞,方块会移动到不合适的位置。例如,如果所有块都向右移动,则同一“行”上的任何块都需要彼此相邻堆叠,并且不重叠或垂直移动位置。截至目前,它们将改变垂直方向。这是我的代码:

self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.dynamic = YES;
self.physicsBody.allowsRotation = NO;
self.physicsBody.affectedByGravity = NO;

我还缺少其他设置吗?

【问题讨论】:

如果您需要精确运动,最好不要使用物理运动。您可以尝试在更新期间将节点位置的 x 或 y 分量设置为固定坐标,以使其不应沿特定轴移动。这就是你所能做的。 【参考方案1】:

问题可能来自您的 collisionBitMask 类别。为了解决这个问题,您需要首先为块的物理体创建类别,如下所示:

struct PhysicsCategory 
    static let None : UInt32 = 0
    static let All : UInt32 = UInt32.max
    static let block : UInt32 = 0b1
    

然后将块的设置设置为以下。

    block.physicsBody?.categoryBitMask = PhysicsCategory.block
    block.physicsBody?.collisionBitMask = PhysicsCategory.None

这应该可以防止 spritekit 自动执行碰撞计算。

【讨论】:

这似乎是最简单的解决方案,对我的小 Pong 测试非常有效。投票最多的答案肯定更干净。【参考方案2】:

如果您通过用户输入(例如 SKAction 的 moveTo)移动精灵,那么您很可能没有使用物理来移动精灵。在这种情况下,您应该将物理体的速度设置为 0——这将使精灵在与另一个物体接触时完全刚性。

试试:

self.physicsBody.velocity = CGVectorMake(0, 0);

您应该将此代码放入更新循环中。

【讨论】:

以上是关于在精灵套件中发生碰撞时停止对象的主要内容,如果未能解决你的问题,请参考以下文章

检测精灵套件中的碰撞

在节点中使用精灵套件问题进行游戏开发?

子精灵的精灵套件碰撞检测

SpriteKit中精灵之间的碰撞

精灵套件目标 c 中的停止按钮

使用精灵套件游戏覆盖功能