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