精灵工具包删除特定节点

Posted

技术标签:

【中文标题】精灵工具包删除特定节点【英文标题】:sprite kit removing specific nodes 【发布时间】:2014-02-21 03:21:45 【问题描述】:

我正在尝试创建一个角色永远向右奔跑的游戏(游戏是横向的)。地上有角色可以跳过的尖刺。目前,我正在以几乎类似检查点的样式创建一组新的(并且有点随机)尖峰,一旦角色达到一定距离,就会创建下一组随机组织的尖峰,并且检查点距离被推回等等.除了尖刺,我还有一个单独但非常相似的类似检查点的系统,用于创建构成地面的瓷砖。 这是我的那部分代码,'endlessX' 和 'endlessGroundX' 是检查点值:

- (void) didSimulatePhysics 
if (player.position.x > endlessX) 
    int random = player.position.x + self.frame.size.width;
    [self createSpike:random];
    endlessX += self.frame.size.width/2.2 + arc4random_uniform(30);

if (player.position.x + self.frame.size.width > endlessGroundX) 
    [self createGround:endlessGroundX];
    endlessGroundX += tile1.frame.size.width;

    [self centerOnNode: player];
 

createSpike 和 createGround 方法的参数只是 SKSpriteNodes 的“x”值。 我目前拥有它,因为角色本身是移动的,而尖峰和瓷砖是静止的。这就是我创建角色的方式:

-(void) createPlayer 

player = [SKSpriteNode spriteNodeWithImageNamed:@"base"];
player.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
player.name = @"player";
player.zPosition = 60;
player.xScale = 0.8;
player.yScale = 0.8;
player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:player.frame.size.height/2];
player.physicsBody.mass = 1;
player.physicsBody.linearDamping = 0.0;
player.physicsBody.angularDamping = 0.0;
player.physicsBody.friction = 0.0;
player.physicsBody.restitution = 0.0;
player.physicsBody.allowsRotation = NO;
player.physicsBody.dynamic = YES;
player.physicsBody.velocity = CGVectorMake(400, 0);
player.physicsBody.categoryBitMask = playerCategory;
player.physicsBody.collisionBitMask = wallCategory;
player.physicsBody.contactTestBitMask = wallCategory | spikeCategory;
[myWorld addChild:player];
  

这样,角色将永远不会因摩擦或任何其他类似的力而失去任何动能。然后,我使用苹果在他们的冒险游戏中使用的“节点中心”方法,这样角色将始终保持在屏幕上相同的 x 位置:

- (void) centerOnNode: (SKSpriteNode *) node 
CGPoint cameraPositionInScene = [node.scene convertPoint:node.position fromNode:node.parent];
node.parent.position = CGPointMake(self.frame.size.width/5 + node.parent.position.x - cameraPositionInScene.x, node.parent.position.y);
  

我在 'didSimulatePhysics' 中调用此方法。

When I run this for some time, the programs gets slower and slower. I am guessing that that is due to the fact that I am never removing these nodes and they are always being added. However, to fix this problem, I tried doing something like this:

-(void)update:(CFTimeInterval)currentTime 
[self enumerateChildNodesWithName:@"*" usingBlock:^(SKNode *node, BOOL *stop) 
    if (node.position.x + 50 < player.position.x) 
        [node removeFromParent];
    
];  

(+50 只是为了确保节点在删除之前不在屏幕上) 但是,当我这样做时,程序并没有删除满足“if”语句的特定节点,而是删除了所有精灵节点。是否有不同的方法或我缺少的东西来解决这个问题?或者有没有其他简单的方法来删除特定节点?

【问题讨论】:

你知道如何使用调试器吗?您如何在 if 语句块中设置断点并验证值是您“期望”的值。 【参考方案1】:

缺少很多细节,例如如何为尖峰设置动画,因此很难说得太具体。不过,从您分享的内容来看,我猜您可能正在寻找类似这样的东西:

    SKAction *moveSpikeAction = [SKAction moveToX:-50 duration:5];
    SKAction *removeSpikeAction = [SKAction removeFromParent];
    SKAction *spikeSequence = [SKAction sequence:@[moveSpikeAction, removeSpikeAction]];
    [yourSpikeSpriteNode runAction:spikeSequence];

这个想法只是当尖峰动画到屏幕外位置时,您可以使用removeFromParent 操作来清除它。

【讨论】:

我刚刚编辑了我的帖子。对不起,我什至没有想过按照你刚才描述的方式去做。目前,我实际上让角色移动,而尖刺和瓷砖保持静止。有没有办法以我拥有的格式解决问题?或者删除节点上的中心方法并切换到您描述的方式会更简单吗? 我想说这在很大程度上取决于项目。如果您的游戏是在一个轴上不断移动的无尽奔跑者,那么我相信我所描述的是最简单的方法。如果您正在创建一些更复杂的东西,需要在多个方向上移动并且用户控制速度,那么您可能应该找到更好的解决方案...... 我试图让它不断地在 x 轴上,所以我会切换到那种方式!但是,您如何才能在玩家演奏时不断产生这些尖峰? 您可以设置一个计时器,以您决定的任何时间间隔添加新的峰值。

以上是关于精灵工具包删除特定节点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vbscript 删除 XML 文件中的特定节点

小项目之网络电视精灵

Kendo UI Editor - 从编辑器菜单中删除特定工具

分解精灵图像的简单工具? [关闭]

coreldraw形状工具有啥

Swift SpriteKit:翻转父精灵随机子节点水平对齐