为什么[SKAction runBlock:^(void){}]永远不会起作用?

时间:2016-02-26 01:36:31

标签: ios objective-c sprite-kit skscene

我试图让无限数量的硬币一个接一个地下降(用waitforduration:方法制作相等的空格),由于某些原因我无法弄清楚,{{1没有在精灵工具包中工作得很好(第一枚硬币和第二枚硬币之间的差距总是与其他相等的间隙不同)所以我试图使用这个代码,但事实是,它从未奏效我也做错了什么?但是,我的代码适用于[NSTread sleepForTimeInterval:],但我希望使用dispatch_queue_t fallingCoinsQueue = dispatch_queue_create("falling coins", nil); dispatch_async(fallingCoinsQueue, ^{ //Do Whatever }); 代替此代码,任何帮助都会受到很多赞赏。

SKAction runBlock^(void){}

1 个答案:

答案 0 :(得分:0)

就个人而言,当涉及到很少的事情时,我可能会以不同的方式做到这一点,例如命名硬币纹理,或者使用属性和实例变量等。但是,保持我的例子,类似于你的代码,这就是你的方式可以做到(复制和粘贴它以查看它是如何工作的):

#import "GameScene.h"

@interface GameScene()
{
    SKTexture* goldenCoin;
    SKTexture* blackCoin;
}
@end


@implementation GameScene

-(instancetype)initWithSize:(CGSize)size {

    if (self = [super initWithSize:size]) {

        SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"coins"];

        goldenCoin = [atlas textureNamed:@"goldenCoin"];
        blackCoin = [atlas textureNamed:@"blackCoin"];

    }
    return self;
}

-(void)didMoveToView:(SKView *)view{

    //use  withRange: parameter if you want to randomize a delay
    SKAction *wait = [SKAction waitForDuration:1];

    __weak typeof(self) weakSelf = self;

    SKAction *block = [SKAction runBlock:^{

        SKSpriteNode *coin = [weakSelf spawnRandomCoin];
        [weakSelf addChild:coin];
    }];

    SKAction *sequence = [SKAction sequence:@[wait, block]];

    SKAction *loop = [SKAction repeatActionForever:sequence];

    //access this key later to stop spawning
    [self runAction:loop withKey:@"spawning"];
}

-(SKSpriteNode*)spawnRandomCoin {

    NSArray * coinArray= [[NSArray alloc] initWithObjects:goldenCoin,blackCoin,nil];
    NSUInteger randomIndex = arc4random() % [coinArray count];
    NSLog(@"random index : %lu", randomIndex);
    //Create and setup a coin
    SKSpriteNode *coin = [SKSpriteNode spriteNodeWithTexture:coinArray[randomIndex]];

    coin.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius: coin.size.width/2.0f];
    CGFloat x = self.view.frame.size.width - ( coin.frame.size.width - 10.0f );
    CGFloat y = self.view.frame.size.height;
    coin.position = CGPointMake(x , y);
    coin.physicsBody.dynamic = NO;


    //setup coin's category here
    if (coin.texture == blackCoin){

    }else{

    }

    //setup moving action
    SKAction *move = [SKAction moveToY:-coin.size.width duration:5];
    SKAction *moveAndRemove = [SKAction sequence:@[move, [SKAction removeFromParent]]];

    [coin runAction:moveAndRemove withKey:@"moving"];

    return coin;
}
@end

关于您的代码:

  • _randomCoinNode,在最好的情况下,会存储对添加到场景中的最后一枚硬币的引用。哪个没有多大意义,我想这不是你想要的。

  • 在初始化器,去初始化器和重写的访问器方法(getter& setter)之外的任何地方,您应该使用访问器方法或点语法来访问实例变量(根据文档建议)。方法,在您的方法中,您应该使用self.randomCoinNode而不是_randomCoinNode

  • 其他问题(强大的参考周期和在一个区块内捕捉自我)我已在评论中提到过。