精灵一旦通过屏幕高度就会被自己移除

时间:2014-06-22 12:02:39

标签: ios sprite-kit skaction

我目前正在第一次尝试使用SpriteKit并使用某些操作。我的印象是你创建的每个节点/精灵都需要删除它,但出于某种原因,一旦它们通过屏幕高度,它们就被它们自己移除。这是SpriteKit中的正常行为吗?

这是代码。 我基本上使用一个动作在屏幕上设置一个sprite动画(从protrait模式的底部到顶部),有趣的是,无论我创建了多少精灵,节点数都保持为0,它实际上只计算它们但是它一旦它们通过屏幕高度就会减去它们。

-(void) shoot
{
    bullet = [SKSpriteNode spriteNodeWithImageNamed:@"bullet"];
    bullet.position =  CGPointMake(airPlane.position.x, airPlane.position.y + 50);
    [self addChild:bullet];

    SKAction *moveBullet = [SKAction moveTo:CGPointMake(airPlane.position.x, self.size.height + 20) duration:0.5];

    [bullet runAction:moveBullet];
}

如果我将动作更改为精灵未超过屏幕高度的位置,则节点计数会保持计数。

更改此行...

SKAction *moveBullet = [SKAction moveTo:CGPointMake(airPlane.position.x, self.size.height + 20) duration:0.5];

...到此

SKAction *moveBullet = [SKAction moveTo:CGPointMake(airPlane.position.x, self.size.height) duration:0.5];

再次这是SpriteKit中的正常行为吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

右下角显示的节点计数仅表示正在屏幕上呈现的节点。它们不是场景中总节点的指示。

使用以下代码

[skView setValue:@(YES) forKey:@"_showsCulledNodesInNodeCount"];

在你打电话的地方

skView.showsFPS = YES;
skView.showsNodeCount = YES;

另外,请查看此answer

答案 1 :(得分:1)

可能是内存泄漏,因为sprite kit在内存中保存纹理以供进一步使用,以便在屏幕传出屏幕并将其手动设置为nil时将其从屏幕上移除

例如

 [self enumerateChildNodesWithName:name usingBlock:^(SKNode *node, BOOL *stop) {

            if(node.x>900)
            {
                //remove all the action
               [node removeAllActions];
                //remove node from parent
               [node removeFromParent];
                //set nil//not required set automatically to nil when node is remove from parent 
               node=nil;
             }
        }];