0

TL;DR - 在 spritekit 中,在 while 循环中,我使用 for 循环来执行任意工作以延迟 while 循环的下一次调用,这样我的电源条就不会运行得非常快。有没有更好的方法可以在 spritekit 中进行小幅延迟?

嘿大家,

我正在制作一款游戏,其中涉及用户在发射炮弹之前设置大炮的功率。我希望电源条从 0-100 到 100-0 并像这样循环。当用户点击按钮时,电源条会运行,一旦他们释放,我就会根据电源条的位置计算弹丸的速度。我的计划是使用 SKCropNode 根据进度条的进度显示进度条图像。使用以下进度条类可以很好地工作:

//Progress bar Header

#import <SpriteKit/SpriteKit.h>

@interface CustomProgressBar : SKCropNode
- (void) setProgress:(CGFloat) progress;
@end

//Progress bar Implemenation

#import "CustomProgressBar.h"
@implementation CustomProgressBar

- (id)init {
if (self = [super init]) {
    self.maskNode = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor]    size:CGSizeMake(50,20)];
    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"progressBar.jpg"];
    sprite.anchorPoint = CGPointMake(0, 0);
    [self addChild:sprite];
}
return self;
}

- (void) setProgress:(CGFloat) progress {
self.maskNode.xScale = progress;
}

@end

我使用这个函数来更新电源条(它使用 for 循环来延迟条的更新):

-(void)runPowerBar {
    i = 1;
    progressBar.hidden = NO;
    power = 10;
    while (!self.isStarted){
        float prog = power * 0.00001;
        multiplier = prog;
        [progressBar setProgress:prog];

        for(int z = 0; z < 100; z++){
           // this is bad and inconsistent, need a new way
           // to delay the next call of [progressBar setProgress:prog]
        }

        power = power + i;

        if (power > 1000000) {
            i = -1;
        }
        else if (power < 1) {
            i = 1;
        }
    }
}

在初始化 powerbar 之后,我按如下方式调用 power bar:

backgroundQueue = dispatch_queue_create("com.joshnussbaum.powerBarQ", 0);
            dispatch_async(backgroundQueue, ^{
                [self runPowerBar];
            });
4

2 回答 2

0

尽管您似乎在 Sanders answer 中找到了解决方案,但我建议您使用 SKScene 的update:方法,它是 SpriteKit 渲染循环的一部分。添加你自己的异步调用最终会让你陷入困境。

update:方法每帧调用一次,应该足以满足您的需求。通过这种方式,您还可以确保更新电源条的次数不会超过必要的次数,即每帧不止一次。

下图取自 Apple 的 SpriteKit 编程指南 - 在此处阅读有关 Sprite Kit 渲染循环的更多信息。

SKScene 用于执行渲染循环的步骤。 (苹果)

于 2015-04-30T14:38:44.663 回答
0

像这样的东西应该工作:

-(void)runPowerBar 
{
    i = 1;
    progressBar.hidden = NO;
    power = 10;
    [self updatePowerBar];
}

-(void)updatePowerBar
{
    if(!self.isStarted)
    {
        float prog = power * 0.00001;
        multiplier = prog;
        [progressBar setProgress:prog];

        power = power + i;

        if (power > 1000000) 
        {
            i = -1;
        }
        else if (power < 1) 
        {
            i = 1;
        }
        dispatch_after(YOUR_DISPATCH_TIME, dispatch_get_main_queue(), 
        ^{
            [self updatePowerBar];
        });
    }
}
于 2015-04-28T23:15:26.290 回答