2015-05-19 3 views
0

Я хочу уменьшить значение с течением времени внутри функции touchesBegan после ее вызова. Я создал функцию для этого значения (updateJumpMotion). Эта функция работает (протестирована).Уменьшить целое число во времени во время касанияBegan function

Однако, так как он называется только один раз, пока контакт не закончился, он только уменьшается один раз (должен увеличиваться во время всего касания, не только один раз).

Как уменьшить целое число во времени внутри функции touchesBegan?

Это мой touchesBegan код и моя функция для уменьшения целого:

override func update(currentTime: NSTimeInterval) { 
    // Character 
    updateCharacterPosition() 
    updateJumpMotion() 
    } 


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

    var timer = NSTimer.scheduledTimerWithTimeInterval(0.02, target: self, selector: Selector("updateJumpMotion"), userInfo: nil, repeats: true) 

    if onGround && !gameOver { 
     if self.initialJumpY == nil { 
      self.initialJumpY = self.character.position.y 
     } 


     if self.character.position.y - self.initialJumpY! < 175 { 
      self.character.physicsBody?.applyImpulse(CGVectorMake(0, self.jumpVelocity)) 
     } 

    } 

    self.onGround = false 

} 


func updateJumpMotion() { 
    if onGround { 
     self.frameCounterY = 0 
     self.negativeVelocity = 0 
    } else { 
     self.frameCounterY = self.frameCounterY + 0.15 
     self.negativeVelocity = CGFloat(self.frameCounterY * self.frameCounterY) 
    } 
    self.jumpVelocity = 125 - self.negativeVelocity 
} 
+0

Петля на другой нить до тех пор, – milo526

+0

как прикосновение может начаться только один раз, это не удивительно ... вам может понадобиться настроить «NSTimer», который срабатывает, когда касания начинаются и становятся недействительными, когда коснулся законченный. – holex

+0

@holex Я пробовал это, но без успеха до сих пор. Это вызывает большую задержку в механизме перехода. –

ответ

0

Начала повторяющейся NSTimer и есть, что таймер уменьшить ваше значение каждый раз, когда таймер сработает. Если вы хотите прекратить снижать свое значение, когда пользователь освобождает представление, введите код в touchesEnded, который делает недействительным таймер.

+0

Я добавил 'self.jumpTimer = NSTimer.scheduledTimerWithTimeInterval (1, target: self, selector: Selector (" updateJumpMotion "), userInfo: nil, repeatts: true)' к моей функции 'touchhesBegan', но я не знаете, как связать его с 'jumpVelocity'? –

+0

Пользователь использует spritekit, и я полагаю, что он делает игру, гораздо лучше использовать SKAction.waitForDuration, поскольку NSTimer игнорирует приостановку событий и может вызвать неизвестные ошибки при работе с spritekit – Wraithseeker

0

Сначала вы можете создать SKAction внутри своей функции touchesBegan, а затем использовать свойство SKAction.waitForduration(// some value). Затем вы пишете этот код, чтобы убедиться, что он повторяетForever self.runAction(yourAction.repeatActionForever).

//Example working code 
let waitAction = SKAction.waitForDuration(some duration) 
let waitActionRun = SKAction.runBlock { 
// do something that you want to do here 

} 
runAction(SKAction.repeatActionForever(SKAction.sequence([waitAction,waitActionRun])))   
+0

Функция 'touchhesBegan' позволяет только все, что внутри нее запускается , Если я добавлю SKAction, это уменьшит значение, но оно не связано с 'self.jumpVelocity' вне' SKAction'. Я мог бы что-то делать неправильно. –

+0

'touchhesBegan' запускается один раз, что запускает действие. Поскольку действие настроено на выполнение навсегда, оно будет выполняться несколько раз. Можете ли вы подробнее рассказать о том, как это не нравится для себя. JumpVelocity вне действия? Разве это не работает? Показать ur код – Wraithseeker

+0

Я редактировал свой пост, но проблемы начинаются, когда XCode говорит, что не распознает 'repeatActionForever'. Должен признаться, что я еще не работал с SKActions, поэтому мне действительно нужна помощь. –