如何抛出SKSpriteNode?

所以基本上在我的游戏中我需要抛掷或抛出一个对象。 到目前为止,我有一个精灵,它可以拖动,但不能被抛出。 游戏的想法是抛出一个精灵与另一个精灵发生冲突。 我想要我们将调用testNode的精灵,移动用户抛出它的地方

这意味着,当我释放精灵时,我希望它继续沿着我移动的方向前进。 我花了很多年努力工作,但我不能。 我正在使用SpriteKit for iOS 8+。 如果有人可以帮忙,请做。

这是一个我看到的video,但它是与GameSalad这是另一回事。 你可以看看

(如果您需要进一步的联系,请回复)

import Foundation; import SpriteKit; class Level:SKScene { TestNode:Test? //Test is a class I made //Removed the update and touches began due to it being irrelevant to what I need help with. override func didMoveToView(view: SKView){ testNode = Fruit(imageNamed: "apple_idle") testNode?.position = CGPointMake(60, 294) testNode?.xScale = 0.5 testNode?.yScale = 0.5 self.addChild(testNode!) } override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { var nodeTouched = SKNode() var currentNodeTouched = SKNode() for touch: AnyObject in touches { let location = touch.locationInNode(self) nodeTouched = self.nodeAtPoint(location) testNode?.position = location } } override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { var touch: UITouch = touches.anyObject() as UITouch var location: CGPoint = touch.locationInNode(self) as CGPoint } 

下面是一个简单的例子,我通过模拟游戏循环中的速度来移动一个精灵,而不是直接设置位置。 这使得精灵更加dynamic化(即,您可以“抛出”它,让它与其他物理体相互作用,如拖动精灵)。 没有angular度计算是必要的,我只是计算必要的速度移动精灵到触摸位置在一段时间。 在这种情况下,我将时间设置为1/60,以便瞬间施加运动,使物体显得非常灵敏。

 import SpriteKit class GameScene: SKScene { var sprite: SKSpriteNode! var touchPoint: CGPoint = CGPoint() var touching: Bool = false 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) self.addChild(sprite) } override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { let touch = touches.first as! UITouch let location = touch.locationInNode(self) if sprite.frame.contains(location) { touchPoint = location touching = true } } override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { let touch = touches.first as! UITouch let location = touch.locationInNode(self) touchPoint = location } override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { touching = false } override func update(currentTime: CFTimeInterval) { if touching { let dt:CGFloat = 1.0/60.0 let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y) let velocity = CGVector(dx: distance.dx/dt, dy: distance.dy/dt) sprite.physicsBody!.velocity=velocity } } } 

在这里输入图像描述

您可以自行调整phyiscs计算以获得所需的效果。 但是这个代码应该足以让你开始。 我能想到的一些增强function可能会限制速度,使得物体在释放时不能移动得太快。 在触摸拖动中添加一个延迟,以便移动精灵但是在最后不小心停下来继续抛出物体。

如果你拖动精灵,那么这不应该太难。 听起来像你需要添加一些物理到你的游戏。

在设置yScale后,将其添加到testNode

 testNode.physicsBody = SKPhysicsBody(rectangleOfSize: testNode.size) 

现在运行游戏。 你应该看到testNode放在屏幕的底部。 你不希望发生这种情况,所以我们将屏幕边界作为一个物理机构。

把这个添加到didMoveToView的顶部

 self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 

这将使屏幕的边缘包含您的testNode。 你应该能够拿起它现在放下

你可能不得不调整这个公式有点真正抛出精灵。

你可能不得不比较你最近的触摸位置和你当前的触摸位置,得到它们之间的angular度,并向精灵施加一个冲动。