如何检测快速移动的得分节点

How to detect a Score Node that is moving Fast

在下面更新了我的代码。

我正在尝试检测用于跟踪分数的 SKNode。它是在屏幕上从右向左移动的障碍物的子节点,因此它与障碍物节点一起移动。

问题是我在一定速度后无法检测到与分数节点的碰撞。在我的游戏中,每次接触得分节点时速度都会增加,并且它会达到一定速度,然后不会检测到与得分节点的碰撞。

我试过使用 usesPreciseCollisionDetection = true 但遇到了同样的问题。

我需要提高障碍物的速度并减少生成下一个障碍物之间的等待时间。 我之前的一些尝试最终失败了,每次接触得分节点时我都会增加速度,速度增加但产卵时间不会减少所以它会产生间隙,因为障碍物移动得足够快并消失屏幕,下一个尚未生成。

这是联系评分节点时提升速度的代码

var speedOfObstacle = 3.0
var speedOfSpawn = 1.0

override func didMove(to view: SKView) {
     DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
          self.run(SKAction.repeatForever(
              SKAction.sequence([
                  SKAction.run(self.addObstacle),
                  SKAction.wait(forDuration: self.speedOfSpawn)
              ])
          ))
    }
}

//** 上面的 SKAction.wait(forDuration: self.speedOfSpawn) 决定了生成时间或重复此序列的延迟。我需要减少这个 speedofSpawn 但它不会从初始数量 1.0

改变
func addObstacle() {
  //Obstacle Code. Implement the SpeedofObstale. 
}

func didBegin(_ contact: SKPhysicsContact) {
    var dogBody: SKPhysicsBody
    var otherBody: SKPhysicsBody
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        dogBody = contact.bodyA
        otherBody = contact.bodyB
    } else {
        dogBody = contact.bodyB
        otherBody = contact.bodyA
    }

    if dogBody.categoryBitMask == dogSpriteCategory && otherBody.categoryBitMask == obstacleCategory {
        //   print("dog hit obstacle")
    } else if dogBody.categoryBitMask == dogSpriteCategory && otherBody.categoryBitMask == scoreCategory {
        print("dog hit score")

        score += 1
        scoreLabelNode.text = String(score)

        if speedOfObstacle >= 0.7 {
            speedOfObstacle -= 0.03
            print("speed of obstacle is \(speedOfObstacle)")
            speedOfSpawn -= 0.01
            print("speed of spawn  \(speedOfSpawn)")
        }
    }
}

使用联系人评分节点代码,speedOfObstacle 从 3.0 开始减少,但 speedOfSpawn 的等待时间与初始数量 1.0 相比没有变化。

speedOfObstacle 用于 addObstacle 函数,didBegin(_contact)viewDidLoad。 . speedOfSpawn 用于 didBegin(_contact)viewDidLoad.

任何关于如何高速检测得分节点碰撞或任何增加障碍物速度和生成障碍物频率的帮助都将不胜感激。

谢谢,

更新代码。正如 bg2b 所回答的。

我已经更改了我的代码,下面是我更改的内容。

在此处输入代码

//replaced the repeat for ever code in view did load with

override func didMove(to view: SKView) {
    let initialDelay = 1.0
    run(SKAction.sequence([.wait(forDuration: initialDelay), .run { self.addObstacle() }]))

}

// then added this in the addObstacle func
//obstacle physics
//obstacle movement
addChild(obstacle)
let nextDelay = speedOfSpawn
run(SKAction.sequence([.wait(forDuration: nextDelay), .run { self.addObstacle() }]))

并把它放在确实开始联系中。 // 和上面一样只是两个 if 语句而不是一个。

speedOfSpawnspeedOfObstacle 在顶部声明。

score += 1
scoreLabelNode.text = String(score)
scoreLabelNode.physicsBody?.usesPreciseCollisionDetection = true

if speedOfObstacle >= 1.0 {
    speedOfObstacle -= 0.09
    print("speed of obstacle is \(speedOfObstacle)")
}
if speedOfSpawn >= 0.40 {
    speedOfSpawn -= 0.03
    print("speed of spawn  \(speedOfSpawn)")
}

我不确定碰撞问题,但对于产卵,你在 didMove 中进行了一个动作,然后没有改变那个动作。也就是说,当你写

SKAction.wait(forDuration: self.speedOfSpawn)

您正在创建一个 SKAction 等待表达式 self.speedOfSpawn 给定的秒数。但是,如果您随后更改 speedOfSpawn,则不会再次执行构造的操作。如果您想以不同的延迟做某事,一种方法是不执行 repeatForever 而是将每次重复的计划安排在重复的动作中。例如,

func spawn() {
  // spawn an enemy
  ...
  // schedule next spawn
  let nextDelay = ... // some computation of when to spawn next
  run(SKAction.sequence([.wait(forDuration: nextDelay), .run { self.spawn() }]))
}

override func didMove(to view: SKView) {
  let initialDelay = 1.0
  run(SKAction.sequence([.wait(forDuration: initialDelay), .run { self.spawn() }]))
}

这是另一种控制产卵的方法。它消除了对 "speedOfSpawn" 变量的需要,而是使用内部计时机制。您基本上是在让生成动作越来越快。

override func didMove(to view: SKView) {
   self.run(SKAction.repeatForever(
              SKAction.sequence([
                  SKAction.run(self.addObstacle),
                  SKAction.wait(forDuration: 1.0)
              ])
          ,forKey:"Spawning")
}

func didBegin(_ contact: SKPhysicsContact) {
    var dogBody: SKPhysicsBody
    var otherBody: SKPhysicsBody
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        dogBody = contact.bodyA
        otherBody = contact.bodyB
    } else {
        dogBody = contact.bodyB
        otherBody = contact.bodyA
    }

    if dogBody.categoryBitMask == dogSpriteCategory && otherBody.categoryBitMask == obstacleCategory {
        //   print("dog hit obstacle")
    } else if dogBody.categoryBitMask == dogSpriteCategory && otherBody.categoryBitMask == scoreCategory {
        print("dog hit score")

        score += 1
        scoreLabelNode.text = String(score)

        if speedOfObstacle >= 0.7 {
            speedOfObstacle -= 0.03
            print("speed of obstacle is \(speedOfObstacle)")
            self.action(forKey:"Spawning")?.speed += 0.01
        }
    }
}

碰撞的问题在于,当您使用 SKAction 时,您实际上是在扮演上帝。 我建议使用物理速度来移动对象,而不是 SKActions。

您还在 scoreLabelNode 上使用了精度 .....我相信您想使用父节点,因为它上面应该有物理体。