【问题标题】:How to set physics body for a sprite with rounded corners如何为圆角精灵设置物理体
【发布时间】:2017-05-24 13:52:16
【问题描述】:

我通过以下方式创建了SKShapeNode

let sprite = SKShapeNode(rect: CGRect(x: -20, y: -10, width: 40, height: 20), cornerRadius: 10)

我也这样设置物理体,

sprite.physicsBody = SKPhysicsBody(rectangleOf: sprite.frame.size)

但我意识到碰撞和接触并不精确,所以我将showsPhysics 更改为true 并得到以下信息。我怎样才能使物理体精确,即使是圆角?

【问题讨论】:

    标签: swift swift3 sprite-kit skphysicsbody


    【解决方案1】:

    来自documentation

    也许#4 是你的情况

    let spaceShipTexture = SKTexture(imageNamed: "spaceShip.png")
    

    宇宙飞船 1:圆形物理体

    let circularSpaceShip = SKSpriteNode(texture: spaceShipTexture)
    circularSpaceShip.physicsBody = SKPhysicsBody(circleOfRadius: max(circularSpaceShip.size.width / 2,
                                                                      circularSpaceShip.size.height / 2))  
    

    宇宙飞船 2:矩形物理体

    let rectangularSpaceShip = SKSpriteNode(texture: spaceShipTexture)
    rectangularSpaceShip.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: circularSpaceShip.size.width,
                                                                         height: circularSpaceShip.size.height))
    

    宇宙飞船 3:多边形物理体

    let polygonalSpaceShip = SKSpriteNode(texture: spaceShipTexture)
    let path = CGMutablePath()
    path.addLines(between: [CGPoint(x: -5, y: 37), CGPoint(x: 5, y: 37), CGPoint(x: 10, y: 20),
                            CGPoint(x: 56, y: -5), CGPoint(x: 37, y: -35), CGPoint(x: 15, y: -30),
                            CGPoint(x: 12, y: -37), CGPoint(x: -12, y: -37), CGPoint(x: -15, y: -30),
                            CGPoint(x: -37, y: -35), CGPoint(x: -56, y: -5), CGPoint(x: -10, y: 20),
                            CGPoint(x: -5, y: 37)])
    path.closeSubpath()
    polygonalSpaceShip.physicsBody = SKPhysicsBody(polygonFrom: path)
    

    宇宙飞船 4:使用纹理 Alpha 通道的物理体

    let texturedSpaceShip = SKSpriteNode(texture: spaceShipTexture)
    texturedSpaceShip.physicsBody = SKPhysicsBody(texture: spaceShipTexture,
                                                  size: CGSize(width: circularSpaceShip.size.width,
                                                               height: circularSpaceShip.size.height))
    

    【讨论】:

    • 那不行,因为没有纹理,它只是一个 SKShapeNode!
    • @ThiagoAM SKShapeNode 性能低下。从 SKView 将其转换为 SKSpriteNode(您可以创建 skshapenode、thake 纹理并创建 skspritenode):func texture(from node: SKNode) -> SKTexture?
    • 每种方法都有其优点和缺点,圆形方法最快,多边形方法最精确,纹理几乎一样精确,但工作量少,矩形方法最平衡在性能和复杂性方面。
    【解决方案2】:

    请记住,过多的精度对性能非常不利。读这个: https://developer.apple.com/reference/spritekit/skphysicsbody

    对于一般情况,最好忽略拐角并坚持正常的矩形物理,除非您真的需要这种精度。如果这样做,您可以在 SKSpriteNode 上使用 SKTexture 而不是 ShapeNode。那会容易得多,因为您可以简单地这样做:

    let size = CGSize(width: 100, height: 50)
    let roundedRectangleTexture = SKTexture(image: UIImage(named: "textureImage")!)
    let mySpriteNode = SKSpriteNode(texture: roundedRectangleTexture, size: size)
    mySpriteNode.physicsBody = SKPhysicsBody(texture: roundedRectangleTexture, size: size)
    

    使用纹理,您只需使用SKPhysicsBody(texture: size:) 构造函数即可轻松制作更详细和精确的physicsBody。

    【讨论】:

    • 注意:如果纹理中有间隙,SKPhysicsBody(texture: size:) 将无法正常工作。
    【解决方案3】:

    我会按照SKPhysicsBody 的文档,创建一个近似于你的精灵圆角的多边形。

    文档中的一个示例显示您可以像这样定义多边形物理体:

    // Spaceship 3: polygonal physics body
    let polygonalSpaceShip = SKSpriteNode(texture: spaceShipTexture)
    let path = CGMutablePath()
    path.addLines(between: [CGPoint(x: -5, y: 37), CGPoint(x: 5, y: 37), CGPoint(x: 10, y: 20),
                            CGPoint(x: 56, y: -5), CGPoint(x: 37, y: -35), CGPoint(x: 15, y: -30),
                            CGPoint(x: 12, y: -37), CGPoint(x: -12, y: -37), CGPoint(x: -15, y: -30),
                            CGPoint(x: -37, y: -35), CGPoint(x: -56, y: -5), CGPoint(x: -10, y: 20),
                            CGPoint(x: -5, y: 37)])
    path.closeSubpath()
    polygonalSpaceShip.physicsBody = SKPhysicsBody(polygonFrom: path)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多