在 SKAction 完成后重新定位精灵节点

Posted

技术标签:

【中文标题】在 SKAction 完成后重新定位精灵节点【英文标题】:Reposition sprite nodes after SKAction is completed 【发布时间】:2014-06-27 14:11:24 【问题描述】:

我正在尝试在 SKAction moveTo 动作完成后重新定位我的精灵。我已将敌人编程为从 (self.frame.size.width/2, 0) 进入屏幕。它们仅在 y 轴上移动。当它们的 y 位置大于 (self.frame.size.height) 时,我想将它们重新定位到初始位置,并以相同的方式一次又一次地移动它们,直到玩家杀死所有敌人。我在这一点上苦苦挣扎。我应该添加哪一部分代码?有任何想法吗?这段代码可能会帮助你理解我的实现:

-(void) addEnemies 

for (int j = 0; j < 6; j++) 

   SKSpriteNode* enemy = [SKSpriteNode spriteNodeWithImageNamed:@"player"];
    enemy.position = CGPointMake(((self.frame.size.width) -20) - j * (enemy.frame.size.width) , 0);


    CGPoint realDest = CGPointMake((enemy.position.x), (self.frame.size.height));
    float velocity = 50/1.0;
    float realMoveDuration = self.size.height / velocity;
    SKAction * actionMove = [SKAction moveTo:realDest duration:realMoveDuration];
    [enemy runAction:actionMove];

    [self addChild:enemy];



【问题讨论】:

【参考方案1】:
-(void)addEnemies
    for (int j = 0; j < 6; j++) 

        SKSpriteNode* enemy = [SKSpriteNode spriteNodeWithImageNamed:@"player"];
        enemy.position = CGPointMake(((self.frame.size.width) -20) - j * (enemy.frame.size.width) , 0);

        [self addChild:enemy];
        [self moveEnemyNode:enemy];
    

-(void)moveEnemyNode:(SKSpriteNode *)enemy
    enemy.position = CGPointMake(enemy.position.x, 0);
    float velocity = 50/1.0;
    float realMoveDuration = self.size.height / velocity;
    SKAction *actionMove = [SKAction moveToY:self.frame.size.height + enemy.frame.size.height duration:realMoveDuration];
    [self runAction:actionMove completion:^
        [self moveEnemyNode:enemy];
    ];

【讨论】:

我试过了,但它不起作用......敌人甚至没有出现在屏幕上。 对不起!它是 [enemy runAction:actionMove 完成:^ [self moveEnemyNode:enemy]; ]; 刚刚测试并按预期工作。如果您错过任何敌人,请仔细检查您的坐标 是的,我错过了 5 个敌人。现在 1 个敌人出现在屏幕上。正如你所说,我会检查坐标!谢谢!【参考方案2】:
    创建一个复制屋顶的 SKSpriteNode -> Rectangle(self.frame.size.width,1) 让它沿着屏幕的顶部边缘放置一个非动态物理体 设置“屋顶”与敌人相互接触 在联系人上调用一个方法来重置位置并调用 SKaction

这使您可以直接在每个敌人击中屏幕顶部时直接访问它。

这是一个如何创建屋顶并让敌人与之互动的示例。 https://***.com/a/24195006/2494064

【讨论】:

如有进一步的疑问,请随时发表评论。链接的代码经过测试,已帮助许多处于类似情况的用户。 这看起来很有希望。我会检查出来的!谢谢你的回答:-)

以上是关于在 SKAction 完成后重新定位精灵节点的主要内容,如果未能解决你的问题,请参考以下文章

按顺序运行已完成的 SKAction

多个 SKSpriteNode 的 SpriteKit 多个 SKActions - 等待全部完成

sprite kit:如何根据距离改变 skaction 持续时间?

使用带有完成处理程序的循环在多个节点上执行单个 SKAction 动画

如何使用 selenium 重新加载 html DOM,以便新命令能够定位新节点?

SpriteKit - 在 SKAction 期间精灵的正确位置