使用SpriteKit如何将精灵节点移动到具有随机但一致的速度的点

时间:2014-02-13 23:23:09

标签: sprite-kit

我正在制作我的第一个精灵游戏,我在游戏中实现的一件事就是从侧面进入的物体,一直在屏幕上移动,然后从父母移除。这就是看起来的样子。

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));

1 个答案:

答案 0 :(得分:1)

我建议不要手动更新子节点位置以将其从一侧移动到另一侧,而是创建障碍,然后使用使用moveTo:duration:方法创建的SKAction调用runAction:on。您可以指定希望障碍物结束的最终点以及您希望此动作需要多长时间。传递一个随机数,并在最短和最长时间内传递持续时间。

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

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