从旋转的大炮射击球
Shooting balls from a rotating cannon
我正在制作 SpriteKit 游戏。我有 6 门大炮,我已经将它们向后和第四旋转。我想从每门大炮发射与每门大炮的旋转同步的炮弹。我想要每个炮弹之间持续一秒钟。
所以基本上:不断旋转的大炮是在与旋转相同的方向上发射炮弹。
对于大炮,我正在使用扩展程序:
extension CGFloat {
func degreesToRadians() -> CGFloat {
return self * CGFloat.pi / 180
}
}
我只放一门大炮的代码,因为我应该能够弄清楚如何调整其中一个炮弹的运动以适应其他炮弹的运动。这是一个:
func createCannons() {
let cannonLeftBottom = SKSpriteNode(imageNamed: "Cannon")
cannonLeftBottom.anchorPoint = CGPoint(x: 0.5, y: 0.5)
cannonLeftBottom.position = CGPoint(x: -325, y: -420)
cannonLeftBottom.zPosition = 4
cannonLeftBottom.setScale(0.4)
cannonLeftBottom.zRotation = CGFloat(65).degreesToRadians()
let rotateLB = SKAction.rotate(byAngle:
CGFloat(-65).degreesToRadians(), duration: 2)
let rotateBackLB = SKAction.rotate(byAngle:
CGFloat(65).degreesToRadians(), duration: 2)
let repeatRotationLB =
SKAction.repeatForever(SKAction.sequence([rotateLB,rotateBackLB]))
cannonLeftBottom.run(repeatRotationLB)
self.addChild(cannonLeftBottom)
}
这是我的炮弹函数:
func createBalls() {
let cannonBallLB = SKSpriteNode(imageNamed: "Ball")
cannonBallLB.name = "CannonBall"
cannonBallLB.position = CGPoint(x: -325, y: -420)
cannonBallLB.physicsBody = SKPhysicsBody(circleOfRadius:
cannonBallLB.size.height / 2)
cannonBallLB.physicsBody?.affectedByGravity = false
cannonBallLB.zPosition = 3
cannonBallLB.setScale(0.1)
self.addChild(cannonBallLB)
}
谢谢!
您需要将极坐标转换为直角坐标。
你通过使用 sin 和 cos 来做到这一点
例如
let speed = 100 //This would mean move 100 points per second
let force = CGVector(dx:cos(cannon.zRotation) * speed,dy:sin(cannon.zRotation) * speed)
cannonBall.applyForce(force)
注意:现在除非他们改变了这个,否则以前的力是以点为单位的,如果他们把它固定为米的单位,那么你需要将你的速度除以 150,因为在 Spritekit 中 150 点 = 1 米
我正在制作 SpriteKit 游戏。我有 6 门大炮,我已经将它们向后和第四旋转。我想从每门大炮发射与每门大炮的旋转同步的炮弹。我想要每个炮弹之间持续一秒钟。
所以基本上:不断旋转的大炮是在与旋转相同的方向上发射炮弹。
对于大炮,我正在使用扩展程序:
extension CGFloat {
func degreesToRadians() -> CGFloat {
return self * CGFloat.pi / 180
}
}
我只放一门大炮的代码,因为我应该能够弄清楚如何调整其中一个炮弹的运动以适应其他炮弹的运动。这是一个:
func createCannons() {
let cannonLeftBottom = SKSpriteNode(imageNamed: "Cannon")
cannonLeftBottom.anchorPoint = CGPoint(x: 0.5, y: 0.5)
cannonLeftBottom.position = CGPoint(x: -325, y: -420)
cannonLeftBottom.zPosition = 4
cannonLeftBottom.setScale(0.4)
cannonLeftBottom.zRotation = CGFloat(65).degreesToRadians()
let rotateLB = SKAction.rotate(byAngle:
CGFloat(-65).degreesToRadians(), duration: 2)
let rotateBackLB = SKAction.rotate(byAngle:
CGFloat(65).degreesToRadians(), duration: 2)
let repeatRotationLB =
SKAction.repeatForever(SKAction.sequence([rotateLB,rotateBackLB]))
cannonLeftBottom.run(repeatRotationLB)
self.addChild(cannonLeftBottom)
}
这是我的炮弹函数:
func createBalls() {
let cannonBallLB = SKSpriteNode(imageNamed: "Ball")
cannonBallLB.name = "CannonBall"
cannonBallLB.position = CGPoint(x: -325, y: -420)
cannonBallLB.physicsBody = SKPhysicsBody(circleOfRadius:
cannonBallLB.size.height / 2)
cannonBallLB.physicsBody?.affectedByGravity = false
cannonBallLB.zPosition = 3
cannonBallLB.setScale(0.1)
self.addChild(cannonBallLB)
}
谢谢!
您需要将极坐标转换为直角坐标。
你通过使用 sin 和 cos 来做到这一点
例如
let speed = 100 //This would mean move 100 points per second
let force = CGVector(dx:cos(cannon.zRotation) * speed,dy:sin(cannon.zRotation) * speed)
cannonBall.applyForce(force)
注意:现在除非他们改变了这个,否则以前的力是以点为单位的,如果他们把它固定为米的单位,那么你需要将你的速度除以 150,因为在 Spritekit 中 150 点 = 1 米