【问题标题】:Swift Sprite Collision. Objects passing Through walls快速精灵碰撞。穿过墙壁的物体
【发布时间】:2016-03-06 10:42:24
【问题描述】:

我正在制作一个简单的游戏(使用 Swift 和 SpriteKit),其中有一个可以拖动的圆圈。但是圆圈是不允许穿墙的。

我的碰撞位掩码完美运行,但是当我拖动得足够快时,圆圈最终会穿过墙壁。

Player Sprite 的初始化过程如下:

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)

        }
}

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

【问题讨论】:

    标签: swift sprite-kit collision-detection


    【解决方案1】:

    从您的代码很难判断。 你为什么把碰撞称为

     ColliderType.Wall.rawValue + ColliderType....
    

    我以前没见过用“+”作为分隔符,通常你使用“|” 将它们分开。

     ColliderType.Wall.rawValue | ColliderType....
    

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

    您也尝试过像这样使用精确的碰撞检测吗?

    ...physicsBody.usesPreciseCollisionDetection = true.
    

    Apple 对这个 bool 的描述如下

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

    不确定这是否有帮助

    【讨论】:

    • 完美,为我解决了问题!谢谢!至于碰撞位掩码,我应该把它改成“|”而不是“+”。这只是一个 UInt32 匹配的实验,据我测试.. 它出奇的有效!
    • 我试过这个,但它没有帮助我。所以我创造了一种不同的方式来做到这一点。点击here查看
    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 2016-04-24
    • 2023-03-25
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    相关资源
    最近更新 更多