未调用didBeginContact函数



我已经查看了所有我可以处理的示例,但没有任何与我的问题有关的内容。我有SKPhysicsContactDelegate,并添加了self.physicswold.contactDelegate=self。我几乎做了我能想到的一切。这是我项目的所有代码。

//
//  GameScene.swift
//  arrow jump
//
//  Created by Joy Cafiero on 3/29/16.
//  Copyright (c) 2016 3rd Dimension Studios inc. All rights reserved.
//
import SpriteKit
var timer = NSTimer()
var condition = 1
var arrow = SKSpriteNode()
var man = SKSpriteNode()
var bg = SKSpriteNode()
var ground = SKSpriteNode()
var buttonRight = SKSpriteNode()
var buttonLeft = SKSpriteNode()
var buttonJump = SKSpriteNode()
let moveGrounRight = SKAction.moveByX(200, y: 0, duration: 1)
let repeatMoveGroundRight = SKAction.repeatActionForever(moveGrounRight)
let moveGrounLeft = SKAction.moveByX(-200, y: 0, duration: 1)
let repeatMoveGroundLeft = SKAction.repeatActionForever(moveGrounLeft)
let runningMan1 = (SKTexture (imageNamed: "running man1.png"))
let runningMan2 = (SKTexture (imageNamed: "running man2.png"))
let runningMan3 = (SKTexture (imageNamed: "running man3.png"))
let runningMan4 = (SKTexture (imageNamed: "running man4.png"))
let runningMan5 = (SKTexture (imageNamed: "running man5.png"))
let runningMan6 = (SKTexture (imageNamed: "running man6.png"))
let nuetralMan = (SKTexture (imageNamed: "running man nuetral.png"))
let jumpingMan1 = (SKTexture (imageNamed: "jumping man1"))
let jumpingMan2 = (SKTexture (imageNamed: "jumping man2"))
let jumpingMan3 = (SKTexture (imageNamed: "jumping man3"))
let animation = SKAction.animateWithTextures([ runningMan1, runningMan2,      runningMan3,  runningMan4,  runningMan5,  runningMan6], timePerFrame: 0.15)
let jumpingAnimation = SKAction.animateWithTextures([jumpingMan1, jumpingMan2,         jumpingMan3], timePerFrame: 0.1)
let nuetralAnimation = SKAction.animateWithTextures([nuetralMan], timePerFrame: 0.05)
let repeatAnimation = SKAction.repeatActionForever(animation)
let manGroup:UInt32 = 0x1 << 1
let groundGroup:UInt32 = 0x1 << 2
let arrowGroup:UInt32 = 0x1 << 3

