как сохранить энергию в моем узле спрайтекита, сохраняя при этом гравитацию - PullRequest
0 голосов
/ 14 октября 2018

У меня есть проект, в котором мяч катится между двумя холмами, и я хочу, чтобы он продолжал катиться вечно.Холмы создаются с помощью точек сплайна (есть 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()
    })
}


}

1 Ответ

0 голосов
/ 15 октября 2018

Физика в SpriteKit - это базовое представление о реальной жизни.Многие принципы, преподаваемые на реальных курсах физики, в SpriteKit совпадают.

Ваш шар затрачивает всю свою кинетическую энергию, чтобы свернуть один холм.Откат вниз по склону не дает достаточно энергии, чтобы откатиться на другую сторону.В конце концов, шар перестанет катиться и сядет в самой низкой точке между двумя холмами.

Ваш код должен будет добавить достаточно к CGVector вашего шара, когда он касается узла в верхней части одной стороны, чтобы заставить его откатиться вниз и вверх по другой стороне, чтобы коснуться другого узла, чтобы добавить кCGVector шара, чтобы заставить его катиться вниз и вверх по первому холму, чтобы коснуться первого узла и добавить к CGVector шара и т. Д. Это должно создать бесконечный катящийся шар, который никогда не иссякает.

...