以一定速度在屏幕上移动对象。(Sprite Kit)

Posted

技术标签:

【中文标题】以一定速度在屏幕上移动对象。(Sprite Kit)【英文标题】:Moving an object across the screen at a certain speed.(Sprite Kit) 【发布时间】:2016-07-31 05:59:09 【问题描述】:

我有一个对象需要在屏幕上上下移动。当您第一次单击时,它会向下移动屏幕到持续时间为 3 秒的端点。您可以随时单击以阻止其向下移动并使其开始向上移动到不同的端点,再次持续 3 秒。这样做的问题是,如果您单击以将对象向下移动,然后立即再次单击以将其向上移动,则对象向上移动但速度非常慢,因为它的持续时间为 3 秒。 (我希望这是有道理的)所以我想要的是停止使用持续时间来设置对象移动的速度/速度。有没有办法说以空白速度移动到 x.y 点?谢谢你。 (无论对象在哪里并且必须移动到哪里,我都希望它始终以相同的速度移动。)

这是我现在用来移动对象的方法:

func moveObject()
    let endpoint = CGPoint(x: self.size.width / 2 , y: self.size.height / 1.8888888888 )
    let moveObject = SKAction.moveTo(endpoint, duration: 3.0 )
    let moveObjectSequence = SKAction.sequence([moveLine])
    Object.runAction(moveLineSequence)

更正后的代码:

func dropLine()
    if hookNumber == 1
        let endpoint = CGPoint(x: self.size.width / 2 , y: self.size.height / 1.8888888888 )
        let moveLine = SKAction.moveTo(endpoint, duration: getDuration(fishLine.position,pointB:endpoint,speed:300.0))
        let moveLineSequence = SKAction.sequence([moveLine])
        fishLine.runAction(moveLineSequence)
    


func dropHook()
    if hookNumber == 1
        let endpoint = CGPoint(x: self.size.width / 2 , y: self.size.height - 2030)
        let moveLine = SKAction.moveTo(endpoint, duration: getDuration(fishHook.position,pointB:endpoint,speed:300.0))
        let moveLineSequence = SKAction.sequence([moveLine])
        fishHook.runAction(moveLineSequence)
            hookNumber = 2
    


func raiseLine()
    if hookNumber == 2
        let endpoint = CGPoint(x: self.size.width / 2 , y: 3050 )
        let moveLine = SKAction.moveTo(endpoint, duration: getDuration(fishLine.position,pointB:endpoint,speed:300.0))
        let moveLineSequence = SKAction.sequence([moveLine])
        fishLine.runAction(moveLineSequence)
    


func raiseHook()
    if hookNumber == 2
        let endpoint = CGPoint(x: self.size.width / 2 , y: self.size.height - 3 )
        let moveLine = SKAction.moveTo(endpoint, duration: getDuration(fishHook.position,pointB:endpoint,speed:300.0))
        let moveLineSequence = SKAction.sequence([moveLine])
        fishHook.runAction(moveLineSequence)
    

【问题讨论】:

【参考方案1】:

我认为您可以根据计算速度修改您的方法。 所以,如果你知道你的速度,你就可以计算出一个节点到达一个点需要多少时间,并将你的速度更改为一个合理的值。

// #-#-#-#-#-#-#-#-#-#-#-#-#-#-#
//MARK: - Calculate action duration btw two points and speed
// #-#-#-#-#-#-#-#-#-#-#-#-#-#-#
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

假设你的节点速度为 150.0

你的动作将是:

let moveObject = SKAction.moveTo(endpoint, duration: getDuration(node.position,pointB:endpoint,speed:150.0))

使用这种方法,您的速度不会改变,也不会出现这种令人讨厌的缓慢。

附:不要忘记将大写更改为您的属性:在 swift 中是一种不好的态度,使用对象而不是对象。

【讨论】:

@AlessandroOmano 我这样做了,它解决了我的问题。谢谢。但它造成了一个奇怪的故障。故障很难解释,所以我将链接附加到显示故障发生的视频。我还将包括必要的代码。这是故障发生视频的链接:youtube.com/watch?v=jHE5RC-mvwU 故障之前没有发生。你知道它为什么会发生吗?如果是这样,我需要做什么来阻止它?我还将新代码添加到原始帖子中。 我看过视频和你的代码。当我使用像你这样的巨大价值时,我有这种经验。如果你现在例如你的 top 等于 self.frame.height-20,隐藏球尝试使用一个等于 self.frame.height+40 的端点,不要使用巨大的值,因为你可能有视频的典型故障类型,同样适用于底部 好的。当您说“巨大的价值”时,您是指端点。如果是这样,我将端点更改为 self.frame.height+40 并且故障仍然发生。 哦,是的,你有理由,但我现在在你的代码中看到了另一件事......为什么当你开始另一个 moveTo 时你不停止你的行动:这是导致这个故障的另一件事,最好的方法是给你的动作一个 withKey,检查它是否正在运行 .actionForKeyIsRunning("moveToUpThisBall") 并用 removeActionForKey 停止它 我的意思是:每次你有一个 runAction 时,使用 withKey 来引用你的 action ;) 让我知道你的进度

以上是关于以一定速度在屏幕上移动对象。(Sprite Kit)的主要内容,如果未能解决你的问题,请参考以下文章

以一定速度在屏幕上随机移动物体

iOS 7 Sprite Kit 动画速度变化

Sprite-Kit:节点不会向左移动

Sprite-Kit:节点不会向左移动

Sprite-Kit:移动SKSpriteNode

使用 Sprite Kit 移动背景