【问题标题】:Trying to remove a sprite during intersection of the object and character in sprite kit试图在精灵套件中的对象和角色相交期间移除精灵
【发布时间】:2013-12-21 18:04:24
【问题描述】:

下午好,使用 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]];

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

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

    isDamaged = YES;

    hitCount ++;

}

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

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

}

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

【问题讨论】:

    标签: objective-c ios7 int sprite-kit sknode


    【解决方案1】:

    有几件事...

    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));
    }
    

    【讨论】:

    • 嗯,所以在数组中设置 healthContainers?我对这一切仍然很陌生,但我猜我可以在开头调用的 initWithSize 方法中创建一个 SKSpriteNode 数组或其他数组。我会尝试的,谢谢!
    • @stickynugz 查看NSMutableArray 以保存Objective-C 对象的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多