【问题标题】:SpriteKit; How to add a physicsbody to CGMutablePath/SKShapeNode (drawn line)?精灵套件;如何将物理体添加到 CGMutablePath/SKShapeNode(画线)?
【发布时间】:2021-04-08 08:21:09
【问题描述】:

我目前正在尝试在 SpriteKit 中实现先前生成的 SpriteNodes 从用户绘制的线反弹。为此,我需要给它们一个物理体,以便物体可以碰撞。 有谁知道如何实现这个? 非常感谢!

这里是代码块:

-- 更新:问题解决了!这个问题中的工作代码。 --

func createLine() {
        let path = CGMutablePath()
        path.move(to: pathArray[0])
        
        for point in pathArray {
            path.addLine(to: point)
        }
        
        let line = SKShapeNode()       
        line.path = path
        line.fillColor = .clear
        line.lineWidth = 1
        line.zPosition = 3
        line.strokeColor = .cyan
        line.lineCap = .round
        line.glowWidth = 20
        
        line.physicsBody = SKPhysicsBody(polygonFrom: path)
        line.physicsBody?.affectedByGravity = false
        line.physicsBody?.isDynamic = true
        line.physicsBody?.categoryBitMask = CollisionTypes.line.rawValue
        line.physicsBody?.contactTestBitMask = CollisionTypes.atom.rawValue
        
        self.addChild(line)
        
        let wait = SKAction .wait(forDuration: 1.5)
        
        let fade:SKAction = SKAction.fadeOut(withDuration: 1)
        fade.timingMode = .easeIn
        let remove: SKAction = SKAction.removeFromParent()
        
        line.run(SKAction.sequence([wait, fade, remove]))
        
    }

联系代表:

let contactA:SKPhysicsBody = contact.bodyA
let contactB:SKPhysicsBody = contact.bodyB
        
let nodeA = contactA.node
let nodeB = contactB.node
        
        
if contactA.categoryBitMask == 2 || contactB.categoryBitMask == 2 {
      print("line hit")
}

【问题讨论】:

标签: swift sprite-kit ipad-playgrounds


【解决方案1】:

有不同类型的物理实体(圆形、矩形、多边形、alpha 蒙版、基于边缘)。对于 CGMutablePath,您希望从路径创建链。 要实现它,请替换此行:

line.physicsBody? = SKPhysicsBody()

有了这个:

line.physicsBody = SKPhysicsBody(edgeChainFrom: path)

【讨论】:

  • 是的,非常好。不幸的是,ContactDelegate 仍然无法识别这条线......所以在 func createLine() 中我插入了这条线:line.physicsBody?.categoryBitMask = CollisionTypes.line.rawValue。在 didBegin 中仍然没有检测到该行...(当然我添加了带有 uint32 和更多内容的枚举)
  • 好的。使用 showsPhysics = true 这样您就可以看到您正在处理的物理实体(它会让您放心它们在那里并且形状正确)。确保在 line shapenode 和 spritenodes 上设置 categoryBitMask 和 collisionBitMask。理想情况下,您应该使用这些项目更新问题。
  • 好的,我在帖子中添加了一些新信息。添加 showPhysics 绝对不错。
  • 好的,谢谢。所以物理体仍然没有创建,即使使用“polygonFrom:path”?乍一看,在您的原始帖子中,它缺少原子 categoryBitMask 和物理体设置,并且 ContactDelegate 似乎不正确。添加 showPhysics = true 后原子是否正确显示?
  • 是的,原子表示正确的物理体。接下来是 Contact Delegate 的问题,因为我不知道如何检测 SKSpriteNode 和 SKShapeNode 是否相互碰撞。但首先我必须让这条线得到一个物理体......
【解决方案2】:

工作代码在问题上方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多