-1

下午好,使用 Xcode / Spritekit / OSX 10.9.1

在我试图扩展的教程中,我设置了 3 种方法来召唤心灵。心在现场显示如下:

-(SKSpriteNode*) healthContainer1 {

    SKSpriteNode *heart1 = [SKSpriteNode spriteNodeWithImageNamed:@"heartfull"];
    heart1.name = @"healthContainer1";
    heart1.position = CGPointMake(CGRectGetMinX(self.frame) + 25, CGRectGetMaxY(self.frame) - 30);

    return heart1;

    if (hitCount == 3) {

        [self removeFromParent];

    }

}

-(SKSpriteNode*) healthContainer2 {

    SKSpriteNode *heart2 = [SKSpriteNode spriteNodeWithImageNamed:@"heartfull"];
    heart2.name = @"healthContainer2";
    heart2.position = CGPointMake(CGRectGetMinX(self.frame) + 50, CGRectGetMaxY(self.frame) - 30);

    return heart2;

    if (hitCount == 2) {

        [self removeFromParent];
    }

}

-(SKSpriteNode*) healthContainer3 {

   SKSpriteNode *heart3 = [SKSpriteNode spriteNodeWithImageNamed:@"heartfull"];
   heart3.name = @"healthContainer3";
   heart3.position = CGPointMake(CGRectGetMinX(self.frame) + 75, CGRectGetMaxY(self.frame) - 30);

   return heart3;

   if (hitCount == 1) {

       [self removeFromParent];

   }

}

心脏容器在initWithSize:方法中被调用

[self addChild:[self heartContainer1]];
[self addChild:[self heartContainer2]];
[self addChild:[self heartContainer3]];

MyhitCount是在头文件中设置的 int,我使用以下方法以及更新方法的第二个发布部分来检测损坏。我试图在heartContainer基于hitCountint 造成损坏时自行移除。

-(void) doDamage:(SKSpriteNode*)character {

    isDamaged = YES;

    hitCount ++;

}

if ( [character intersectsNode:node] && isDamaged == NO) {

    [self doDamage:character];
    NSLog(@"Intersection occured");

}

抱歉,如果是多个heartContainer方法上显示的多余代码,我只是想我可以检查heartContainer方法本身中的 int ,然后在满足条件时将其删除。我还尝试在调用它们后立即将 if 语句放入initWithSize:方法中,但这也不起作用。

4

1 回答 1

2

有几件事...

1)下面的代码永远不会被执行,因为它遵循一个return总是被执行的语句:

if (hitCount == 1) {
    [self removeFromParent];
}

其他两种方法中的等效代码也是如此……您也可以删除这个死代码。

2)您可能需要考虑使用hidden节点的属性来显示/隐藏它们,而不是实际添加和从场景中删除它们。使用此属性的优点是您可以将该hidden属性设置为NO两次,并且节点将保持隐藏状态。如果您removeFromParent在一个节点上调用两次,您的应用程序将崩溃。

3) 要回答您的问题,一种方法是修改doDamage:方法,使其显示/隐藏正确数量的健康容器。为此,您需要一种引用健康容器的方法,方法是保留对它们的引用或使用name属性。我通常会按照以下方式做一些事情:

- (void)doDamage:(SKSpriteNode*)character {
    isDamaged = YES;
    hitCount++;
    [self syncHealthContainers];
}

- (void)syncHealthContainers {
    for(int i = 0; i < [healthContainers count]; ++i)
        healthContainers[i].hidden >= (hitCount > ([healthContainers count] - i));
}
于 2013-12-21T23:53:53.883 回答