2015-08-15 48 views
0

我为这个令人困惑的问题题目写了一个appologise,但我不太确定如何说出我的问题。我的最终目标是在创建一段时间后删除一个SKSpriteNode。但是,有一个小的并发症。使用以下代码如何在创建另一个相同var名称后与SKSpriteNode进行交互?

func remove() { 
    laser.removeFromParent() 
} 

runAction(
    SKAction.sequence([ 
     SKAction.waitForDuration(5.0), 
     SKAction.runBlock(remove) 
     ]) 
) 

我可以删除名为'laser'的SKSpriteNode。当我调用我的功能一次,fireLasers(),一切运行平稳,5秒钟后激光消失。问题是当我在5秒内调用两次时。发生这种情况时,第一台激光器会无限期地停留,第二台激光器会比预期的早消失。我明白为什么会发生这种情况,但想知道是否有解决方法。这里是GameScene的代码,它创建了世界,背景图片,玩家Sprite,并定义了fireLasers函数。 ViewController中有很多东西与精灵的速度和方向一致,但我希望这足以找到一个解决方案。

import SpriteKit 

class GameScene: SKScene { 

var player = SKSpriteNode() 
var world = SKShapeNode() 
var worldTexture = SKSpriteNode() 
var laser = SKShapeNode() 

override func didMoveToView(view: SKView) { 
    self.anchorPoint = CGPointMake(0.5, 0.5) 
    self.size = CGSizeMake(view.bounds.size.width, view.bounds.size.height) 

    // Add world 
    world = SKShapeNode(rectOfSize: CGSizeMake(7000, 7000)) 
    world.physicsBody = SKPhysicsBody(edgeLoopFromPath: world.path!) 
    world.fillColor = SKColor.blackColor() 
    self.addChild(world) 

    // Add Background Image 
    worldTexture = SKSpriteNode(imageNamed: "grid") 
    worldTexture.size = CGSize(width: 7000, height: 7000) 

    world.addChild(worldTexture) 

    // Add player 
    player = SKSpriteNode(imageNamed: "Spaceship") 
    player.size = CGSize(width: 50, height: 50) 
    player.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 50, height: 50)) 
    player.physicsBody?.affectedByGravity = false 
    player.physicsBody?.dynamic = true 
    world.addChild(player) 




    } 

override func update(currentTime: CFTimeInterval) { 
    world.position.x = -player.position.x 
    world.position.y = -player.position.y 
} 


func fireLasers() { 
    laser = SKShapeNode(rectOfSize: CGSizeMake(10, 50)) 
    laser.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 10, height: 50)) 
    laser.position.x = player.position.x 
    laser.position.y = player.position.y + CGFloat(50) 
    laser.fillColor = SKColor.redColor() 
    laser.physicsBody?.dynamic = true 
    laser.physicsBody?.affectedByGravity = false 
    world.addChild(laser) 

    func remove() { 
     laser.removeFromParent() 
    } 
    runAction(
     SKAction.sequence([ 
      SKAction.waitForDuration(5.0), 
      SKAction.runBlock(remove) 
      ]) 
    ) 


} 



} 

回答

2

而是保持一个参考激光(这将作为你注意到没有,迫使你在同一时间只能有一个左右),为什么不能运行在创建激光动作节点本身的?这将允许您使用得心应手SKAction类方法removeFromParent()

let newLaser = makeNewLaser() 
let laserAction = SKAction.sequence([SKAction.waitForDuration(5), SKAction.removeFromParent()]) 
newLaser.runAction(laserAction) 
+0

你的先生是一个向导,感谢您的帮助兄弟! – Austin

相关问题