iOS SpriteKit 运行 无限循环中的进度条
iOS SpriteKit run progress bar in infinite loop
TL;DR - 在 spritekit 中,在 while 循环中,我使用 for 循环做任意工作来延迟 while 循环的下一次调用,这样我的电源条就不会 运行快得离谱。有没有更好的方法让 spritekit 有一个小延迟?
大家好,
我正在制作一款游戏,其中涉及用户在从大炮发射炮弹之前设置大炮的功率。我希望电源条从 0-100 变为 100-0 并像这样循环。当用户点击按钮时,电源条 运行s,一旦他们释放,我就会根据电源条的位置计算射弹的速度。我的计划是使用 SKCropNode 根据进度条的进度显示进度条图像。这对进度条使用以下 class 效果很好:
//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;
}
}
}
我调用power bar如下,初始化powerbar后:
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 渲染循环的更多信息 here。
TL;DR - 在 spritekit 中,在 while 循环中,我使用 for 循环做任意工作来延迟 while 循环的下一次调用,这样我的电源条就不会 运行快得离谱。有没有更好的方法让 spritekit 有一个小延迟?
大家好,
我正在制作一款游戏,其中涉及用户在从大炮发射炮弹之前设置大炮的功率。我希望电源条从 0-100 变为 100-0 并像这样循环。当用户点击按钮时,电源条 运行s,一旦他们释放,我就会根据电源条的位置计算射弹的速度。我的计划是使用 SKCropNode 根据进度条的进度显示进度条图像。这对进度条使用以下 class 效果很好:
//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;
}
}
}
我调用power bar如下,初始化powerbar后:
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 渲染循环的更多信息 here。