2015-09-05 3 views
0

Я создаю игру SpriteKit со Свифт. Я использую NSTimer, таймер расписания с интервалом времени с целью и селектором. Хотя для повторов установлено значение true, труба приходит и уходит только один раз. Вот мой таймер:NSTimer не повторяется

let timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "makePipes", userInfo: nil, repeats: true) 

Труба перемещается только один раз, хотя повторяет, если это правда. Я объявила функцию (makePipes) в файле didMoveToView.

Вот мой полный код:

import SpriteKit 

class GameScene: SKScene { 
func makePipes() 
{let action = SKAction.moveToX(self.frame.size.width - 1000, duration: 3) 
    pipe.runAction(SKAction.repeatActionForever(action))} 

var mainPlayer = SKSpriteNode(imageNamed: "Ball") 
var ground = SKSpriteNode(imageNamed: "ground.png") 
var pipe = SKSpriteNode(imageNamed: "pipe.png") 
var barrier = SKSpriteNode(imageNamed: "Barrier.png") 
override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 
    backgroundColor = UIColor.whiteColor() 
    self.physicsWorld.gravity = CGVector(dx: 0, dy: -5) 
    mainPlayer.position = CGPoint(x: self.size.width/2 , y: self.frame.height/2) 
    mainPlayer.color = UIColor.grayColor() 
    mainPlayer.colorBlendFactor = 1.0 
    ground.size.width = 1000 
    barrier.size.width = 1000 
    // physics for the main palyer 
    mainPlayer.physicsBody = SKPhysicsBody(circleOfRadius: mainPlayer.size.height/2) 
    self.addChild(mainPlayer) 


    ground.position = CGPoint(x: self.frame.size.width - 500, y: self.frame.size.height - 750) 
    ground.setScale(5) 
    ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: self.ground.size.width , height: self.ground.size.height)) 
    ground.physicsBody?.dynamic = false 

    pipe.position = CGPoint(x: self.frame.width , y: self.frame.size.height - self.frame.height + 178) 
    pipe.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: pipe.size.width, height: pipe.size.height)) 
    pipe.physicsBody?.dynamic = true 
    pipe.physicsBody?.affectedByGravity = false 
    self.addChild(pipe) 
    self.addChild(ground) 
    barrier.setScale(5) 
    barrier.position = CGPoint(x: frame.width/2 , y: frame.height/2 + 40) 
    barrier.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: barrier.size.width, height: barrier.size.height)) 
    barrier.physicsBody?.dynamic = false 
    barrier.size.height = 200 
    self.addChild(barrier) 

} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    /* Called when a touch begins */ 
    self.physicsWorld.gravity = CGVector(dx: 0, dy: -1) 
       if (mainPlayer.size.height < self.frame.height/5.5) { 
     mainPlayer.physicsBody?.velocity = CGVectorMake(0.0, 0.0) 
     mainPlayer.physicsBody?.applyImpulse(CGVectorMake(0, 10)) 
    let timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "makePipes", userInfo: nil, repeats: true) 

    } 



} 

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
} 
} 
+0

Установите точку останова в начале вашего метода makePipes и посмотрите, будет ли он вызываться повторно, или добавьте инструкцию NSLog в начало. –

ответ

1

Я не вижу трубу воссозданный в любом месте. Мне кажется, что функция на самом деле называется неоднократно, но поскольку вы не воссоздаете трубы и просто используете один и тот же объект трубы, он просто двигается все дальше и дальше. Вместо того, чтобы использовать только один объект трубы, можно попытаться сохранить генерирующие трубы в этой функции, как это:

fun makePipes() 
{ 
    //create pipe 
    var Pipe = SKSpriteNode(imageNamed:"pipe.png") 
    pipe.position = CGPoint(x: self.frame.width , y: self.frame.size.height - self.frame.height + 178) 
    pipe.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: pipe.size.width, height: pipe.size.height)) 
    pipe.physicsBody?.dynamic = true 
    pipe.physicsBody?.affectedByGravity = false 
    self.addChild(pipe) 

    //move pipe 
    let action = SKAction.moveToX(self.frame.size.width - 1000, duration: 3) 
    pipe.runAction(action, completion: {() -> Void in 
     //completed action, can remove pipe 
     pipe.removeFromParent() 
    }) 
} 

также удалить переменный экземпляр из вашего класса, чтобы он не конфликта и вынимает инициализацию из viewDidLoad. Наконец, я бы рекомендовал использовать селектор выполнения SKAction, который будет делать то же самое. Тем не менее, он интегрирован в SpriteKit (вы избегаете утечек памяти и можете значительно контролировать время!)

Смежные вопросы