我如何拥有每秒更改标签的计时器? Xcode 6
How do I have a timer that changes a Label every second? Xcode 6
我制作了一个 NSTimer 并且我使它成为每秒 运行 一个方法,它有一个整数,每次加一个并放入 SKLabelNode 但它永远不会改变。这是代码。 (对不起,如果我弄糊涂了)
> #import "GameScene.h"
>
> @implementation GameScene
>
> -(void)didMoveToView:(SKView *)view {
> /* Setup your scene here */
>
> [NSTimer timerWithTimeInterval:1
> target:self
> selector:@selector(timerMethod)
> userInfo:nil
> repeats:YES];
>
> timeAlive = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
> timeAlive.text = @"Time Alive: 0 Seconds";
> timeAlive.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
>
> character = [SKSpriteNode spriteNodeWithImageNamed:@"Character"];
> character.position = CGPointMake(CGRectGetMidX(self.frame)/2 - 150, CGRectGetMidY(self.frame)/2);
>
> enemy = [SKSpriteNode spriteNodeWithImageNamed:@"Character"];
> enemy.name = @"enemy";
> enemy.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)/2);
>
> [self addChild:timeAlive];
>
> [self addChild:character];
> [self addChild:enemy];
> }
>
> -(void) timerMethod{
>
> timeAlive.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
> timeAliveString = [NSString stringWithFormat:@"Time Alive: %d Seconds", timeAliveInt];
> //timeAliveString = [@(timeAliveInt) stringValue];
> timeAlive.text = timeAliveString;
> timeAliveInt = 1;
> }
>
> -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
> /* Called when a touch begins */
>
> for (UITouch *touch in touches) {
> CGPoint location = [touch locationInNode:self];
>
>
>
> } }
>
> -(void)update:(CFTimeInterval)currentTime {
> /* Called before each frame is rendered */ }
>
> @end
(我在Header中定义了变量class)
您想要 scheduledTimerWithInterval
而不是 timerWithTimeInterval
。那,以及保留对您创建的计时器的引用,应该可以解决您的问题。
不要在 SpriteKit 中使用 NSTimer
。它们不适用于 SpriteKit。例如设置SKScene
的paused
属性时,NSTimer不会自动暂停。您可以改用 SKActions。
SKAction *waitAction = [SKAction waitForDuration:1];
SKAction *callTimerAction = [SKAction runBlock:^{
[self timerMethod];
}];
SKAction *sequence = [SKAction sequence:@[callTimerAction, waitAction]];
SKAction *foreverRepeatSequence = [SKAction repeatActionForever:sequence];
[self runAction:foreverRepeatSequence];
我制作了一个 NSTimer 并且我使它成为每秒 运行 一个方法,它有一个整数,每次加一个并放入 SKLabelNode 但它永远不会改变。这是代码。 (对不起,如果我弄糊涂了)
> #import "GameScene.h"
>
> @implementation GameScene
>
> -(void)didMoveToView:(SKView *)view {
> /* Setup your scene here */
>
> [NSTimer timerWithTimeInterval:1
> target:self
> selector:@selector(timerMethod)
> userInfo:nil
> repeats:YES];
>
> timeAlive = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
> timeAlive.text = @"Time Alive: 0 Seconds";
> timeAlive.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
>
> character = [SKSpriteNode spriteNodeWithImageNamed:@"Character"];
> character.position = CGPointMake(CGRectGetMidX(self.frame)/2 - 150, CGRectGetMidY(self.frame)/2);
>
> enemy = [SKSpriteNode spriteNodeWithImageNamed:@"Character"];
> enemy.name = @"enemy";
> enemy.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)/2);
>
> [self addChild:timeAlive];
>
> [self addChild:character];
> [self addChild:enemy];
> }
>
> -(void) timerMethod{
>
> timeAlive.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
> timeAliveString = [NSString stringWithFormat:@"Time Alive: %d Seconds", timeAliveInt];
> //timeAliveString = [@(timeAliveInt) stringValue];
> timeAlive.text = timeAliveString;
> timeAliveInt = 1;
> }
>
> -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
> /* Called when a touch begins */
>
> for (UITouch *touch in touches) {
> CGPoint location = [touch locationInNode:self];
>
>
>
> } }
>
> -(void)update:(CFTimeInterval)currentTime {
> /* Called before each frame is rendered */ }
>
> @end
(我在Header中定义了变量class)
您想要 scheduledTimerWithInterval
而不是 timerWithTimeInterval
。那,以及保留对您创建的计时器的引用,应该可以解决您的问题。
不要在 SpriteKit 中使用 NSTimer
。它们不适用于 SpriteKit。例如设置SKScene
的paused
属性时,NSTimer不会自动暂停。您可以改用 SKActions。
SKAction *waitAction = [SKAction waitForDuration:1];
SKAction *callTimerAction = [SKAction runBlock:^{
[self timerMethod];
}];
SKAction *sequence = [SKAction sequence:@[callTimerAction, waitAction]];
SKAction *foreverRepeatSequence = [SKAction repeatActionForever:sequence];
[self runAction:foreverRepeatSequence];