以下是SKAction的代码:
SKAction *movePipes = [SKAction moveByX:x y:y duration:d];
SKAction *removePipes = [SKAction removeFromParent];
SKAction *_movePipesAndRemove = [SKAction sequence:@[movePipes, removePipes]];
以下是我执行SKAction的方式:
[object runAction:_movePipesAndRemove];
我检查了三倍,我确定错误来自这里。
这是崩溃日志:
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x1996d00b0 0x1996b0000 + 0x200b0 // objc_retain + 0x10
1 SpriteKit 0x18a08aa24 0x18a030000 + 0x5aa24 // -[SKNode runAction:] + 0x1c
2 + FlappyGo.dylib 0x1027c61c0 0x1027bc000 + 0xa1c0 // -[MyScene spawnPipes] + 0x764
3 SpriteKit 0x18a0b8458 0x18a030000 + 0x88458 // -[SKPerformSelector updateWithTarget:forTime:] + 0x58
4 SpriteKit 0x18a056b64 0x18a030000 + 0x26b64 // SKCSequence::cpp_updateWithTargetForTime(SKCNode*, double) + 0x64
5 SpriteKit 0x18a047588 0x18a030000 + 0x17588 // SKCRepeat::cpp_updateWithTargetForTime(SKCNode*, double) + 0x40
6 SpriteKit 0x18a04cff0 0x18a030000 + 0x1cff0 // SKCNode::update(double, float) + 0xe4
7 SpriteKit 0x18a05d1c0 0x18a030000 + 0x2d1c0 // -[SKScene _update:] + 0x150
8 SpriteKit 0x18a07974c 0x18a030000 + 0x4974c // -[SKView _update:] + 0x328
9 SpriteKit 0x18a07689c 0x18a030000 + 0x4689c // __59-[SKView _renderSynchronouslyForTime:preRender:postRender:]_block_invoke + 0xa4
10 SpriteKit 0x18a076770 0x18a030000 + 0x46770 // -[SKView _renderSynchronouslyForTime:preRender:postRender:] + 0xd4
11 SpriteKit 0x18a079290 0x18a030000 + 0x49290 // -[SKView layoutSubviews] + 0x60
12 UIKit 0x18a20aff0 0x18a1fc000 + 0xeff0 // -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 0x284
13 QuartzCore 0x189a11f14 0x189a04000 + 0xdf14 // -[CALayer layoutSublayers] + 0x94
14 QuartzCore 0x189a0cb20 0x189a04000 + 0x8b20 // CA::Layer::layout_if_needed(CA::Transaction*) + 0x124
15 QuartzCore 0x189a0c9e0 0x189a04000 + 0x89e0 // CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 0x20
16 QuartzCore 0x189a0c07c 0x189a04000 + 0x807c // CA::Context::commit_transaction(CA::Transaction*) + 0xfc
17 QuartzCore 0x189a0bdd0 0x189a04000 + 0x7dd0 // CA::Transaction::commit() + 0x204
18 UIKit 0x18a20e0c0 0x18a1fc000 + 0x120c0 // _UIApplicationHandleEventQueue + 0x16a8
19 CoreFoundation 0x184c705a4 0x184b94000 + 0xdc5a4 // __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 0x18
20 CoreFoundation 0x184c70038 0x184b94000 + 0xdc038 // __CFRunLoopDoSources0 + 0x21c
21 CoreFoundation 0x184c6dd38 0x184b94000 + 0xd9d38 // __CFRunLoopRun + 0x2d4
22 CoreFoundation 0x184b9cdc0 0x184b94000 + 0x8dc0 // CFRunLoopRunSpecific + 0x180
23 GraphicsServices 0x18fb30088 0x18fb24000 + 0xc088 // GSEventRunModal + 0xb4
24 UIKit 0x18a276f44 0x18a1fc000 + 0x7af44 // UIApplicationMain + 0xcc
25 pokemongo (*) 0x10000c8cc 0x100008000 + 0x48cc // 0x00004830 + 0x9c
26 libdyld.dylib 0x199ed68b8 0x199ed4000 + 0x28b8 // start + 0x4
更新
根据@Whirlwind的要求,这是整个spawnPipes方法:
-(void)spawnPipes {
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
SKNode* pipePair = [SKNode node];
pipePair.position = CGPointMake( screenWidth + 30, 0 );
pipePair.zPosition = -10;
CGFloat y = arc4random() % (NSInteger)( screenHeight / 3 );
SKSpriteNode* firstPipe;
firstPipe = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImage:[UIImage imageWithContentsOfFile:@"/Library/Application Support/FlappyGo/firstpipe.png"]]];
[firstPipe setScale:2];
firstPipe.position = CGPointMake( 0, y );
firstPipe.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:firstPipe.size];
firstPipe.physicsBody.dynamic = NO;
firstPipe.physicsBody.categoryBitMask = pipeCategory;
firstPipe.physicsBody.contactTestBitMask = birdCategory;
[pipePair addChild:firstPipe];
SKSpriteNode* secondPipe;
secondPipe = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImage:[UIImage imageWithContentsOfFile:@"/Library/Application Support/FlappyGo/secondPipe.png"]]];
[secondPipe setScale:2];
secondPipe.position = CGPointMake( 0, y + firstPipe.size.height + 100 );
secondPipe.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:secondPipe.size];
secondPipe.physicsBody.dynamic = NO;
secondPipe.physicsBody.categoryBitMask = pipeCategory;
secondPipe.physicsBody.contactTestBitMask = birdCategory;
[pipePair addChild:secondPipe];
SKNode* contactNode = [SKNode node];
contactNode.position = CGPointMake( firstPipe.size.width + _bird.size.width / 2, CGRectGetMidY( self.frame ) );
contactNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(secondPipe.size.width, self.frame.size.height)];
contactNode.physicsBody.dynamic = NO;
contactNode.physicsBody.categoryBitMask = scoreCategory;
contactNode.physicsBody.contactTestBitMask = birdCategory;
[pipePair addChild:contactNode];
[pipePair runAction:_movePipesAndRemove];
[_pipes addChild:pipePair];
}
答案 0 :(得分:1)
我意识到你解决了你的问题,但我认为这个答案对未来的某些人有帮助。获得你所追求的行动的简单方法是这样的:
[object runAction:movePipes completion:^{
[object removeFromParent];
}];
答案 1 :(得分:0)
您应该为不同的SKNode创建新的SKAction。