Sprite kit 使用SpriteKit如何以随机但一致的速度将sprite节点移动到某个点

Sprite kit 使用SpriteKit如何以随机但一致的速度将sprite节点移动到某个点,sprite-kit,Sprite Kit,我目前正在制作我的第一个精灵游戏,我在游戏中实现的一个功能是从侧面进入对象,在屏幕上移动,然后从父对象中移除。这是它的样子 MyScene.m -(void)createObstacle0 { CGPoint startPoint = CGPointMake(-20, 100); SKSpriteNode *obstacle = [SKSpriteNode spriteNodeWithImageNamed:@"obstacle"]; obstacle.position =

我目前正在制作我的第一个精灵游戏,我在游戏中实现的一个功能是从侧面进入对象,在屏幕上移动,然后从父对象中移除。这是它的样子

MyScene.m

-(void)createObstacle0 {
    CGPoint startPoint = CGPointMake(-20, 100);
    SKSpriteNode *obstacle = [SKSpriteNode spriteNodeWithImageNamed:@"obstacle"];
    obstacle.position = CGPointMake(startPoint.x, startPoint.y);
    obstacle.name = @"obstacle0";
    [self addChild:obstacle];

    float randomNum = arc4random_uniform(2) + 1.92;
    [self performSelector:@selector(createObstacle0) withObject:nil   afterDelay:randomNum];
}
更新方法摘录

[self enumerateChildNodesWithName:@"obstacle0" usingBlock:^(SKNode *node, BOOL *stop)     {
        if (node.position.x > 360) {
            [node removeFromParent];
        } else {
            node.position = CGPointMake(node.position.x + 5.2, node.position.y);
        }

    }];
目前,我的对象仅以一种速度在屏幕上移动。我试着在currentTime方法代码中使用arc4random,但因为它是每帧计算的,所以我的对象不会保持一个速度。它会加速、减速,而且看起来非常不稳定。我如何在CurrentTime中更改代码,以允许我穿过屏幕的对象在生成后立即设置一个随机速度,并一直保持到它被销毁

第二个问题:

int yMin = 90;
int yMax = 110;
CGPoint startPoint = CGPointMake(-20, yMin + arc4random_uniform(yMax - yMin));

我建议您不要手动更新子节点的位置以将其从一侧移动到另一侧,而是创建障碍物,然后使用使用moveTo:duration:方法创建的SKAction对其调用runAction:。您可以指定障碍物的终点以及移动所需的时间。传入一个随机数,其中包含您希望它持续的最短和最长时间

这将允许您创建一致但随机的对象移动

int MAX_TIME = 20;
int MIN_TIME = 10;
[obstacle runAction:[SKAction moveTo:CGPointMake( 10, 100 ) duration:MIN_TIME + arc4random_uniform( MAX_TIME - MIN_TIME )]];

谢谢,这正是我需要的。还有一件事。如果我希望对象在Y轴上出现的位置有一点偏差,我如何使用arc4random来实现这一点。我在我的主要帖子底部添加了我已经添加的内容。假设你只是指最初的职位。您可以使用与我们设置持续时间类似的方法,但可以使用arc4random生成CGPointMake(10,MIN_Y+arc4random_uniform(MAX_Y-MIN_Y)),以便在将节点位置添加到场景中时将其指定给节点位置。为了清除某些内容,arc4random(20-10)会选择0到9或1到10之间的数字。此外,我还编辑了我的主代码,向您展示了我所做的事情。你说这只会改变起始位置?对我来说,看起来物体只是上升了一点点,但这可能只是一种错觉。再看一眼,我很确定他们在上升,如果他们从yMin开始。好的,我刚刚找到了我最后一个问题的答案。我将动作从CGPointMake(360110)更新为CGPointMake(360,startPoint.y)。谢谢你的帮助,我会确保从现在起我会单独提问。顺便说一句,用其他不相关的问题更新你的问题可能不是一个好的做法。一般来说,你应该发布一个单独的问题。这将帮助人们寻找与你相同的答案,更容易找到解决方案。