我正在尝试使用applyImpulse使精灵跳到特定高度。在下面的示例代码中,动态黑色圆圈跳到与静态红色圆圈相同的高度,但只能通过巧妙的方法实现。
如果我的物理学正确,将一个抛射物发射到高度Y所需的初始竖直动量由mass * sqrt(2 * gravity * Y)给出。然而,这个公式导致黑色圆圈几乎没有移动。
经过反复试验,我发现可以通过将冲量向量的竖直分量乘以12.3来使红色圆圈跳得更加准确,如下面的代码所示。
这似乎完全是任意的,让我抓狂了。显然,我做错了什么。有什么正确的方法吗?
以下是我认为相关的代码:
以下是GameScene.swift类的全部内容,如果您想复制和粘贴...
如果我的物理学正确,将一个抛射物发射到高度Y所需的初始竖直动量由mass * sqrt(2 * gravity * Y)给出。然而,这个公式导致黑色圆圈几乎没有移动。
经过反复试验,我发现可以通过将冲量向量的竖直分量乘以12.3来使红色圆圈跳得更加准确,如下面的代码所示。
这似乎完全是任意的,让我抓狂了。显然,我做错了什么。有什么正确的方法吗?
以下是我认为相关的代码:
let dy = mass * sqrt(
2 * -self.physicsWorld.gravity.dy
* (fixedCircle.position.y-jumpingCircle.position.y))
* 12.3
jumpingCircle.physicsBody?.applyImpulse(CGVectorMake(0, CGFloat(dy)))
以下是GameScene.swift类的全部内容,如果您想复制和粘贴...
import SpriteKit
class GameScene: SKScene {
var jumpingCircle = SKShapeNode()
var fixedCircle = SKShapeNode()
override func didMoveToView(view: SKView) {
self.scaleMode = .AspectFit
// Create an exterior physical boundary
self.physicsBody = SKPhysicsBody(edgeLoopFromRect:self.frame)
self.physicsWorld.gravity = CGVectorMake(0, -5);
// Create the jumping circle
jumpingCircle = SKShapeNode(circleOfRadius: 50)
jumpingCircle.position = CGPoint(x: 100,y: 0)
jumpingCircle.strokeColor = .blackColor()
jumpingCircle.physicsBody = SKPhysicsBody(circleOfRadius: 50)
jumpingCircle.physicsBody?.linearDamping = 0.0
self.addChild(jumpingCircle)
// Create the fixed circle
fixedCircle = SKShapeNode(circleOfRadius: 50)
fixedCircle.position = CGPoint(x: 100,y: 384)
fixedCircle.strokeColor = .redColor()
self.addChild(fixedCircle)
}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
// to reach certain height, initial y velocity should by sqrt(2 * gravity * Y)
// momentum required to reach this velocity is mass * velocity
// therefore, vertical impulse should be given by mass * sqrt(2 * gravity * Y)
if let mass = jumpingCircle.physicsBody?.mass{
// calculate vertical impulse
// this formula "should work" but does not
// let dy = mass * sqrt(2 * -self.physicsWorld.gravity.dy * (fixedCircle.position.y-jumpingCircle.position.y))
// this formula "works", but has the arbitrary multiplier
let dy = mass * sqrt(2 * -self.physicsWorld.gravity.dy * (fixedCircle.position.y-jumpingCircle.position.y)) * 12.3
// apply the Impulse
jumpingCircle.physicsBody?.applyImpulse(CGVectorMake(0, CGFloat(dy)))
}
}
}