【问题标题】:How to Create "identical" SpriteNodes that hold the same methods?如何创建具有相同方法的“相同”SpriteNode?
【发布时间】:2016-01-04 18:01:51
【问题描述】:

我对编码非常陌生(就像我昨天刚开始一样)。我试图让相同的 SpriteNode 出现多次,遵循相同的方法。例如,游戏开始时有一个节点对触摸做出反应,达到 5 点后出现另一个节点,15 点后出现另一个等等……我已经能够在 5 点产生 spriteCopy;但是我无法让它像原始节点一样响应触摸。我敢肯定这是超级简单的事情,我只是没有经验。谢谢。

到目前为止,这是我的代码:

class GameScene: SKScene {
var sprite: SKSpriteNode!
var touchPoint: CGPoint = CGPoint()
var touching: Bool = false
var score: Int = 0
let scoreTextNode = SKLabelNode(fontNamed: "Helvetica Neue UltraLight")

override func didMoveToView(view: SKView) {

    sprite = SKSpriteNode(imageNamed: "PongBall")
    sprite.position = CGPoint(x: 500,y: 500)
    sprite.size = CGSize(width: 75, height: 75)
    sprite.physicsBody = SKPhysicsBody(circleOfRadius: 37.5)
    self.addChild(sprite)

    scoreTextNode.text = "\(score)"
    scoreTextNode.fontSize = 70
    scoreTextNode.fontColor = SKColor.blackColor()
    scoreTextNode.position = CGPoint (x: 680.734, y: 700.941)
    self.addChild(scoreTextNode)
}



override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    let touch = touches.first as UITouch!
    let location = touch.locationInNode(self)
    if sprite.frame.contains(location) {
        touchPoint = location
        touching = true
    }

    if touchPoint == location {
        self.score += 1
        self.scoreTextNode.text = "\(score)"
    }

    let spriteCopy = sprite.copy() as! SKSpriteNode
    if score == 5 {
        self.addChild(spriteCopy)
    }
}


override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    let touch = touches.first as UITouch!
    let location = touch.locationInNode(self)
    touchPoint = location


}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    touching = false
}

override func update(currentTime: CFTimeInterval) {

    if touching {
        let dt:CGFloat = 1.0/30.0
        let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y)
        let velocity = CGVector(dx: distance.dx/dt, dy: distance.dy/dt)
        sprite.physicsBody!.velocity=velocity
    }

}

}

【问题讨论】:

  • 尝试在sprite = spriteCopy 中设置if score == 5
  • @Caleb 那不会对他有任何好处

标签: swift sprite-kit skspritenode


【解决方案1】:

您的问题是屏幕上出现了多个精灵,但您没有对它们进行任何操作。为了让事情变得真正简单,请采用这种方法。

class GameScene: SKScene {
  var sprite: SKSpriteNode!
  var touchPoint: CGPoint = CGPoint()
  var touching: Bool = false
  var score: Int = 0
  let scoreTextNode = SKLabelNode(fontNamed: "Helvetica Neue UltraLight")
  var spriteList = [SKSpriteNode]() //Add this line

  override func didMoveToView(view: SKView) {

    sprite = SKSpriteNode(imageNamed: "PongBall")
    sprite.position = CGPoint(x: 500,y: 500)
    sprite.size = CGSize(width: 75, height: 75)
    sprite.physicsBody = SKPhysicsBody(circleOfRadius: 37.5)
    self.addChild(sprite)
    spriteList.append(sprite)  //Add This line
    scoreTextNode.text = "\(score)"
    scoreTextNode.fontSize = 70
    scoreTextNode.fontColor = SKColor.blackColor()
    scoreTextNode.position = CGPoint (x: 680.734, y: 700.941)
    self.addChild(scoreTextNode)
  } 



   override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

     let touch = touches.first as UITouch!
     let location = touch.locationInNode(self)
     for sprite in spriteList{ //Add This line
         if sprite.frame.contains(location) {
           touchPoint = location
           touching = true
         }

         if touchPoint == location {
            self.score += 1
            self.scoreTextNode.text = "\(score)"
         } 

         let spriteCopy = sprite.copy() as! SKSpriteNode
         if score == 5 {
           self.addChild(spriteCopy)
           spriteList.append(spriteCopy)  //Add this line
         }
       } //Add this line
   }


   override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

     let touch = touches.first as UITouch!
     let location = touch.locationInNode(self)
     touchPoint = location
   }
   override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
     touching = false
   }

   override func update(currentTime: CFTimeInterval) {

     if touching {
       for sprite in spriteList{ //Add this line
         let dt:CGFloat = 1.0/30.0
         let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y)
         let velocity = CGVector(dx: distance.dx/dt, dy: distance.dy/dt)
         sprite.physicsBody!.velocity=velocity
       } //Add this line
     }
   }
 }

基本概念是将其维护在一个数组中。对于初学者来说,这应该是一个很好的起点。在学习了如何覆盖类之后,您可以了解到触摸代码可以在精灵内部而不是在场景内部完成。这实际上是我的首选方法。

【讨论】:

  • @KnightOfDragon 你犯了一个小错误。 let spriteList = [SKSpriteNode]() 将创建一个不可变数组。数组必须是可变的才能添加/删除项目。
  • @Whirlwind 是的,你是对的,我会修复它,只是习惯使用 let over var
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多