我目前正在第一次尝试使用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中的正常行为吗?
非常感谢
答案 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;
}
}];