0

TL;DR - スプライトキットでは、while ループで for ループを使用して任意の作業を行い、while ループの次の呼び出しを遅らせて、パワーバーが途方もなく速く実行されないようにしています。スプライトキットを少し遅らせる良い方法はありますか?

こんにちは、みなさん、

大砲から発射物を発射する前に、ユーザーが大砲の出力を設定するゲームを作成しています。パワーバーを 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];
            });
4

2 に答える 2

0

Sanders の回答で解決策を見つけたようですが、SpriteKit レンダリング ループの一部であるSKScene のupdate:メソッドを使用することをお勧めします。独自の非同期呼び出しを追加すると、最終的に不利になります。

このupdate:メソッドはフレームごとに 1 回呼び出されるため、ニーズには十分すぎるはずです。このようにして、パワーバーを必要以上に更新しないようにすることもできます。つまり、フレームごとに複数回更新することです。

以下の画像は、Apple の SpriteKit プログラミング ガイドから取得したものです。Sprite Kit のレンダリング ループの詳細については、こちらを参照してください。

SKScene がレンダリング ループを実行するために使用するステップ。 (アップル)

于 2015-04-30T14:38:44.663 に答える