Ios Spritekit&;Swift 3-碰撞后更改球节点速度
我使用didbeagin(contact)和位掩码来确定哪个节点与哪个节点冲突。我使用applyImpulse()设置初始球速。我的代码是:Ios Spritekit&;Swift 3-碰撞后更改球节点速度,ios,swift,xcode,sprite-kit,skspritenode,Ios,Swift,Xcode,Sprite Kit,Skspritenode,我使用didbeagin(contact)和位掩码来确定哪个节点与哪个节点冲突。我使用applyImpulse()设置初始球速。我的代码是: let minAngle : UInt32 = 181 let maxAngle : UInt32 = 359 let randomAngle = arc4random_uniform(maxAngle - minAngle) + min
let minAngle : UInt32 = 181
let maxAngle : UInt32 = 359
let randomAngle = arc4random_uniform(maxAngle - minAngle) + minAngle
let dx:CGFloat = 3 * cos(CGFloat(randomAngle))
let dy:CGFloat = 3 * sin(CGFloat(randomAngle))
ball.physicsBody?.applyImpulse(CGVector(dx: dx, dy: dy))
我的DIDBENGIN(联系人)方法代码为:
func didBegin(_ contact: SKPhysicsContact) {
var firstBody = SKPhysicsBody()
var secondBody = SKPhysicsBody()
let ballNode = self.childNode(withName: ballName)
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == drainBitmask {
endGame()
Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(GameScene.showLeaderboard), userInfo: nil, repeats: false)
} else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target1Bitmask {
score += 20
self.vc.scoreLabel.text = "Score: \(score)"
} else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target2Bitmask {
score += 10
self.vc.scoreLabel.text = "Score: \(score)"
} else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target3Bitmask {
score += 30
self.vc.scoreLabel.text = "Score: \(score)"
}
func didbeagin(uu联系人:skphysiccontact){
var firstBody=SKPhysicsBody()
var secondBody=SKPhysicsBody()
让ballNode=self.childNode(使用名称:ballName)
如果contact.bodyA.categoryBitMask
但是,当我的球与目标1、2或3碰撞时,必须改变球的速度。例如,当球与目标1碰撞时,我需要将球的速度加倍。根据我的理解,当你向球施加脉冲时,dx和dy值代表方向和速度,那么我如何在保持速度不变的情况下将球的速度加倍碰撞时产生的真实弹跳效果?仅供参考,必须加倍的速度是碰撞瞬间的球速
编辑-扩展
extension CGVector {
var speed: CGFloat {
return hypot(dx, dy)
}
static func > (lhs: CGVector, rhs: CGVector) -> Bool {
return lhs.speed > rhs.speed
}
static func < (lhs: CGVector, rhs: CGVector) -> Bool {
return lhs.speed < rhs.speed
}
static func * (vector: CGVector, scalar: CGFloat) -> CGVector {
return CGVector(dx: vector.dx * scalar, dy: vector.dy * scalar)
}
扩展CGVector{
变量速度:CGFloat{
返回形波(dx,dy)
}
静态函数>(左:CGVector,右:CGVector)->Bool{
返回左侧速度>右侧速度
}
静态函数<(左:CGVector,右:CGVector)->Bool{
返回左侧速度<右侧速度
}
静态func*(向量:CGVector,标量:CGFloat)->CGVector{
返回CGVector(dx:vector.dx*标量,dy:vector.dy*标量)
}
}
谢谢在SpriteKit gameloop中,有许多“”风格的函数,您可以将代码放入其中 你可以让你的物理保持它正常的行为,让它做它自己的事情 然后,在稍后的更新中,在物理完成后-例如,didSimulatePhysics(),它在系统计算所有物理后立即调用,对球的速度进行所需的修改 在didSimulatePhysics中,您可以使用一些标志来查看刚刚发生的事件。在刚刚击中球目标1的情况下,您现在可以将球的速度加倍,这将在渲染球之前计算
如果球击中目标2,可能会使速度减半,等等。在物理体上使速度加倍这行吗?就像在碰撞时声明一个保持当前球速度的变量,然后简单地将其乘以2?为什么要保持它?我认为这是使速度加倍的方法。如果我错了,请纠正我如果CGVector不正确,请纠正我如果不允许标量乘法,只需重载*运算符:
func*=(inout vector:CGVector,scalar:CGFloat){vector=vector*scalar}