Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift SpriteKit:创造逼真的2D驾驶体验_Ios_Swift_Sprite Kit - Fatal编程技术网

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

Ios Swift SpriteKit:创造逼真的2D驾驶体验,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,如何创造真实的驾驶体验 我正在使用iOS Swift 3和SpriteKit,当我点击油门按钮时,使用applyForce加速,当刹车时,我给身体增加了摩擦力,而且我似乎无法右转,不知道怎么做 现在转弯我用左右分开屏幕来转弯,但我用applyForce,但它非常糟糕,因为它在停车时转弯,而且是以一种非常不现实的方式 当我施加力时,它只会上升,所以如果我创造了一个转向机构,我做了一个转向,汽车仍然会上升 另请注意:多点触摸不起作用 有什么帮助吗?谢谢 override func didMove(t

如何创造真实的驾驶体验

我正在使用iOS Swift 3和SpriteKit,当我点击油门按钮时,使用applyForce加速,当刹车时,我给身体增加了摩擦力,而且我似乎无法右转,不知道怎么做

现在转弯我用左右分开屏幕来转弯,但我用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
    }

  }
}
override func didMove(to view:SKView){
//多点触摸
self.view?.isMultipleTouchEnabled=true
car.carNode.position=CGPoint(x:0,y:0)
car.carNode.physicsBody=SKPhysicsBody(矩形:car.carNode.size)
car.carNode.physicsBody?.affectedByGravity=false
car.carNode.physicsBody?.angularDamping=0.1
car.carNode.physicsBody?.linearDamping=0.1
car.carNode.physicsBody?摩擦力=0.1
car.carNode.physicsBody?质量=1
self.addChild(car.carNode)
//抬头显示器
gas.gasButton.position=CGPoint(x:300,y:-500)
self.addChild(gas.gasButton)
brake.brakeButton.position=CGPoint(x:150,y:-500)
self.addChild(制动按钮)
}
覆盖函数更新(uCurrentTime:TimeInterval){
如果接触{
car.carNode.physicsBody?applyForce(CGVector(dx:0,dy:180))
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
如果位置.x

评论的整合

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
用于触控触摸{
让位置=触摸。位置(in:self)
设fly=car.carNode.physicsBody?.velocity.dy
let系数:CGFloat=100
设maxFactor:CGFloat=300
//极限
设dxCalc=factor*velY>maxFactor?maxFactor:factor*velY
如果位置.x
}
}

您可能希望将此图片带到并找出其背后的原理,然后将其应用到您的代码中。好的,图片帮助您了解2D游戏。尝试
让velY=car.carNode.physicsBody?.velocity.dy car.carNode.physicsBody?.applyForce(CGVector(dx:100*velY,dy:0))
计算你的y速度,如果你的车y速度为零,你的车不转弯,显然速度越大,转弯力越大。可以构建func以将此力限制为最大值。检查后,最好在车前使用applyForce,而不是applyForce来转动车辆。这是一个非常有趣的物理引擎利用率设计问题。有谁能想到一个论坛,让我们就创造“解决方案”的不同方式及其各种折衷和好处交换意见吗?@BroSimple这里有一个解决问题的方法。。。非常感谢。我得到一个错误,说
二进制运算符'*'不能应用于'Int'和'CGFloat'类型的操作数?
好的,在继续之前,您绝对需要阅读SWIFT book!简单地将int改为CGFloat,我会更新……是的,对不起,我刚开始学习Swift,通过做随机项目而不是书本,但我会开始阅读,而且当你对
applyAngularImpulse
说汽车转弯看起来是真的时,我会像你在这里用这段代码一样做同样的事情?因为
AngularImpulse
变得疯狂,所以在应用AngularImpulse之前,您必须更改汽车的固定点,并尝试将阵风施加一点冲量,如系数=1或10