这是我第三次在这个问题上寻求帮助。
我有一个类BallNode
的班级SKShapeNode
。在我的代码中,我还有一个功能,从屏幕顶部每隔3秒生成一个球。现在,我想设置一个每1秒定位球位置的功能,因此,如果ball.position.y > 200
将消息打印到控制台。
这样做的目的是,如果任何球将在这个位置(而不是它落下),我将调用另一个功能。我试图通过SKAction
,update(_ currentTime: CFTimeInterval)
,Timer
来做,但我没有成功,我真的不知道该怎么做......
更新 - 我当前的代码:
var timeType1: CFTimeInterval = 0.0
var timeType2: CFTimeInterval = 2.0
override func update(_ currentTime: CFTimeInterval) {
if (currentTime - timeType1 > timeType2){
print("time")
self.checkBallsPosition()
self.timeType1 = currentTime
}
self.enumerateChildNodes(withName: "color.BallNode") { node, _ in
self.checkBallsPosition()
}
}
func checkBallsPosition() {
self.enumerateChildNodes(withName: "BALL") { (node: SKNode, nil) in
let x = self.createTopBorder()
x.isHidden = true
let wait2 = SKAction.wait(forDuration: 1)
let action2 = SKAction.run {
let position = Double(node.position.y)
if position < 200 {
}
else if position > 200 {
print("bolbo")
node.removeFromParent()
}
}
self.run(SKAction.sequence([wait2,action2]))
}
}
这就是我到目前为止所做的事情,正如我所说的问题是我希望得到球最后位置。因为球落在屏幕上,当它接触到屏幕的底部边界或接触到另一个球时,应该是最后一个位置。如果我将它设置为update
我每一帧都得到球的位置,或者(每次)得到球的位置 - 但不是最后一次。另一个问题是球的位置总是会改变,取决于另一个球(发生碰撞时)。
更新#2 - 其他功能:
func spawnBalls() {
let wait = SKAction.wait(forDuration: 3)
let action = SKAction.run {
self.createBall()
}
run(SKAction.repeatForever((SKAction.sequence([wait, action]))))
}
func createBall(){
let ball = BallNode(radius: 65)
print(ball.Name)
print(ball._subName!)
ball.position.y = ((frame.size.height) - 200)
let ballXPosition = arc4random_uniform(UInt32(frame.size.width))
ball.position.x = CGFloat(ballXPosition)
ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
ball.physicsBody?.collisionBitMask = PhysicsCategory.ball
ball.physicsBody?.contactTestBitMask = PhysicsCategory.topBorder
ball.delegate = self
addChild(ball)
}
答案 0 :(得分:0)
您没有发布您正在使用的整个代码。不知道你是如何产生你的球,层次结构以及你如何移动它们,我不能在这里重现它。
我不确定我是否理解它,但我相信它可能比你正在做的更简单。看看下面的代码是否对你有帮助,我正在使用SKAction
(你可以用物理也做到这一点),并检查它们何时低于零,当我删除它们时。
private let ballSpeed : CGFloat = 400
private let ballRadius : CGFloat = 10
private func spawnBall(atPoint pos : CGPoint){
let b = SKShapeNode(circleOfRadius: ballRadius)
b.name = "ball"
b.position = pos
addChild(b)
b.run(SKAction.moveTo(y: -size.height, duration: TimeInterval((pos.y+size.height)/400)))
}
override func update(_ currentTime: TimeInterval) {
super.update(currentTime)
enumerateChildNodes(withName: "ball") { (node, _) in
if node.position.y < 0 {
node.removeFromParent()
}
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
let pos = touch.location(in: self)
spawnBall(atPoint: pos)
}
}