Swift SpriteKit:创建逼真的2D驾驶体验

5
我如何创建逼真的驾驶体验?
我使用iOS Swift 3和SpriteKit,使用applyForce函数来在点击油门按钮时加速,当刹车时向physicsBody添加摩擦力,但是我无法向右转弯,也不知道该怎么做。
现在,为了转弯,我正在使用左右屏幕分割来实现,但是我正在使用applyForce,这很糟糕,因为它会在汽车停止时以一种非常不真实的方式进行转弯。
当我施加力时,它只能朝上走,因此如果我创建一个转弯机制并进行U形转弯,汽车仍将向上行驶。
另外需要注意的是:多点触控不起作用?
有什么帮助吗?谢谢。
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
    }

  }
}

game


3
你可能希望将这个问题提到 https://physics.stackexchange.com/ 并找出其背后的原理,然后将其应用到你的代码中。 - Knight0fDragon
1
好的,这张图片有助于理解你的2D游戏。尝试使用let velY = car.carNode.physicsBody?.velocity.dy car.carNode.physicsBody?.applyForce(CGVector(dx: 100 * velY, dy: 0)) - Simone Pistecchia
1
计算您的Y轴速度,如果您的汽车Y轴速度为零,则您的汽车不会转弯,显然速度越大,转向力就越大。您可以构建一个函数来将此力限制在最大值内。在进行此检查之后,最好使用applyAngularImpulse在汽车前部而不是应用力来转动您的汽车。 - Simone Pistecchia
1
这是一个非常有趣的物理引擎应用设计问题。有没有人知道一个论坛,我们可以在那里交流不同创建“解决方案”的方式以及它们的各种妥协和好处? - Confused
1
@BroSimple 这里有一种解决问题的思路... http://www.iforce2d.net/b2dtut/top-down-car - Confused
显示剩余15条评论
1个回答

0

评论集成

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

} }


谢谢!我收到了一个错误,说“二元运算符'*'不能应用于类型为'Int'和'CGFloat'的操作数?” - WokerHead
好的,继续之前你绝对需要阅读SWIFT书籍!将int简单更改为CGFloat,我会更新... - Simone Pistecchia
抱歉,我只是通过做一些随机项目来学习Swift,并没有看书,但我会开始阅读。另外当你说要使用applyAngularImpulse来使汽车转弯看起来更真实时,我是否可以像你在这里的代码中所做的那样做相同的事情?因为AngularImpulse会变得疯狂。 - WokerHead
在应用angularImpulse之前,您必须更改汽车的锚点,并尝试施加一点冲量,例如因子=1或10。 - Simone Pistecchia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接