swift - 如何在保持重力的同时保持我的 spritekit 节点中的能量恒定
问题描述
我有一个项目,一个球在两座小山之间滚动,我希望它永远滚动。山丘是使用样条点制作的(有 3 个点,在 (0,300)、(375,0) 和 (750,300) 处)。我已经确保球和地面的摩擦力和恢复力设置为 0,但它仍然来回滚动,上山的次数比上次少。
这是山丘和球的样子: 图片
编辑:我被要求添加一些代码,所以这是我的 GameScene.swift 文件:
import SpriteKit
import GameplayKit
class GameScene: SKScene {
var ball = SKShapeNode()
func createView(){
removeAllActions()
removeAllChildren()
ball = SKShapeNode(circleOfRadius: 20)
ball.position = CGPoint(x:0, y:350)
ball.physicsBody = SKPhysicsBody(circleOfRadius: 20)
ball.physicsBody?.restitution = 0
ball.physicsBody?.friction = 0
ball.physicsBody?.mass = 0.1
ball.physicsBody?.linearDamping = 0
ball.physicsBody?.angularDamping = 0
ball.physicsBody?.isDynamic = true
ball.fillColor = .red
addChild(ball)
ball.physicsBody?.velocity = CGVector(dx: 0, dy: -400)
ball.physicsBody?.allowsRotation = true
self.physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)
var splinepoints = [CGPoint(x: 0 , y: 0),
CGPoint(x: 0, y: 300),
CGPoint(x: 375, y: 0),
CGPoint(x: 750, y: 300)]
let ground = SKShapeNode(splinePoints: &splinepoints, count: splinepoints.count)
ground.physicsBody = SKPhysicsBody(edgeChainFrom: ground.path!)
ground.physicsBody?.restitution = 0.0
ground.physicsBody?.friction = 0.0
addChild(ground)
let border = SKPhysicsBody(edgeLoopFrom: self.frame)
border.friction = 0
border.restitution = 0
self.physicsBody = border
}
override func didMove(to view: SKView) {
createView()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
ball.physicsBody?.friction = 0
ball.physicsBody?.restitution = 0
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
})
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5), execute: {
self.createView()
})
}
}
解决方案
SpriteKit 中的物理是现实生活的基本表示。现实生活中的物理课程中教授的许多原理在 SpriteKit 中是相同的。
你的球正在消耗它所有的动能来滚上一座小山。从山上滚下来并没有给它足够的能量来回滚到另一边。最终,球将完全停止滚动,并位于两座山之间的最低点。
当您的代码接触到一侧顶部的节点时,您的代码必须向球的 CGVector 添加足够的内容,以使其向下回滚并在另一侧向上滚动以接触另一个节点以添加到球的 CGVector 以获得它向下和向上滚动到第一个山丘以接触第一个节点并添加到球的 CGVector 等。这应该创建一个永不耗尽能量的无限滚动球。
推荐阅读
- centos - How to set up an additional glibc compiler on centOS
- java - 检查作业是否已经在运行,跳过新的 cron 实例作业
- python - How can I write a function fmap that returns the same type of iterable that was inputted?
- python - 在 Windows 上使用 Python 通过 ssh 连接到 DB 时出错
- razor - 颤振中是否有等效的 Razor View 引擎?
- python - 无法从 pantip.com 提取数据
- python-3.x - 并非所有点都在 Scikit-Optimize 中的空间误差范围内
- azure - 从容器读取时出现问题如何使用此问题文件将数据放入 sql 表中
- java - 如何使用 WalkFileTree 访问文件树中的所有 jar 文件
- angular - 如何在 Angular 6 中实现 Sanitize 库?