【问题标题】:Manually move node over a period of time在一段时间内手动移动节点
【发布时间】:2015-05-21 00:28:33
【问题描述】:

我目前声明了以下函数,这些函数将节点移动到在场景的更新函数中调用的目标位置(在这种情况下,我不能使用 SKAction.moveTo)

func moveTowardsPosition(targetPosition: CGPoint, withTimeInterval timeInterval: NSTimeInterval) {
    let currentPosition = self.position
    var deltaX = targetPosition.x - currentPosition.x
    var deltaY = targetPosition.y - currentPosition.y
    var maximumDistance = 3 * CGFloat(timeInterval)
    moveFromCurrentPosition(currentPosition, byDeltaX: deltaX, deltaY: deltaY, maximumDistance: maximumDistance)
}

func moveFromCurrentPosition(currentPosition: CGPoint, byDeltaX dx: CGFloat, deltaY dy: CGFloat, maximumDistance: CGFloat) {
    let targetPosition = CGPointMake(currentPosition.x + dx, currentPosition.y + dy)
    var distRemaining = hypot(dx, dy)
    if distRemaining < maximumDistance {
        position = targetPosition
    } else {
        let x = currentPosition.x * maximumDistance
        let y = currentPosition.y * maximumDistance
        position = CGPointMake(x, y)
    }
}

(这些都是从苹果的“冒险”游戏中稍微修改的)

我的问题是 moveCurrentPosition 函数中的这些行。

let x = currentPosition.x * maximumDistance
let y = currentPosition.y * maximumDistance
position = CGPointMake(x, y)

基本上,我不知道将 x 和 y 设置为什么值,以便该位置代表正确的位置。 在 Apple 的示例中,他们将其乘以 maximumDistance - 角度。角度 var 是一个仅影响资产旋转的值,但是我的资产是“静态的”并且没有多个位置——只有 1 个。

考虑到这一点,我会将 xy 设置为什么,以便它们代表正确的位置?

(您可以在此处查看 Apple 的示例:https://developer.apple.com/library/prerelease/ios/samplecode/Adventure-Swift/Listings/Swift_Adventure_Adventure_Shared_Sprites_Character_swift.html

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    我目前声明了以下移动节点的函数 到在更新函数中调用的目标位置 场景(在这种情况下,我不能使用 SKAction.moveTo)

    在这种情况下不要使用SKActions 是正确的。我看到您正在尝试将node 移动到不使用SKActions 的位置。我不太了解您发布的代码所遇到的问题。但是,我编写了一个小型示例项目,演示了将节点移动到更新函数中没有SKActions 的位置。在这个示例项目中,我有一个移动到当前触摸位置的精灵。您可以设置节点行进的速度以及应用速度的速率。您可以尝试调整速率以获得正确的游戏感觉。当节点到达目标位置时,您还需要处理这种情况(同样,这取决于您的游戏)。

    让我知道这是否有帮助和/或如果您有任何问题。

    import SpriteKit
    class GameScene: SKScene {
        var sprite: SKSpriteNode!
        var travelPoint: CGPoint = CGPoint() //The point to travel to.
        let travelSpeed = CGVector(dx: 200, dy: 200) //The speed at which to travel.
        let rate:CGFloat = 0.1 //1.0 Completely responsive. 0.0 Completely unresponsive. I set this value to < 1 to smooth the application of motion.
        override func didMoveToView(view: SKView) {
            self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
            sprite = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 50, height: 50))
            sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
            sprite.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0)
            sprite.physicsBody?.affectedByGravity = false
            self.addChild(sprite)
        }
        override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
            let touch = touches.first as! UITouch
            let location = touch.locationInNode(self)
                travelPoint = location
        }
        override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
            let touch = touches.first as! UITouch
            let location = touch.locationInNode(self)
            travelPoint = location
        }
        override func update(currentTime: CFTimeInterval) {
            let disp = CGVector(dx: travelPoint.x-sprite.position.x, dy: travelPoint.y-sprite.position.y)
            let angle = atan2(disp.dy, disp.dx)
            let vel = CGVector(dx: cos(angle)*travelSpeed.dx, dy: sin(angle)*travelSpeed.dy)
            let relVel = CGVector(dx: vel.dx-sprite.physicsBody!.velocity.dx, dy: vel.dy-sprite.physicsBody!.velocity.dy)
            sprite.physicsBody!.velocity = CGVector(dx: sprite.physicsBody!.velocity.dx+relVel.dx*rate, dy: sprite.physicsBody!.velocity.dy+relVel.dy*rate)
        }
    }
    

    【讨论】:

    • 这正是我所追求的,但我担心物理体可能会干扰我子类中的物理体。在我的子类“玩家”中,我添加了大约 6-7 个单独的精灵,所有这些精灵都有单独的物理体。我第一次实现这个方法导致了非常错误的结果,但是我会再试一次。
    • 在对我的架构进行了大量的摆弄之后,我想我设法让它工作了。非常感谢,我这辈子都想不通!
    • @Aaron 太棒了,很高兴听到你的东西正常工作。祝你好运。
    • 您对将相机置于节点中心有什么建议吗? Apple 文档建议基本上让节点完全静止,并且只是移动世界以产生运动的错觉,但是在这种情况下(节点不能是静态的)我必须找到另一种方法来使节点居中。跨度>
    • @Aaron 你不应该让节点静态。您可以移动(即定位)世界,使其保持以您的移动节点为中心。如果您需要这方面的帮助,也许您应该发布另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多