我将如何创造现实的驾驶体验?

我在将SpriteKit与iOS Swift 3结合使用时使用了applyForce函数,以在单击加油按钮时加速,并在制动时向PhysicsBody添加摩擦,我似乎也无法右转,也不知道如何执行此操作。

现在要转弯,我使用向左和向右转弯来拆分屏幕,但是我使用的是applyForce,但这很糟糕,因为当汽车停下来时,转弯会以一种不切实际的方式进行。

当我施加力时,它只会上升,因此,如果我创建了一个转向机构而又掉头了,那么汽车仍会上升。

另外请注意:多点触控不起作用?

有什么帮助吗?谢谢

override func didMove(to view: SKView) {

    // Multi Touch
    self.view?.isMultipleTouchEnabled = true

    car.carNode.position = CGPoint(x: 0, y: 0)
    car.carNode.physicsBody = SKPhysicsBody(rectangleOf: car.carNode.size)
    car.carNode.physicsBody?.affectedByGravity = false
    car.carNode.physicsBody?.angularDamping = 0.1
    car.carNode.physicsBody?.linearDamping = 0.1
    car.carNode.physicsBody?.friction = 0.1
    car.carNode.physicsBody?.mass = 1

    self.addChild(car.carNode)

    // HUD Display
    gas.gasButton.position = CGPoint(x: 300, y: -500)
    self.addChild(gas.gasButton)

    brake.brakeButton.position = CGPoint(x: 150, y: -500)
    self.addChild(brake.brakeButton)

}

override func update(_ currentTime: TimeInterval) {

if touching {

    car.carNode.physicsBody?.applyForce(CGVector(dx: 0, dy: 180))
  }
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

for touch in touches {
    let location = touch.location(in: self)

    if location.x < self.frame.size.width / 2 {

        // Left side of the screen
        car.carNode.physicsBody?.applyForce(CGVector(dx: -100, dy: 0))

    } else {

        // Right side of the screen
        car.carNode.physicsBody?.applyForce(CGVector(dx: 100, dy: 0))
    }

    // Gas Button
    if (gas.gasButton.contains(location)) {

        touching = true
    }
        // Brake Button
    else if (brake.brakeButton.contains(location)) {

        car.carNode.physicsBody?.friction = 1
    }

  }
}

ios - Swift SpriteKit的: Creating a realistic driving experience 2D-LMLPHP

最佳答案

评论的集成

for touch in touches {
    let location = touch.location(in: self)

    let velY = car.carNode.physicsBody?.velocity.dy
    let factor:CGFloat = 100
    let maxFactor:CGFloat = 300
    //limit
    let dxCalc = factor * velY > maxFactor ? maxFactor : factor * velY

    if location.x < self.frame.size.width / 2 {

        // Left side of the screen
       car.carNode.physicsBody?.applyForce(CGVector(dx: -dxCalc, dy: 0))

     } else {

        // Right side of the screen
        car.carNode.physicsBody?.applyForce(CGVector(dx: dxCalc, dy: 0))
    }

    // Gas Button
    //etc

}
}

10-05 20:04