当前位置: 首页 > 知识库问答 >
问题:

如何以一致的速度移动IOS SKSprite

丁曦
2023-03-14

在IOS SpriteKit中玩SKSprites,我基本上想让一个sprite随机移动某个方向一定距离,然后选择一个新的随机方向和距离。。非常简单,创建一个生成随机数的方法,然后创建动画,并在动画的完成块中调用相同的例程。

这确实有效,但也可以防止动画以相同的速度移动,因为动画都基于持续时间。。如果物体必须移动100,它将以1/2的速度移动,如果下一个随机命令它移动200。。。那我该怎么让它以一致的速度移动呢?

共有3个答案

虞正业
2023-03-14

作为@AndyOS答案的扩展,如果你只想沿着一个轴移动(例如X),你可以通过这样做来简化数学:

CGFloat distance = fabs(destination.x - node.position.x);

勾向文
2023-03-14

使用Swift 2. x我已经解决了这个小方法:

func getDuration(pointA:CGPoint,pointB:CGPoint,speed:CGFloat)->NSTimeInterval {
    let xDist = (pointB.x - pointA.x)
    let yDist = (pointB.y - pointA.y)
    let distance = sqrt((xDist * xDist) + (yDist * yDist));
    let duration : NSTimeInterval = NSTimeInterval(distance/speed)
    return duration
}

使用此方法,我可以使用ivar myShipSpeed并直接调用我的操作,例如:

let move = SKAction.moveTo(dest, duration: getDuration(self.myShip.position,pointB: dest,speed: myShipSpeed))
self.myShip.runAction(move,completion: {
  // move action is ended
})
涂选
2023-03-14

@诺亚·威瑟斯彭(Noah Witherspoon)的上述观点是正确的——使用毕达哥拉斯(Pythagorus)来获得平稳的速度:

//the node you want to move
SKNode *node = [self childNodeWithName:@"spaceShipNode"];

//get the distance between the destination position and the node's position
double distance = sqrt(pow((destination.x - node.position.x), 2.0) + pow((destination.y - node.position.y), 2.0));

//calculate your new duration based on the distance
float moveDuration = 0.001*distance;

//move the node
SKAction *move = [SKAction moveTo:CGPointMake(destination.x,destination.y) duration: moveDuration];
[node runAction: move];
 类似资料:
  • 我试图使一个程序,将工作和功能像简单的赛马,但我不能设置不同的速度。就我所见,当计时器取不同的值时,例如:我有两张照片,一张有40个计时器,另一张有80个计时器,它们以相同的速度移动,但一张有80个计时器的照片会变短,或者更少的时钟,而这张有40个计时器的照片会变得更平滑。

  • 感谢您抽出时间阅读此文章。现在我正在制作一个非常基本的基于瓷砖的游戏。地图是大量的16x16分幅,角色图像也是16x16分幅。我的角色有自己的类,它是sprite类的扩展,x和y位置根据平铺位置保存。 要注意,我是相当缺乏经验pyplay。 我的问题是,我计划将角色移动限制在一次一个图块,我不知道如何做到这一点,即使玩家快速按下方向键几十次,(WASD或箭头键)它也只会移动以一定的速度从瓷砖到瓷砖

  • 本文向大家介绍写一个动画,向上匀速移动100px,向下以1.5倍速度移动200px,一直反复循环相关面试题,主要包含被问及写一个动画,向上匀速移动100px,向下以1.5倍速度移动200px,一直反复循环时的应答技巧和注意事项,需要的朋友参考一下

  • 当我触摸屏幕时,身体会逐渐移动,当触摸点靠近时,身体会变慢。我的问题是我想以恒定的速度移动身体,假设给定的速度是60 kpH,身体应该以60 kpH的速度开始移动,直到接触点。我在想解决方案是在屏幕上触摸,获得角度,然后使用该角度移动身体,然后增加速度以获得正确的速度?

  • 早晨的最高峰是地球表面的人们。 问题是:如何从箭头键获得方向角。 前言:在基本的自上而下游戏中移动的标准方法是根据方向从更新方法中添加x和/或y。 这是优雅的四个方向的运动(我相信),因为无论什么组合键按下,运动的方向将是一致的。上下向左按会向左移动,因为上下抵消。但是当沿着对角线移动时,台阶会太大。如果速度为20,向左移动将每秒向左移动20,向上移动将每秒向上移动20。但向上向左移动将以每秒28

  • 问题内容: 我有一个带有onScrollStateChanged和onScroll事件侦听器的ListView。我希望能够获得ListView的滚动速度,或者以某种方式在某个事件侦听器中获得已启动滚动的finalX位置。我们的应用定位到SDK版本7。 我需要测量或获取ListView滚动的速度。 问题答案: 划分第一个可见项时差对时差不是一个好的解决方案。OnScroll侦听器每隔固定的时间周期接