0

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

这是代码。我基本上是在使用一个动作来为屏幕上的精灵设置动画(在 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 中的正常行为吗?

非常感谢

4

2 回答 2

1

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

使用以下代码

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

在你打电话的同一个地方

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

另外,请看一下这个答案

于 2014-06-22T12:10:47.333 回答
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;
             }
        }];
于 2014-06-25T08:22:54.510 回答