在 SpriteKit 上计算 SKShapeNode 线的角度
Calculate angle of SKShapeNode line on SpriteKit
我想制作积木游戏。
我有一个球想朝画线的方向射。
这是我投篮的方式:
let ang = angle(between: balls.first!.position, ending: CGPoint(x: guideLine.frame.maxX, y: guideLine.frame.maxY))
let force = CGVector(dx:cos(ang) * gameSpeed, dy:sin(ang) * gameSpeed)
for i in 0..<balls.count {
DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) * 0.1) {
if !balls.isEmpty {
balls[i].physicsBody!.applyImpulse(force)
}
}
}
这是我的 'angle' 函数,它将两个位置转换为角度:
func angle(between starting: CGPoint, ending: CGPoint) -> CGFloat {
let center = CGPoint(x: ending.x - starting.x, y: ending.y - starting.y)
let radians = atan2(center.y, center.x)
let degrees = GLKMathRadiansToDegrees(Float(radians))
return degrees > 0 ? CGFloat(degrees) : CGFloat(degrees + degrees)
}
如您所见,我从球所在的位置获得线的起点,并从线 maxX 和 maxY 本身获得线的终点...
我不确定这是正确的方法...
结果很奇怪!球向着它想去的任何方向,每次都不同(有时在我的线旁边,有时很远),我想不通。
截图如下:
您正在计算一个角度,然后将其传递给 sin
和 cos
,它们需要弧度。这可能是您的主要问题。
关于其他事情,目前还不清楚所有 degrees > 0
东西的目的是什么。此外,在 SpriteKit 中,在延迟之后坚持使用各种 SKAction
来处理 运行 之类的东西可能会更好,而不是散布在 DispatchQueue
东西中。后者将无法与 SpriteKit 的暂停、更改节点速度等功能正确交互。
let ang = angle(between: balls.first!.position, ending: CGPoint(x: guideLine.frame.maxX, y: guideLine.frame.maxY))
let actions = [SKAction]()
let force = CGVector(dx:cos(ang) * gameSpeed, dy:sin(ang) * gameSpeed)
let wait = SKAction.wait(forDuration:0.1)
for ball in balls {
let action = SKAction.run{
ball.physicsBody!.applyImpulse(force)
}
actions.append(wait)
actions.append(action)
}
run(SKAction.sequence(actions))
func angle(between starting: CGPoint, ending: CGPoint) -> CGFloat {
let relativeToStart = CGPoint(x: ending.x - starting.x, y: ending.y - starting.y)
let radians = atan2(relativeToStart.y, relativeToStart.x)
//let degrees = GLKMathRadiansToDegrees(Float(radians))
return radians > 0 ? (radians : (.pi * 2) + radians)
}
我想制作积木游戏。 我有一个球想朝画线的方向射。
这是我投篮的方式:
let ang = angle(between: balls.first!.position, ending: CGPoint(x: guideLine.frame.maxX, y: guideLine.frame.maxY))
let force = CGVector(dx:cos(ang) * gameSpeed, dy:sin(ang) * gameSpeed)
for i in 0..<balls.count {
DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) * 0.1) {
if !balls.isEmpty {
balls[i].physicsBody!.applyImpulse(force)
}
}
}
这是我的 'angle' 函数,它将两个位置转换为角度:
func angle(between starting: CGPoint, ending: CGPoint) -> CGFloat {
let center = CGPoint(x: ending.x - starting.x, y: ending.y - starting.y)
let radians = atan2(center.y, center.x)
let degrees = GLKMathRadiansToDegrees(Float(radians))
return degrees > 0 ? CGFloat(degrees) : CGFloat(degrees + degrees)
}
如您所见,我从球所在的位置获得线的起点,并从线 maxX 和 maxY 本身获得线的终点... 我不确定这是正确的方法...
结果很奇怪!球向着它想去的任何方向,每次都不同(有时在我的线旁边,有时很远),我想不通。
截图如下:
您正在计算一个角度,然后将其传递给 sin
和 cos
,它们需要弧度。这可能是您的主要问题。
关于其他事情,目前还不清楚所有 degrees > 0
东西的目的是什么。此外,在 SpriteKit 中,在延迟之后坚持使用各种 SKAction
来处理 运行 之类的东西可能会更好,而不是散布在 DispatchQueue
东西中。后者将无法与 SpriteKit 的暂停、更改节点速度等功能正确交互。
let ang = angle(between: balls.first!.position, ending: CGPoint(x: guideLine.frame.maxX, y: guideLine.frame.maxY))
let actions = [SKAction]()
let force = CGVector(dx:cos(ang) * gameSpeed, dy:sin(ang) * gameSpeed)
let wait = SKAction.wait(forDuration:0.1)
for ball in balls {
let action = SKAction.run{
ball.physicsBody!.applyImpulse(force)
}
actions.append(wait)
actions.append(action)
}
run(SKAction.sequence(actions))
func angle(between starting: CGPoint, ending: CGPoint) -> CGFloat {
let relativeToStart = CGPoint(x: ending.x - starting.x, y: ending.y - starting.y)
let radians = atan2(relativeToStart.y, relativeToStart.x)
//let degrees = GLKMathRadiansToDegrees(Float(radians))
return radians > 0 ? (radians : (.pi * 2) + radians)
}