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

Posted

技术标签:

【中文标题】使用 SpriteKit 如何以随机但一致的速度将精灵节点移动到一个点【英文标题】:Using SpriteKit how can you move sprite nodes to a point with a random but consistent speed 【发布时间】:2014-02-13 23:23:08 【问题描述】:

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

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】:

我建议不要手动更新子节点位置以将其从一侧移动到另一侧,而是创建障碍物,然后使用使用 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(360,110) 更新为 CGPointMake(360,startPoint.y)。感谢您的帮助,我会确保从现在开始单独提问。

以上是关于使用 SpriteKit 如何以随机但一致的速度将精灵节点移动到一个点的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 SpriteKit 中的碰撞

SpriteKit 中的速度场

SpriteKit - 生成随机节点

如何将 SpriteKit 节点移动为汽车驾驶体验?

如何以编程方式截屏(Swift、SpriteKit)

Swift/SpriteKit - ApplyImpluse 的速度是不是以增量方式工作(每次都添加到先前的值)?