class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    self.physicsWorld.contactDelegate = self
    self.physicsWorld.gravity = CGVectorMake(0, -5)
    man = SKSpriteNode(texture: nuetralMan)
    man.position = CGPointMake(CGRectGetMidX(self.frame),     CGRectGetMidY(self.frame))
    man.size = CGSize(width: man.size.width * 2, height: man.size.height * 2)
    man.zPosition = 15
    man.physicsBody = SKPhysicsBody(rectangleOfSize: man.size)
    man.physicsBody?.dynamic = true
    man.physicsBody?.allowsRotation = false
    man.physicsBody?.categoryBitMask = manGroup
    man.physicsBody?.contactTestBitMask = groundGroup | arrowGroup
    self.addChild(man)
    let bgTexture = (SKTexture(imageNamed: "wild west landscape.png"))
    bg = SKSpriteNode(texture: bgTexture)
    bg.size = CGSize(width: self.frame.width, height: self.frame.height)
    bg.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) + 100)
    bg.zPosition = -1
    self.addChild(bg)
    let groundtexture = (SKTexture(imageNamed: "sandy ground.png"))
    ground = SKSpriteNode(texture: groundtexture)
    ground.size = CGSize(width: CGRectGetMaxX(self.frame), height: ground.size.height)
    ground.position = CGPointMake(CGRectGetMidX(self.frame), 0)
    ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.width, ground.size.height-255))
    ground.physicsBody?.dynamic = false
    ground.zPosition = 20
    ground.physicsBody?.categoryBitMask = groundGroup
    ground.physicsBody?.contactTestBitMask = manGroup

    self.addChild(ground)
    timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("timerUpdate"), userInfo: nil, repeats: true)
    buttonRight.color = SKColor.redColor()
    buttonRight.position = CGPointMake(200, 200)
    buttonRight.size = CGSize(width: 100, height: 100)
    buttonRight.zPosition = 25
    self.addChild(buttonRight)
    buttonLeft.color = SKColor.redColor()
    buttonLeft.position = CGPointMake(100, 200)
    buttonLeft.size = CGSize(width: 100, height: 100)
    buttonLeft.zPosition = 25
    self.addChild(buttonLeft)
    buttonJump.color = SKColor.greenColor()
    buttonJump.position = CGPointMake(CGRectGetMaxX(self.frame) - 200, 200)
    buttonJump.size = CGSize(width: 100, height: 100)
    buttonJump.zPosition = 25
    self.addChild(buttonJump)

}
func timerUpdate() {
    let random = Int(arc4random_uniform(3))
    var timeIncrease:NSTimeInterval = 0
    var randomArrow = [self.frame.height / 20 + CGRectGetMidY(self.frame) - 65, self.frame.height / 20 + self.frame.height / 20 + CGRectGetMidY(self.frame) - 65, self.frame.height / 20 + self.frame.height / 20 + self.frame.height / 20 + CGRectGetMidY(self.frame) - 65, self.frame.height / 20 + self.frame.height / 20 + self.frame.height / 20 + CGRectGetMidY(self.frame) - 65]
    timeIncrease = timeIncrease + 7
    let arrowTexture = (SKTexture(imageNamed: "arrow.png"))
    let movingArrow = SKAction.moveByX(-self.frame.size.width, y: 0, duration: 10-timeIncrease)
    let removeArrows = SKAction.removeFromParent()
    let repeatmoveArrows = SKAction.sequence([movingArrow, removeArrows])
    arrow = SKSpriteNode(texture: arrowTexture)
    arrow.size = CGSize(width: arrow.size.width, height: arrow.size.height)
    arrow.position = CGPointMake(CGRectGetMaxX(self.frame), randomArrow[random])
    arrow.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(arrowTexture.size().width - 100, arrow.size.height / 2))
    arrow.physicsBody?.dynamic = false
    arrow.zPosition = 10
    arrow.physicsBody?.categoryBitMask = arrowGroup
    arrow.physicsBody?.contactTestBitMask = manGroup
    arrow.runAction(repeatmoveArrows)
    self.addChild(arrow)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
   /* Called when a touch begins */
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        if buttonRight.containsPoint(location) {
            man.xScale = 1
            man.runAction(repeatMoveGroundRight, withKey: "MoveRight")
            man.runAction(repeatAnimation, withKey: "Run")
        }
        if buttonLeft.containsPoint(location) {
            man.xScale = -1
            man.runAction(repeatMoveGroundLeft, withKey: "MoveLeft")
            man.runAction(repeatAnimation, withKey: "Run")
        }
        if buttonJump.containsPoint(location) {
            if(condition == 1) {
            man.physicsBody?.velocity = CGVectorMake(0, 0)
            man.physicsBody?.applyImpulse(CGVectorMake(0, 400))
            man.runAction(jumpingAnimation)
                condition = 0
            }
        }

}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        if buttonRight.containsPoint(location) {
            man.removeActionForKey("MoveRight")
            man.removeActionForKey("Run")
            man.texture = nuetralMan
        }
        if buttonLeft.containsPoint(location) {
            man.removeActionForKey("MoveLeft")
            man.removeActionForKey("Run")
            man.texture = nuetralMan
        }
    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        if buttonRight.containsPoint(location) {
            man.removeActionForKey("MoveRight")
            man.removeActionForKey("Run")
            man.texture = nuetralMan
        }
        if buttonLeft.containsPoint(location) {
            man.removeActionForKey("MoveLeft")
            man.removeActionForKey("Run")
            man.texture = nuetralMan
        }
    }
    func didBeginContact(contact: SKPhysicsContact) {
        var firstBody: SKPhysicsBody
        var secondBody: SKPhysicsBody
        var thirdBody: SKPhysicsBody
        if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
            firstBody = contact.bodyA
            secondBody = contact.bodyB
        } else {
            firstBody = contact.bodyB
            secondBody = contact.bodyA
        }
        if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
            firstBody = contact.bodyA
            thirdBody = contact.bodyB
        } else {
            firstBody = contact.bodyB
            thirdBody = contact.bodyA
        }

        if firstBody.categoryBitMask == manGroup || secondBody.categoryBitMask == groundGroup {
            print("contact")
            condition = 1
            man.texture = nuetralMan
        }
        if firstBody.categoryBitMask == manGroup || thirdBody.categoryBitMask == arrowGroup {
            print("dead")
        }
    }

func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
}
}
}

我试着用didBeginContact方法打印东西,但什么也没发生。我花了三天的时间想弄清楚这个问题。此外,据我所知,我所有的分类BitMask和CollisionTestBitMask都设置正确。非常感谢您的帮助。

您对didBeginContact()的定义隐藏在touchesEnded()函数中。如果你调整一下你的支撑,它可能会有所帮助:

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch: AnyObject in touches {
       // for touches loop (skipped)
    }
}  // Add this closing brace
    func didBeginContact(contact: SKPhysicsContact) {
        // contact body (skipped)
    }

您还需要在更新后删除额外的大括号():

// ...skipped
func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
}
// }  // get rid of this one
}

希望能有所帮助。

最新更新