ios – 如何使用SpriteKit将精灵跳转到特定高度?

ios – 如何使用SpriteKit将精灵跳转到特定高度?,第1张

概述我正在尝试使用applyImpulse使sprite跳转到特定高度.在下面的示例代码中,动态黑色圆圈跳转到与静态红色圆圈相同的高度,但它仅适用于kludge. 如果我的物理学是正确的,那么将射d发射到高度Y所需的初始垂直动量由质量* sqrt(2 *重力* Y)给出.然而,这个公式导致黑圈移动很少. 通过反复试验,我发现通过将脉冲矢量的垂直分量乘以12.3,我可以或多或少准确地使红色圆圈跳跃,如下 我正在尝试使用applyImpulse使sprite跳转到特定高度.在下面的示例代码中,动态黑色圆圈跳转到与静态红色圆圈相同的高度,但它仅适用于kludge.

如果我的物理学是正确的,那么将射d发射到高度Y所需的初始垂直动量由质量* sqrt(2 *重力* Y)给出.然而,这个公式导致黑圈移动很少.

通过反复试验,我发现通过将脉冲矢量的垂直分量乘以12.3,我可以或多或少准确地使红色圆圈跳跃,如下面的代码所示.

这似乎是完全随意的,让我发疯.我显然做错了什么.这样做的正确方法是什么?

以下是我认为相关的代码:

let dy = mass * sqrt(     2 * -self.physicsWorld.gravity.dy     * (fixedCircle.position.y-jumPingCircle.position.y))     * 12.3jumPingCircle.physicsBody?.applyImpulse(CGVectorMake(0,CGfloat(dy)))

如果您希望复制和粘贴,这里是完整的GameScene.swift类…

import SpriteKitclass 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)))     }     } }
解决方法 弄清楚了.

SpriteKit显然没有未记录的像素到“米”比率为150.

我发现这一点,当我意识到质量SpriteKit自动计算我的圈子不是50 * pi * r ^ 2应该是.我从质量向后工作来计算SpriteKit正在使用的半径,它是7500,恰好是50 * 150.

和12.3?它恰好是(大约)150的平方根.

因此,要使这些物理模拟工作,您必须考虑这个比例.我称之为“像素到单位”(PTU),因为尽管Apple坚持认为SpriteKit使用SI单位,但它与米无关.但由于它没有文档,似乎有可能改变,所以我使用以下代码行开始我的模拟以确定真正的PTU:

let ptu = 1.0 / sqrt(SKPhysicsBody(rectangleOfSize: CGSize(wIDth:1,height:1)).mass)

这是一项昂贵的 *** 作,因此只应调用一次.我在设置初始场景时调用它.

我的冲动计算现在如下:

let dy = mass * sqrt(2     * -self.physicsWorld.gravity.dy     * (fixedCircle.position.y-jumPingCircle.position.y     * ptu))

现在,黑色圆圈跳跃到与红色圆圈完美对齐,我可以在晚上回去睡觉.

总结

以上是内存溢出为你收集整理的ios – 如何使用SpriteKit将精灵跳转到特定高度?全部内容,希望文章能够帮你解决ios – 如何使用SpriteKit将精灵跳转到特定高度?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1107615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存