如何用另一个替换 SpriteNode

Posted

技术标签:

【中文标题】如何用另一个替换 SpriteNode【英文标题】:How to replace a SpriteNode with another 【发布时间】:2014-02-19 21:31:51 【问题描述】:

我在做什么:

我通过一个重复的计时器每隔几秒设置一次炸弹,不断调用以下方法。

//in my init method

        SKTexture *Bomb5 = [SKTexture textureWithImageNamed:@"Bomb5.gif"];

        SKTexture *Bomb4 = [SKTexture textureWithImageNamed:@"Bomb4.gif"];

        SKTexture *Bomb3 = [SKTexture textureWithImageNamed:@"Bomb3.gif"];

        SKTexture *Bomb2 = [SKTexture textureWithImageNamed:@"Bomb2.gif"];

        SKTexture *Bomb1 = [SKTexture textureWithImageNamed:@"Bomb1.gif"];

        //SKTexture *explode = [SKTexture textureWithImageNamed:@"explosionnn.gif"];

        countdown = [SKAction animateWithTextures:@[Bomb5,Bomb4, Bomb3, Bomb2, Bomb1] timePerFrame:1];

-(void)setBomb

    SKSpriteNode *bombb;
    SKSpriteNode *explostionn;

    bombb = [SKSpriteNode spriteNodeWithImageNamed:@"Bomb5.gif"];
    explosionn = [SKSpriteNode spriteNodeWithImageNamed:@"explosionnn.gif"];

    //set bomb in random locations on screen
    NSLog(@"Placing Bomb");
    int randomYAxix = [self getRandomNumberBetween:0 to:screenRect.size.height];
    int randomXAxix = [self getRandomNumberBetween:0 to:screenRect.size.width];

    bombb.position = CGPointMake(randomYAxix, randomXAxix);
    self.explosion.position = CGPointMake(randomYAxix, randomXAxix);
    bombb.size = CGSizeMake(35, 35);
    explosionn.size = CGSizeMake(90, 90);

    SKAction *removeNode = [SKAction removeFromParent];
    //SKAction *changeHeight = [SKAction resizeToHeight:90 duration:0];
    //SKAction *changeWidth = [SKAction resizeToWidth:90 duration:0];

    SKAction *sequence = [SKAction sequence:@[countdown, removeNode]];
    [bombb runAction: sequence];
    //add code here that adds the explosion sprite once the sequence has complete
    [self addChild:bombb];



我想要什么:

在动画结束后,下一个精灵(爆炸精灵)出现在炸弹所在的位置。

问题:

我没有看到任何动作来替换精灵或帮助我正在尝试做的事情。 SKAction Class Reference 但我确实看到了这个任务 customActionWithDuration:actionBlock: 但不知道如何使用它,也无法通过搜索找到任何示例。

问题:

有人可以告诉我如何在 5 秒的炸弹精灵动画结束后使用创建此任务将我的炸弹精灵替换为我的爆炸​​精灵吗?谢谢

【问题讨论】:

【参考方案1】:

有一个 SKAction 可以将精灵的纹理设置为另一个 - 因此您甚至不必删除序列中的炸弹节点,只需替换纹理即可。您可以在完成块中使用它,该块将在您的操作完成后执行。

[bombb runAction:sequence completion:^
    [bombb runAction:[SKAction setTexture:explosionn.texture]];
];

或者,如果您希望将整个精灵放入其中:

explosionn.position = bomb.position;
[bombb runAction:sequence completion:^
    [self addChild:explosionn];
];

【讨论】:

非常感谢!这正是我所需要的。很棒的答案!【参考方案2】:

你可以试试这个:

[self runAction:sequence
     completion:^


    SKAction *replaceAction = [SKAction customActionWithDuration:1
                                                     actionBlock:^(SKNode *node, CGFloat elapsedTime) 
    
        self.explosion.position = DESIRED_POSITION;
    ];
];

【讨论】:

以上是关于如何用另一个替换 SpriteNode的主要内容,如果未能解决你的问题,请参考以下文章

如何用另一个列表元素随机替换列表元素?

如何用另一个数组值替换javascript中的数组值?

如何用另一个键替换散列键

如何用另一个字符串替换一个字符串的所有实例?

如何用一个条目替换另一个 MS Access 报告?

如何用sed中的另一个路径替换路径?