第二节点实例SKPhysicsBody没有响应碰撞

时间:2018-08-02 15:27:15

标签: swift xcode sprite-kit

我一直在尝试在SK中创建一个简单的游戏,其中球会从逐渐产生的蹦床的顶部反弹。第一个蹦床的碰撞效果很好,但是当球碰到运行时产生的第二个蹦床时,我在注册它时遇到了问题。有人可能知道我做错了什么吗?

这是代码。

import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate {

var ball: SKShapeNode?
var trampoline: SKShapeNode?
var cam: SKCameraNode?
var hasHit: Bool?
var hasCollided: Bool?
var hasMoved: Bool?

func createBall() {
    ball = SKShapeNode(circleOfRadius: 50)
    ball?.position = CGPoint(x: 0, y: -600)
    ball?.fillColor = .red
    ball?.strokeColor = .red

    let ballPhysics = SKPhysicsBody(circleOfRadius: 50)
    ball?.physicsBody = ballPhysics
    ballPhysics.categoryBitMask = 1
    ballPhysics.collisionBitMask = 0
    ballPhysics.contactTestBitMask = 0
    ballPhysics.affectedByGravity = false //NO GRAVITY!
    ballPhysics.isDynamic = true

    addChild(ball!)
}

func createTrampoline(x: CGFloat, y: CGFloat) {
    let rect = CGRect(x: x, y: y, width: 100, height: 20)
    trampoline = SKShapeNode(rect: rect)
    trampoline?.fillColor = .blue
    trampoline?.strokeColor = .blue

    let trampolinePhysics = SKPhysicsBody(rectangleOf: CGSize(width: 100, height: 20))
    trampoline?.physicsBody = trampolinePhysics
    trampolinePhysics.categoryBitMask = 2
    trampolinePhysics.collisionBitMask = 0
    trampolinePhysics.contactTestBitMask = 1
    trampolinePhysics.affectedByGravity = false //NO GRAVITY!
    trampolinePhysics.isDynamic = true

    addChild(trampoline!)
}

override func didMove(to view: SKView) {

    physicsWorld.contactDelegate = self
    cam = SKCameraNode()
    self.camera = cam
    self.backgroundColor = .darkText
    hasHit = false
    hasCollided = false
    hasMoved = false

    createBall()
    createTrampoline(x: -50, y: -10)

}


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touches: AnyObject in touches {
        let location = touches.location(in: self)
        let move = SKAction.moveTo(x: location.x, duration: 0.1)
        ball?.run(move)
    }
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if (!hasMoved!) {
        let vect = CGVector(dx: 0, dy: 600)
        ball?.physicsBody?.applyImpulse(vect)
        ball?.physicsBody?.affectedByGravity = true
        hasMoved = true
    }
}

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
    if (hasHit == true) {
        cam?.position.y = (ball?.position.y)!
    }
}

func didBegin(_ contact: SKPhysicsContact) {
    let vect = CGVector(dx: 0, dy: 1500)
    if (((contact.bodyB.node?.position.y)! - (contact.bodyA.node?.position.y)!) > 0) {
        if (!hasCollided!){
            hasHit = true
            hasCollided = true
            print("collision")
            contact.bodyB.applyImpulse(vect)
            createTrampoline(x: -50, y: ((ball?.position.y)! + CGFloat(3000)))
        }
    } else {
        print("bad coll")
        hasCollided = false
    }
}
}

谢谢。

0 个答案:

没有答案