Comment puis-je faire une fonction à exécuter à chaque seconde dans swift?
Je veux ajouter une note au dessus de ma scène dans le jeu, je suis en train de travailler sur. Le score va basé sur combien de temps vous dernier, et va augmenter à chaque seconde. Merci pour l'aide à l'avance!
import SpriteKit
class easyScene: SKScene {
let scrollBarEasyBottom = SKSpriteNode(imageNamed: "scrollBarEasyBottom")
let scrollBarEasyTop = SKSpriteNode(imageNamed: "scrollBarEasyTop")
let ball = SKSpriteNode(imageNamed: "ball")
var origSBEBpositionX = CGFloat(0)
var origSBETpositionX = CGFloat(0)
var maxSBEBX = CGFloat(0)
var SBEBSpeed = 5
var maxSBETX = CGFloat(0)
var SBETSpeed = 5
var score = 0
var timer: NSTimer?
var scoreText = SKLabelNode(fontNamed: "Kailasa")
override func didMoveToView(view: SKView) {
println("Easy Scene is the location")
self.backgroundColor = UIColor.blackColor()
self.scrollBarEasyBottom.position = CGPoint(x:0, y:270)
self.addChild(self.scrollBarEasyBottom)
self.scrollBarEasyBottom.yScale = 0.2
self.origSBEBpositionX = self.scrollBarEasyBottom.position.x
//end scrollBarEasyBottom
self.scrollBarEasyTop.position = CGPoint(x:20, y:400)
self.addChild(self.scrollBarEasyTop)
self.scrollBarEasyTop.yScale = 0.2
self.origSBETpositionX = self.scrollBarEasyTop.position.x
//end scrollBarEasyTop
self.ball.position = CGPoint(x:40, y:293)
self.addChild(self.ball)
self.ball.yScale = 0.17
self.ball.xScale = 0.17
//end ball
self.maxSBEBX = self.scrollBarEasyBottom.size.width - self.frame.size.width
self.maxSBEBX *= -1
self.maxSBETX = self.scrollBarEasyTop.size.width - self.frame.size.width
self.maxSBETX *= -1
//
self.scoreText.text = "0"
self.scoreText.fontSize = 60
self.scoreText.position = CGPoint(x: CGRectGetMidX(self.frame), y: 500)
self.scoreText.text = String(self.score)
self.addChild(self.scoreText)
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("scoreIncrease") , userInfo: nil, repeats: true)
func scoreIncrease (){
score++
println(score)
}
}
override func update(currentTime: NSTimeInterval){
if self.scrollBarEasyBottom.position.x <= maxSBEBX + 1200 {
self.scrollBarEasyBottom.position.x = self.origSBEBpositionX
}
if self.scrollBarEasyTop.position.x <= maxSBETX + 1200 {
self.scrollBarEasyTop.position.x = self.origSBETpositionX
}
scrollBarEasyBottom.position.x -= CGFloat(self.SBEBSpeed)
scrollBarEasyTop.position.x -= CGFloat(self.SBETSpeed)
//moving bars
var degreeRotation = CDouble(self.SBEBSpeed) * M_PI / 180
self.ball.zRotation -= CGFloat(degreeRotation)
//rotate ball
}
}
Après l'exécution de ce code, j'obtiens toujours un "non reconnu sélecteur envoyé à l'instance d'erreur".
- Pourriez-vous valide un aswer s'il vous plaît !
- Toutes ces réponses ne sont pas très utile en fait. Dans SpriteKit vous devriez envisager d'utiliser SKactions temps pour les choses liées. La recherche à ce sujet sur DONC. En général, un Timer (NSTimer) de ne pas respecter le nœud, de la scène, ou la vue de l'état de pause, de sorte qu'il peut mener à certaines questions. De l'autre côté, SKActions sont automatiquement mis en pause si le nœud, une scène ou un affichage est mis en pause pendant un jeu ou à certaines interruptions comme un appel téléphonique, etc.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser l'un comme ceci:
Swift 3:
Il ya quelque chose appelé NSTimer dans swift qui pourrait résoudre votre problème. J'ai donné un exemple, comme la façon dont vous pouvez l'utiliser. Juste de le personnaliser en fonction de votre but.
Ajouter cette ligne à l'endroit où vous avez besoin d'appeler votre fonction à plusieurs reprises.
1.0
se réfère à 1 seconde.selector
appeler yourMethodNamerepeats
est fixé àtrue
à appeler cette fonction à chaque seconde.Essayer cela et laissez-moi savoir si vous êtes coincé quelque part. Merci.
scoreIncrease
méthode en dehors de ladidMoveToView
méthode.'NSObject -> () -> TableViewController does not conform to expected type 'AnyObject'
Où dois-je déclarer cette variable?Swift 3
trouver cette solution a fonctionné pour moi
XCode 10.2 Swift 5:
Je ne pense pas que vous avez besoin
NSTimer
pour cela.Puisque vous utilisez SpriteKit, je vais proposer la solution la plus simple à mon avis:
Déclarer une variable
var prevScoreCalcTime:TimeInterval = 0
À l'intérieur de
update
func dans votreGameScene
de la configurer comme ci-dessous:Bonne chance!
//Pour l'exécution d'un morceau de code à chaque seconde
Je préfère