How can I apply friction to a circular SKPhysicsBody

て烟熏妆下的殇ゞ 提交于 2019-12-25 02:34:25

问题


I am trying to understand friction, or some other aspect of physics, in SpriteKit. I created a circle that rotates. I placed a square on top of the rotating circle. I expected the square to rotate along with the circle and fall off, but the square does not move. I set physicsBody.friction = 1.0 in an attempt to make the surfaces sticky but it does not help. What changes to physics do I need to make so that the square is affected by the circle's rotation?

I created a self-contained example using a Playground. To test:

  1. Download attached bluecircle.png and place it on your desktop (or wherever)
  2. Copy code below into your Playground
  3. Change NSImage path to wherever you saved bluecircle.png

Code:

import Cocoa
import SpriteKit
import XCPlayground

let screenWidth = 1400.0
let screenHeight = 1000.0
let xOffset = 300.0

let smallsquareSize = CGSize(width: 100, height: 100)
let bluesquareSize = CGSize(width: 400 , height: 400)
// the img is a blue circle w/ radius of 200 located on my desktop
let img = NSImage(byReferencingFile: "/Users/CHANGETHIS/Desktop/bluecircle.png")

class PlayScene: SKScene {

    let redsquare = SKSpriteNode(color: SKColor.redColor(), size: smallsquareSize)
    let greensquare = SKSpriteNode(color: SKColor.greenColor(), size: smallsquareSize)
    let bluesquare = SKSpriteNode(color: SKColor.blueColor(), size: bluesquareSize)
    let bluecircle = SKSpriteNode(texture: SKTexture(image: img))

    var lastTime = NSTimeInterval(0)


    init(size: CGSize) {
        super.init(size: size)
    }


    override func didMoveToView(view: SKView!) {

        backgroundColor = SKColor.blackColor()

        // RED SQUARE
        redsquare.position = CGPoint(x: screenWidth/2 - xOffset, y: screenHeight - 100)
        redsquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallsquareSize)
        redsquare.physicsBody.friction = 1.0
        addChild(redsquare)

        // BLUE SQUARE
        bluesquare.position = CGPoint(x: screenWidth / 2 - xOffset, y: screenHeight / 2)
        bluesquare.physicsBody = SKPhysicsBody(rectangleOfSize: bluesquareSize)
        bluesquare.physicsBody.dynamic = false
        bluesquare.physicsBody.affectedByGravity = false
        bluesquare.physicsBody.friction = 1.0
        addChild(bluesquare)


        // GREEN SQUARE
        greensquare.position = CGPoint(x: screenWidth/2 + xOffset, y: screenHeight - 100)
        greensquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallsquareSize)
        greensquare.physicsBody.friction = 1.0
        addChild(greensquare)

        // BLUE CIRCLE
        bluecircle.position = CGPoint(x: screenWidth / 2 + xOffset, y: screenHeight / 2)
        bluecircle.physicsBody = SKPhysicsBody(circleOfRadius: 200)
        bluecircle.physicsBody.dynamic = false
        bluecircle.physicsBody.affectedByGravity = false
        bluecircle.physicsBody.friction = 1.0
        addChild(bluecircle)

    }

    override func update(currentTime: NSTimeInterval) {
        let delta = currentTime - lastTime
        lastTime = currentTime

        bluesquare.zRotation += delta
        bluecircle.zRotation += delta

    }
}

var view = SKView(frame:NSRect(x: 0.0, y: 0.0, width: screenWidth, height: screenHeight))
var playScene = PlayScene(size: CGSize(width: screenWidth, height: screenHeight))

view.presentScene(playScene)
view.showsFPS = true
view.showsDrawCount = true
view.showsNodeCount = true
XCPShowView("View", view)

`


回答1:


I think the answer to your question are Joints . Creating a fixed joint between your nodes I believe will solve your problem .

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsJoint_Ref/Reference/Reference.html



来源:https://stackoverflow.com/questions/24246984/how-can-i-apply-friction-to-a-circular-skphysicsbody

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!