尽管没有检测到Collsions,但它已按照http://www.raywenderlich.com上的规定实施

时间:2015-05-03 17:32:16

标签: ios swift sprite-kit game-physics

虽然代码指定应该从视图中移除球并且击中"应该打印没有任何反应。

 import SpriteKit

 class GameScene: SKScene, SKPhysicsContactDelegate {
    struct PhysicsCatagory {

        static let none : UInt32 = 0
        static let all : UInt32 = UInt32.max
        static let ball :UInt32 = 0b1
        static let basket : UInt32 = 0b10

    }
    var basket = SKSpriteNode()

    //moves towards top right corner of the screen
    let actionMoveUpRight = SKAction.moveByX(60, y: 60, duration: 0.2)
    //moves towards bottom center
    let actionMoveDownLeft = SKAction.moveByX(-60, y: -60, duration: 0.2)
    //moves towards top left corner of the screen
    let actionMoveUpLeft = SKAction.moveByX(-60, y: 60, duration: 0.2)
    //moves towards bottom center
    let actionMoveDownRight = SKAction.moveByX(60, y: -60, duration: 0.2)
    // moves down
    let actionMoveDown = SKAction.moveByX(0, y: -50, duration: 0.2)
    let basketCategoryMask: UInt32 =  0x1 << 1
    let ballCategoryMask: UInt32 = 0x1 << 2

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        // setting background colour to green
        self.backgroundColor = SKColor.greenColor()
        // creating a sprite node named basket and asigning it to an image of a 2D drawn basket
        basket = SKSpriteNode(imageNamed: "basket")
        //intiallizing basket's location and size
        basket.position = CGPointMake(self.size.width/2, self.size.height/8)
        basket.size.height = 50
        basket.size.width = 75
        basket.physicsBody = SKPhysicsBody(rectangleOfSize: basket.size)
        basket.physicsBody?.dynamic = false
        basket.physicsBody?.categoryBitMask = PhysicsCatagory.basket
        basket.physicsBody?.categoryBitMask = PhysicsCatagory.none
        basket.physicsBody?.usesPreciseCollisionDetection = true
        self.addChild(basket)
        //adding the basket to the scene

        physicsWorld.contactDelegate = self
        //creating the action that adds the balls to the scene
        let updateAction = SKAction.runBlock {


            var leftOrRight = arc4random_uniform(2)
            if leftOrRight == 0 {
                self.physicsWorld.gravity = CGVectorMake(-0.5,-2)
            }
            if leftOrRight == 1 {
                self.physicsWorld.gravity = CGVectorMake(0.5, -2)
            }
            var ball = SKSpriteNode(imageNamed: "redBall")
            ball.position = CGPointMake(self.size.width/2, self.size.height)
            ball.setScale(0.5)
            ball.size.height = 20
            ball.size.width = 35
            ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)
            ball.physicsBody!.dynamic = true
            self.addChild(ball)
            ball.physicsBody? = SKPhysicsBody(circleOfRadius: ball.size.width/2)
            ball.physicsBody?.dynamic = true
            ball.physicsBody?.categoryBitMask = PhysicsCatagory.ball
            ball.physicsBody?.contactTestBitMask = PhysicsCatagory.basket
            ball.physicsBody?.collisionBitMask = PhysicsCatagory.none


        }

        let waitDuration : NSTimeInterval = 2.0
        let updateAndWaitAction = SKAction.sequence([updateAction,SKAction.waitForDuration(waitDuration)])
        let repeatForeverAction = SKAction.repeatActionForever(updateAndWaitAction)
        self.runAction(repeatForeverAction)
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */

        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            if basket.position.y < 125 {
                if location.x > basket.position.x {

                    if location.y > basket.position.y {
                        basket.runAction(actionMoveUpRight)
                    }

                    else {
                        basket.runAction(actionMoveDownRight)
                    }

                }

                else if location.x < basket.position.x {

                    if location.y > basket.position.y {
                        basket.runAction(actionMoveUpLeft)
                    }
                    else {
                        basket.runAction(actionMoveDownLeft)
                    }
                }

            }
            else {
                basket.runAction(actionMoveDownLeft)
            }
        }

    }

    func didBeginContact(contact: SKPhysicsContact){

        var firstBody : SKPhysicsBody
        var secondBody : SKPhysicsBody



        if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {

            firstBody = contact.bodyA
            secondBody = contact.bodyB

        }

        else {

            firstBody = contact.bodyB
            secondBody = contact.bodyA

        }

        if ((firstBody.categoryBitMask & PhysicsCatagory.ball != 0) && (secondBody.categoryBitMask & PhysicsCatagory.basket != 0)) {
            var y = true||false
            collisionDidHappen(firstBody.node as SKSpriteNode, basket: secondBody.node as SKSpriteNode)

        }

    }

    func collisionDidHappen (ball : SKSpriteNode, basket : SKSpriteNode) {

        println("Hit")
        ball.removeFromParent()

        println("collsion did happen")
    }
 }

0 个答案:

没有答案