Swift - 使用 SpriteKit 提高移动节点的速度
Swift - Increase speed of a moving Node using SpriteKit
我正在开发一款类似于乒乓球的游戏,在开始游戏时,我会向随机方向的球施加脉冲,该方向位于屏幕的中心,例如
func impulse(){
let randomNum:UInt32 = arc4random_uniform(200)
let someInt:Int = Int(randomNum)
//Ball Impulse
if someInt<49{
ball.physicsBody?.applyImpulse(CGVector(dx: ballSpeed+3, dy: ballSpeed-5))
}else if someInt<99{
ball.physicsBody?.applyImpulse(CGVector(dx: ballSpeed+5, dy: -ballSpeed+5))
}else if someInt<149{
ball.physicsBody?.applyImpulse(CGVector(dx: -ballSpeed-5, dy: -ballSpeed+5))
}else if someInt<200{
ball.physicsBody?.applyImpulse(CGVector(dx: -ballSpeed-3, dy: ballSpeed-5))
}
}
其中ballSpeed是球的预设速度。
那么有什么办法可以在球运动时随着持续时间逐渐增加球的速度?由于球会一直在屏幕上弹跳,因此很难使用 dx 和 dy 对其施加力。
编辑 -
我使用上述方法只是为了在游戏开始时随机分配 quadrant/direction 球。
开始,当实施脉冲方法时,例如
Game start image
而且我想在游戏过程中随着时间的推移按预定义的单位增加球的速度,例如
Gameplay
好的,给你!无论如何,球总是变得更快!!!调整 amount
以确定球每帧增加多少速度。
class GameScene: SKScene, SKPhysicsContactDelegate {
let ball = SKShapeNode(circleOfRadius: 20)
var initialDY = CGFloat(0)
var initialDX = CGFloat(0)
override func didMove(to view: SKView) {
self.physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
self.physicsWorld.gravity = CGVector.zero
// Configure ball pb:
let pb = SKPhysicsBody(circleOfRadius: 20)
ball.physicsBody = pb
addChild(ball)
pb.applyImpulse(CGVector(dx: 10, dy: 10))
}
override func update(_ currentTime: TimeInterval) {
initialDX = abs(ball.physicsBody!.velocity.dx)
initialDY = abs(ball.physicsBody!.velocity.dy)
}
override func didSimulatePhysics() {
guard let pb = ball.physicsBody else { fatalError() }
// decrease this to adjust the amount of speed gained each frame :)
let amount = CGFloat(5)
// When bouncing off a wall, speed decreases... this corrects that to _increase speed_ off bounces.
if abs(pb.velocity.dx) < abs(initialDX) {
if pb.velocity.dx < 0 { pb.velocity.dx = -initialDX - amount }
else if pb.velocity.dx > 0 { pb.velocity.dx = initialDX + amount }
}
if abs(pb.velocity.dy) < abs(initialDY) {
if pb.velocity.dy < 0 { pb.velocity.dy = -initialDY - amount }
else if pb.velocity.dy > 0 { pb.velocity.dy = initialDY + amount }
}
}
}
您可以使用 SKAction.repeatForever(.sequence([.wait(forDuration: TimeInterval, .run( { code } )))
将其修改为每 5 秒仅提高一次速度,但 IMO 让它不断提高速度会更棒并且更容易实现。
我正在开发一款类似于乒乓球的游戏,在开始游戏时,我会向随机方向的球施加脉冲,该方向位于屏幕的中心,例如
func impulse(){
let randomNum:UInt32 = arc4random_uniform(200)
let someInt:Int = Int(randomNum)
//Ball Impulse
if someInt<49{
ball.physicsBody?.applyImpulse(CGVector(dx: ballSpeed+3, dy: ballSpeed-5))
}else if someInt<99{
ball.physicsBody?.applyImpulse(CGVector(dx: ballSpeed+5, dy: -ballSpeed+5))
}else if someInt<149{
ball.physicsBody?.applyImpulse(CGVector(dx: -ballSpeed-5, dy: -ballSpeed+5))
}else if someInt<200{
ball.physicsBody?.applyImpulse(CGVector(dx: -ballSpeed-3, dy: ballSpeed-5))
}
}
其中ballSpeed是球的预设速度。 那么有什么办法可以在球运动时随着持续时间逐渐增加球的速度?由于球会一直在屏幕上弹跳,因此很难使用 dx 和 dy 对其施加力。
编辑 -
我使用上述方法只是为了在游戏开始时随机分配 quadrant/direction 球。
开始,当实施脉冲方法时,例如 Game start image
而且我想在游戏过程中随着时间的推移按预定义的单位增加球的速度,例如 Gameplay
好的,给你!无论如何,球总是变得更快!!!调整 amount
以确定球每帧增加多少速度。
class GameScene: SKScene, SKPhysicsContactDelegate {
let ball = SKShapeNode(circleOfRadius: 20)
var initialDY = CGFloat(0)
var initialDX = CGFloat(0)
override func didMove(to view: SKView) {
self.physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
self.physicsWorld.gravity = CGVector.zero
// Configure ball pb:
let pb = SKPhysicsBody(circleOfRadius: 20)
ball.physicsBody = pb
addChild(ball)
pb.applyImpulse(CGVector(dx: 10, dy: 10))
}
override func update(_ currentTime: TimeInterval) {
initialDX = abs(ball.physicsBody!.velocity.dx)
initialDY = abs(ball.physicsBody!.velocity.dy)
}
override func didSimulatePhysics() {
guard let pb = ball.physicsBody else { fatalError() }
// decrease this to adjust the amount of speed gained each frame :)
let amount = CGFloat(5)
// When bouncing off a wall, speed decreases... this corrects that to _increase speed_ off bounces.
if abs(pb.velocity.dx) < abs(initialDX) {
if pb.velocity.dx < 0 { pb.velocity.dx = -initialDX - amount }
else if pb.velocity.dx > 0 { pb.velocity.dx = initialDX + amount }
}
if abs(pb.velocity.dy) < abs(initialDY) {
if pb.velocity.dy < 0 { pb.velocity.dy = -initialDY - amount }
else if pb.velocity.dy > 0 { pb.velocity.dy = initialDY + amount }
}
}
}
您可以使用 SKAction.repeatForever(.sequence([.wait(forDuration: TimeInterval, .run( { code } )))
将其修改为每 5 秒仅提高一次速度,但 IMO 让它不断提高速度会更棒并且更容易实现。