gpt4 book ai didi

swift - 为什么有多个碰撞调用 Sprite Kit Swift

转载 作者:可可西里 更新时间:2023-11-01 00:52:28 26 4
gpt4 key购买 nike

我正在构建一个带有碰撞的 iOS swift 游戏。英雄正被来自屏幕右侧的小星星轰炸。每次星星击中英雄时,都会迭代分数并移除星星。但是,分数增加了不止一分。

节点设置:

var star = SKSpriteNode(imageNamed: "star")
star.size = CGSizeMake(30, 30)
star.zPosition = 10
var starPhysicsRect = CGRectMake(star.position.x - star.frame.size.width / 2, star.position.y - star.frame.size.width / 2, star.frame.size.width, star.frame.size.height)
star.physicsBody = SKPhysicsBody(edgeLoopFromRect: starPhysicsRect)
star.physicsBody?.restitution = 0
star.name = "star"
star.physicsBody?.mass = 0
return star

didBeginContact 函数:

func didBeginContact(contact: SKPhysicsContact) {
//collision variables
var firstBodyNode = contact.bodyA.node as! SKSpriteNode
var secondBodyNode = contact.bodyB.node as! SKSpriteNode
var firstNodeName = firstBodyNode.name
var secondNodeName = secondBodyNode.name

//other variables
var scoreLabel: SKLabelNode = constantsInstance.scoreLabel(position: CGPointMake(self.frame.size.width * 0.86, self.frame.size.height * 0.928))


//check if hero hit star
if firstNodeName == "hero" && secondNodeName == "star" {
println("star hit")
secondBodyNode.removeFromParent()

//iterate score
childNodeWithName("scoreLabel")?.removeFromParent()
scoreLabel.text = "\(counterForScore)"
counterForScore++
self.addChild(scoreLabel)
}
}

我也多次将“star hit”打印到控制台。为什么 didBeginContact 函数会被多次调用,如果我在函数的第一次调用中删除了星号?

我在较小的范围内运行模拟,发现如果没有删除命令,星星会相当深入地进入英雄(因为 SKAction)。会不会是didBeginContact函数在星星进入英雄的时候被调用了很多次,然后才被移除?

非常感谢所有帮助。

最佳答案

在继续之前,您可以检查 SKSpriteNode 的父节点是否为 nil。

func didBeginContact(contact: SKPhysicsContact) {
var firstBodyNode : SKSpriteNode!
var secondBodyNode : SKSpriteNode!

// Assuming that the contact test bit mask of star is greater than hero. If it's not you should reverse the condition.

if contact.bodyA.contactTestBitMask < contact.bodyB.contactTestBitMask {
firstBodyNode = contact.bodyA.node as! SKSpriteNode
secondBodyNode = contact.bodyB.node as! SKSpriteNode
} else {
firstBodyNode = contact.bodyB.node as! SKSpriteNode
secondBodyNode = contact.bodyA.node as! SKSpriteNode
}

var firstNodeName = firstBodyNode.name
var secondNodeName = secondBodyNode.name

if firstNodeName == "hero" && secondNodeName == "star" {
if secondBodyNode.parent != nil {
// Your code.
}
}
}

关于swift - 为什么有多个碰撞调用 Sprite Kit Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32470475/

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