首页 文章

SpriteKit Swift - 接触时不触发

提问于
浏览
0

所以我正在玩Swift和SpriteKit . 我决定创造一个简单的游戏,一个角色将走到一个硬币的胸部,并获得所有的宝藏 .

我试图检测两个物体何时相互接触,但似乎没有发生任何事情 .

我做了什么:

1)我设置代表:

SKPhysicsContactDelegate

2)创建场景:

override func didMoveToView(view: SKView) {

    backgroundColor = SKColor.whiteColor()
    physicsWorld.contactDelegate = self

    let sceneBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    sceneBody.friction = 0

    background.zPosition = -20
    background.anchorPoint = CGPointZero
    background.position = CGPointZero

    backgroundRepeated.zPosition = -20
    backgroundRepeated.anchorPoint = CGPointZero
    backgroundRepeated.position = CGPointMake(background.size.width-1,0)


    addChest()
    addCharacter()

    addChild(background)
    addChild(backgroundRepeated)


}

3)创建项目:

func addChest() {
    chestOfCoins.anchorPoint = CGPointZero
    chestOfCoins.size = CGSize(width: 200,height: 200)
    chestOfCoins.position = CGPoint(x: self.frame.width-1, y: 300)
    chestOfCoins.zPosition = 20
    chestOfCoins.physicsBody = SKPhysicsBody(rectangleOfSize: chestOfCoins.size)
    chestOfCoins.physicsBody?.affectedByGravity = false
    chestOfCoins.physicsBody?.dynamic = false
    chestOfCoins.physicsBody?.categoryBitMask = physicsCategory.chests
    chestOfCoins.physicsBody?.collisionBitMask = 0
    chestOfCoins.physicsBody?.contactTestBitMask = physicsCategory.character

    addChild(chestOfCoins)
}

func addCharacter() {
    character.anchorPoint = CGPointZero
    character.position = CGPoint(x: 300, y: 300)
    character.zPosition = 20
    character.size = CGSize(width: 200, height: 200)
    character.physicsBody = SKPhysicsBody(rectangleOfSize: character.size)
    character.physicsBody?.affectedByGravity = false
    character.physicsBody?.dynamic = false
    character.physicsBody?.categoryBitMask = physicsCategory.character
    character.physicsBody?.contactTestBitMask = physicsCategory.chests
    character.physicsBody?.collisionBitMask = 0


    addChild(character)
}

4)创建了didBeginContact:

func didBeginContact(contact: SKPhysicsContact) {
    var contactBody1: SKPhysicsBody
    var contactBody2: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        contactBody1 = contact.bodyA
        contactBody2 = contact.bodyB

    } else {
        contactBody1 = contact.bodyB
        contactBody2 = contact.bodyA
    }

    if((contactBody1.categoryBitMask == 1) && (contactBody2.categoryBitMask == 2)) {
        print("touched")
    } else {
        print("not these two")
    }
}

仅供参考,如果((contactBody1.categoryBitMask == 1)&&(contactBody2.categoryBitMask == 2))IF不输出主if块或else .

5)我创建了类别物理:

struct physicsCategory {
  static let none: UInt32 = 0 //0
  static let character: UInt32 = 0b1 //1
  static let chests: UInt32 = 0b10 //2
  static let snake: UInt32 = 0b100 //4
}

Full GameScene.Swift:

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

struct physicsCategory {
    static let none: UInt32 = 0 //0
    static let character: UInt32 = 0b1 //1
    static let chests: UInt32 = 0b10 //2
    static let snake: UInt32 = 0b100 //4
    static let all: UInt32 = UInt32.max
}


let background = SKSpriteNode(imageNamed: "Backgrounds")
let backgroundRepeated = SKSpriteNode(imageNamed: "Backgrounds")
let chestOfCoins = SKSpriteNode(imageNamed: "chest")
let character = SKSpriteNode(imageNamed: "character")

let gameActions = NSUserDefaults.standardUserDefaults()

func addChest() {
    chestOfCoins.anchorPoint = CGPointZero
    chestOfCoins.size = CGSize(width: 200,height: 200)
    chestOfCoins.position = CGPoint(x: self.frame.width-1, y: 300)
    chestOfCoins.zPosition = 20
    chestOfCoins.physicsBody = SKPhysicsBody(rectangleOfSize: chestOfCoins.size)
    chestOfCoins.physicsBody?.affectedByGravity = false
    chestOfCoins.physicsBody?.dynamic = false
    chestOfCoins.physicsBody?.categoryBitMask = physicsCategory.chests
    chestOfCoins.physicsBody?.collisionBitMask = 0
    chestOfCoins.physicsBody?.contactTestBitMask = physicsCategory.character

    addChild(chestOfCoins)
}

func addCharacter() {
    character.anchorPoint = CGPointZero
    character.position = CGPoint(x: 300, y: 300)
    character.zPosition = 20
    character.size = CGSize(width: 200, height: 200)
    character.physicsBody = SKPhysicsBody(rectangleOfSize: character.size)
    character.physicsBody?.affectedByGravity = false
    character.physicsBody?.dynamic = false
    character.physicsBody?.categoryBitMask = physicsCategory.character
    character.physicsBody?.contactTestBitMask = physicsCategory.chests
    character.physicsBody?.collisionBitMask = 0


    addChild(character)
}

override func didMoveToView(view: SKView) {

    backgroundColor = SKColor.whiteColor()
    physicsWorld.contactDelegate = self

    let sceneBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    sceneBody.friction = 0

    background.zPosition = -20
    background.anchorPoint = CGPointZero
    background.position = CGPointZero

    backgroundRepeated.zPosition = -20
    backgroundRepeated.anchorPoint = CGPointZero
    backgroundRepeated.position = CGPointMake(background.size.width-1,0)


    addChest()
    addCharacter()

    addChild(background)
    addChild(backgroundRepeated)


}

func didBeginContact(contact: SKPhysicsContact) {
    var contactBody1: SKPhysicsBody
    var contactBody2: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        contactBody1 = contact.bodyA
        contactBody2 = contact.bodyB

    } else {
        contactBody1 = contact.bodyB
        contactBody2 = contact.bodyA
    }

    if((contactBody1.categoryBitMask == 1) && (contactBody2.categoryBitMask == 2)) {
        print("touched")
    } else {
        print("not these two")
    }
}

override func update(currentTime: NSTimeInterval) {

    let startWalking = gameActions.boolForKey("Walking")

    if (startWalking == true) {


        chestOfCoins.position = CGPoint(x: chestOfCoins.position.x - 5, y: chestOfCoins.position.y)

        background.position = CGPoint(x: background.position.x - 5, y: background.position.y)
        backgroundRepeated.position = CGPoint(x: backgroundRepeated.position.x - 5, y: backgroundRepeated.position.y)

        if (background.position.x < -background.size.width) {
            background.position = CGPointMake(backgroundRepeated.position.x + backgroundRepeated.size.width, background.position.y)
        }

        if (backgroundRepeated.position.x < -backgroundRepeated.size.width) {
            backgroundRepeated.position = CGPointMake(background.position.x + background.size.width, backgroundRepeated.position.y)
        }
    }
}

}

问题

任何人都可以告诉我为什么,当屏幕开始滚动和这两个项目接触没有任何反应,并告诉我如何解决它?

即使我将两者的zPosition设置为相同,也似乎落后了

这是一张照片,不要判断图像:(

enter image description here

enter image description here

1 回答

  • 3

    将您的胸部或其他物品设置为 dynamic = true

    两个非动态物理机构不会注册联系人

相关问题