簡體   English   中英

Swift-使用SpriteKit提高移動節點的速度

[英]Swift - Increase speed of a moving Node using SpriteKit

我正在從事類似於乒乓球的游戲,在開始游戲時,我會以隨機方向向球施加脈沖,該方向位於屏幕的中心,例如

func impulse(){
    let randomNum:UInt32 = arc4random_uniform(200)
    let someInt:Int = Int(randomNum)

    //Ball Impulse
    if someInt<49{
    ball.physicsBody?.applyImpulse(CGVector(dx: ballSpeed+3, dy: ballSpeed-5))
    }else if someInt<99{
        ball.physicsBody?.applyImpulse(CGVector(dx: ballSpeed+5, dy: -ballSpeed+5))
    }else if someInt<149{
        ball.physicsBody?.applyImpulse(CGVector(dx: -ballSpeed-5, dy: -ballSpeed+5))
    }else if someInt<200{
        ball.physicsBody?.applyImpulse(CGVector(dx: -ballSpeed-3, dy: ballSpeed-5))
    }

}

其中ballSpeed是球的預設速度。 那么,有什么方法可以使球在運動過程中隨着持續時間逐漸增加其速度嗎? 由於球會在屏幕周圍不斷跳動,因此很難通過dx和dy向其施加力。

編輯-

我使用以上方法只是為了在游戲開始時為球分配一個隨機的象限/方向。

開始,當實施脈沖方法時,例如游戲開始圖像

我想在玩游戲的過程中隨着時間的推移以預定單位增加球的速度

好,你去! 無論如何,球會不斷變快!!! 調整amount以確定每幀球獲得的速度。

class GameScene: SKScene, SKPhysicsContactDelegate {

  let ball = SKShapeNode(circleOfRadius: 20)
  var initialDY = CGFloat(0)
  var initialDX = CGFloat(0)



  override func didMove(to view: SKView) {
    self.physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
    self.physicsWorld.gravity = CGVector.zero

    // Configure ball pb:
    let pb = SKPhysicsBody(circleOfRadius: 20)
    ball.physicsBody = pb
    addChild(ball)

    pb.applyImpulse(CGVector(dx: 10, dy: 10))
  }

  override func update(_ currentTime: TimeInterval) {
    initialDX = abs(ball.physicsBody!.velocity.dx)
    initialDY = abs(ball.physicsBody!.velocity.dy)
  }

  override func didSimulatePhysics() {
    guard let pb = ball.physicsBody else { fatalError() }

    // decrease this to adjust the amount of speed gained each frame :)
    let amount = CGFloat(5)

    // When bouncing off a wall, speed decreases... this corrects that to _increase speed_ off bounces.
    if abs(pb.velocity.dx) < abs(initialDX) {
      if      pb.velocity.dx < 0 { pb.velocity.dx = -initialDX - amount }
      else if pb.velocity.dx > 0 { pb.velocity.dx =  initialDX + amount }
    }

    if abs(pb.velocity.dy) < abs(initialDY) {
      if      pb.velocity.dy < 0 { pb.velocity.dy = -initialDY - amount }
      else if pb.velocity.dy > 0 { pb.velocity.dy =  initialDY + amount }
    }
  }
}

您可以將其修改為僅使用SKAction.repeatForever(.sequence([.wait(forDuration: TimeInterval, .run( { code } )))每5秒提高一次速度SKAction.repeatForever(.sequence([.wait(forDuration: TimeInterval, .run( { code } )))但是IMO不斷提高速度會更加出色,並且易於實施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM