Сделайте SKPhysicsBody для SKShapeNode - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь создать игру, в которой игрок каким-то образом скользит по земле, не падая при движении по склонам. Я создал BezierPath, преобразованный в SKShapeNode для земли, а игрок - SKSpriteNode. Я выяснил, на сайте Apple, способ сделать это с помощью этого класса: https://developer.apple.com/documentation/spritekit/skphysicsjointsliding Проблема в том, что для первого тела требуется SKPhysicsBody. Кажется, я не могу сделать свой ShapeNode физическим телом.

    //this is where I create my ground shape
    let groundBezier = UIBezierPath()
    groundBezier.move(to: .zero)
    groundBezier.addLine(to: CGPoint(x: 0, y: 1000))
    groundBezier.addLine(to: CGPoint(x: 500, y: 1000))
    groundBezier.addQuadCurve(to : CGPoint(x: 750, y: 750),
                          controlPoint: CGPoint(x: 650, y: 1000))
    groundBezier.addQuadCurve(to : CGPoint(x: 1000, y: 500),
                          controlPoint: CGPoint(x: 850, y: 500))
    groundBezier.addCurve(to : CGPoint(x: 1400, y: 700),
                      controlPoint1: CGPoint(x: 1200, y: 500),
                      controlPoint2: CGPoint(x: 1200, y: 700))
    groundBezier.addCurve(to : CGPoint(x: 1700, y: 400),
                          controlPoint1: CGPoint(x: 1600, y: 700),
                          controlPoint2: CGPoint(x: 1600, y: 400))
    groundBezier.addLine(to: CGPoint(x: 1700, y: 0))
    groundBezier.addLine(to: .zero)
    // Convert First Slope From UIBezierPath to SKShapeNode
    let groundNode = SKShapeNode(path: groundBezier.cgPath)
    // Define First Slope
    groundNode.lineWidth = 5
    groundNode.physicsBody = SKPhysicsBody(edgeChainFrom:   groundNode.path!)
    groundNode.physicsBody?.restitution = 0.0
    groundNode.physicsBody?.isDynamic = false
    groundNode.fillColor = UIColor.white


    // this is where I create my players physics body I Followed apple docs
    // Create Player's Circular Physics Body
    let circularPlayertexture = SKSpriteNode(texture: playertexture)
    // Define Player's Circular Physics Body
    circularPlayertexture.physicsBody = SKPhysicsBody(circleOfRadius: max(circularPlayertexture.size.width / 2,
                                                                          circularPlayertexture.size.height / 2))
    // Make Player's Final Physics Body
    player.physicsBody = SKPhysicsBody(texture: playertexture,
                                       size: CGSize(width: circularPlayertexture.size.width,
                                                    height: circularPlayertexture.size.height))

Я хочу иметь возможность передвигаться с моим игроком, вроде как прилипшим к земле. Вы знаете, как это исправить? Знаете ли вы какие-либо альтернативные методы?

...