在精灵工具包中发生碰撞时停止对象

时间:2014-06-27 21:11:43

标签: objective-c sprite-kit skphysicsbody

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

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

我还缺少其他任何设置吗?

2 个答案:

答案 0 :(得分: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自动执行碰撞计算。

答案 1 :(得分:0)

如果你是通过用户输入移动你的精灵(例如SKAction的moveTo),那么你很可能不会使用物理来移动你的精灵。在这种情况下,你应该将物理体的速度设为0-这将使精灵在与另一个物体接触时完全僵硬。

尝试:

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

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