2015-08-15 22 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

相關問題