gpt4 book ai didi

ios - SpriteKit + Swift - 接触时不触发

转载 作者:行者123 更新时间:2023-11-28 11:08:37 27 4
gpt4 key购买 nike

所以我正在玩弄 Swift 和 SpriteKit。我决定创建一个简单的游戏,其中一个角色将走到硬币箱并获得所有宝藏。

我正在尝试检测两个物体何时相互接触,但似乎什么也没有发生。

我做了什么:

1) 我设置委托(delegate):

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")
}
}

FYI, this IF if((contactBody1.categoryBitMask == 1) && (contactBody2.categoryBitMask == 2)) does not output Either the main if block or the 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
}

完整的 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

最佳答案

将你的箱子或其他元素属性设置为 dynamic = true

两个非动态物理体不会注册联系

关于ios - SpriteKit + Swift - 接触时不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36442613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com