2016-07-09 15 views
1

Hier ist der Code des SKAction:SpriteKit app Absturz beim Laufen [SKAction moveByX: y: duration]

SKAction *movePipes = [SKAction moveByX:x y:y duration:d]; 
SKAction *removePipes = [SKAction removeFromParent]; 
SKAction *_movePipesAndRemove = [SKAction sequence:@[movePipes, removePipes]]; 

Und hier ist, wie ich die SKAction ausführen:

[object runAction:_movePipesAndRemove]; 

Ich habe verdreifachte, I bin mir sicher, dass der Fehler von hier kommt.

Hier ist der Crashlog:

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 

Update:

Wie @Whirlwind angefordert, hier ist die gesamte spawnPipes Methode:

-(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

Der Code, den Sie geschrieben haben, ist völlig in Ordnung. Trotzdem mag ich nicht, wie du deine Sequenz benannt hast. Es ist ein wenig verwirrend, weil Unterstreichung oft ein Indikator dafür ist, dass Sie mit iVars arbeiten. Wie auch immer, kannst du zeigen, wie deine 'spawnPipes:' Methode aussieht? – Whirlwind

+0

Ich habe den Hauptbeitrag mit der spawnPipes-Methode aktualisiert. – Ziph0n

+0

Also verwenden Sie _movePipesAndRemove Variable lokal (innerhalb der SpawnPipes-Methode), richtig? Aber haben Sie es als Eigentum einer Szene deklariert? – Whirlwind

Antwort

0

Sie sollten für verschiedene SKNodes neue SKActions erstellen.

1

Ich weiß, dass Sie Ihr Problem gelöst haben, aber ich dachte, diese Antwort könnte für jemanden in der Zukunft hilfreich sein. Eine einfache Möglichkeit, um die Aktion, die Sie wollen, ist wie folgt:

[object runAction:movePipes completion:^{ 
    [object removeFromParent]; 
}]; 
+0

Das ist ein schöner Weg, es zu tun! Vielen Dank! Ich werde mir das merken – Ziph0n

Verwandte Themen