在一段时间内手动移动节点

我目前声明了以下函数,它们将一个节点移动到一个目标位置,该位置在场景的更新函数中调用(在这种情况下,我不能使用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 – angle。 角度变量是一个仅影响资产轮换的值,但我的资产是“静态的”并且没有多个位置 – 只有1。

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

(你可以在这里看到Apple的例子: https : //developer.apple.com/library/prerelease/ios/samplecode/Adventure-Swift/Listings/Swift_Adventure_Adventure_Shared_Sprites_Character_swift.html )

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

你是正确的,不要在这样的场景中使用SKActions 。 我看到你试图在不使用SKActions情况下将node移动到某个位置。 我真的不明白你发布的代码所遇到的问题。 但是,我编写了一个小示例项目,演示如何在没有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, withEvent event: UIEvent) { let touch = touches.first as! UITouch let location = touch.locationInNode(self) travelPoint = location } override func touchesMoved(touches: Set, 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) } } 

在此处输入图像描述

Interesting Posts