快速精灵碰撞。穿过墙壁的物体

时间:2016-03-06 10:42:25

标签: swift sprite-kit collision-detection

我正在制作一个简单的游戏(使用Swift& SpriteKit),我有一个可以拖动的圆圈。但是圈子不允许通过墙壁。

我的碰撞BitMask工作得很好,但当我拖得足够快时,圆圈最终穿过墙壁。

玩家精灵的初始化就像这样:

func initPlayerSprite(){
        let playerTexture = SKTexture(imageNamed: "player.png")
        let originX = CGRectGetMidX(self.frame)
        let originY = CGRectGetMidY(self.frame)
        player = SKSpriteNode(texture: playerTexture, size: CGSize(width: 26, height: 26))

        player.position = CGPoint(x: originX , y: originY)

        player.physicsBody = SKPhysicsBody(circleOfRadius: playerTexture.size().height/2)
        player.physicsBody!.dynamic = true
        player.physicsBody?.allowsRotation = false

        player.physicsBody!.categoryBitMask = ColliderType.Player.rawValue
        player.physicsBody!.contactTestBitMask = ColliderType.Floor.rawValue + ColliderType.Gap.rawValue
        player.physicsBody!.collisionBitMask = ColliderType.Wall.rawValue + ColliderType.Floor.rawValue

        self.addChild(player)
    }

我移动Sprite的代码是这样的:

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?){

        var nodeTouched = SKNode()

        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            let dx = -player.position.x + location.x
            let dy = -player.position.y + location.y
            let movePlayer = SKAction.moveBy(CGVector(dx: dx, dy: dy), duration: 0.02)

        }
}

任何想法如何确保碰撞检测即使在高速下也能正常工作?

1 个答案:

答案 0 :(得分:2)

从你的代码很难判断。 你为什么要调用像

这样的碰撞
 ColliderType.Wall.rawValue + ColliderType....

我之前没有看过这个&#34; +&#34;作为分隔符,通常使用&#34; |&#34; 分开他们。

 ColliderType.Wall.rawValue | ColliderType....

根据我的理解,使用加号应该将两个值一起添加,并且不会将其视为2种碰撞类型。我可能在这里错了。

您是否也尝试使用精确碰撞检测?

...physicsBody.usesPreciseCollisionDetection = true.

Apple将此bool描述如下

默认值为NO。如果碰撞中的两个物体不执行精确的碰撞检测,并且一个物体在一个帧中完全穿过另一个物体,则不会检测到碰撞。如果在任一主体上将此属性设置为YES,则模拟会执行更精确且更昂贵的计算来检测这些冲突。在小而快速移动的物体上,此属性应设置为YES。

不确定这有帮助