applyImpulse在接触节点时不起作用

时间:2018-08-01 16:00:29

标签: ios swift sprite-kit skphysicsbody skshapenode

我在屏幕上有一个会逐渐变大的圆圈(顺便说一句,Balloon类是SKShapeNode的一种)。在touches中,我单击了圆圈,并打印出我触摸过的圆圈,但是没有施加脉冲。我如何找到问题?我对SpriteKit相当陌生。

import SpriteKit
import GameplayKit

class GameScene: SKScene {

var radius = 40.0

var balloon : Balloon? = nil

override func didMove(to view: SKView) {

    balloon = Balloon(radius: radius, position: CGPoint(x: frame.midX, y: frame.minY + 250))
    balloon?.name = "balloon"

    let physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(radius))
    physicsBody.affectedByGravity = false
    balloon?.physicsBody = physicsBody
    balloon?.physicsBody?.isDynamic = true

    let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
    borderBody.friction = 0
    self.physicsBody = borderBody
    physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0)

    self.addChild(balloon!)

}



override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        let node : SKNode = self.atPoint(location)
        if node.name == "balloon" {
            print("touching balloon.")
            balloon?.physicsBody?.applyImpulse(CGVector(dx: 10.0, dy: 10.0), at: location)
        }
    }

}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {

}


 override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
    radius += 0.05
    self.balloon?.radius = radius

    let physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(radius))
    physicsBody.affectedByGravity = false
    balloon?.physicsBody = physicsBody
    balloon?.physicsBody?.isDynamic = true

  }
}

2 个答案:

答案 0 :(得分:1)

您将在每次更新时创建一个新的正文。如果您想给气球充气,请使用比例尺:

enum Example
{
    Example1,    // Comments for Example1. 
    Example2,    // Comments for Example2. 
    Example3.    // Comments for Example3. 
}

然后,您的物理身体将能够应用脉冲,因为您不会在每次更新时都创建一个新的身体。

答案 1 :(得分:0)

以下行:

let location = touch.location(in: self)

查找场景中触摸的位置。但是,在函数调用applyImpulse中,它是相对于节点的。代替

balloon?.physicsBody?.applyImpulse(CGVector(dx: 10.0, dy: 10.0), at: location)

使用:

balloon?.physicsBody?.applyImpulse(CGVector(dx: 10.0, dy: 10.0), at: touch.location(in: balloon))