簡體   English   中英

iOS SpriteKit在無限循環中運行進度欄

[英]iOS SpriteKit run progress bar in infinite loop

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;
        }
    }
}

初始化電源條后,我將電源條稱為如下:

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

這樣的事情應該起作用:

-(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];
        });
    }
}

盡管您似乎在Sanders答案中找到了解決方案,但我還是建議您使用SKScene的update:方法,該方法是SpriteKit渲染循環的一部分。 添加自己的異步調用最終將使您陷入困境。

update:方法每幀調用一次,應足以滿足您的需求。 這樣,您還可以確保對功率條的更新不會超出必要的范圍,即每幀更新一次。

下圖取自Apple的SpriteKit編程指南-在此處閱讀有關Sprite Kit渲染循環的更多信息

SKScene用於執行渲染循環的步驟。 (蘋果)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM