gpt4 book ai didi

swift - 每次使用 swift 代码触摸屏幕后,如何使对象移动得更快?

转载 作者:可可西里 更新时间:2023-11-01 02:20:27 25 4
gpt4 key购买 nike

我在 Xcode 7 BETA 上制作了一个游戏,其中包含一个可以移动并具有许多不同功能的对象。

但问题是物体总是以相同的速度运动,它不会加速或减速。我想要的是让物体在每次触摸屏幕后加速。

我创建了一个名为“kDefaultXToMovePerSecond”的常量(参见下面的代码),因此使用这个常量对象总是以相同的速度移动。

func startMoving() {
let moveLeft = SKAction.moveByX(-kDefaultXToMovePerSecond, y: 0, duration: 0.7)
runAction(SKAction.repeatActionForever(moveLeft))
}

我把“-”放在常量之前,因为它需要为负数才能移动。我试着让它在每次触摸屏幕后加快速度。我的代码在这里,在 GameScene.swift 中,

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */

if isGameOver {
restart()
} else if !isStarted {
start()
} else {
Dot.flip()


kDefaultXToMovePerSecond + 10

}
}

我的第二个代码示例的这一部分有问题吗?

"kDefaultXToMovePerSecond + 10"

最佳答案

您的代码有两个问题。首先,要更改 kDefaultXToMovePerSecond,必须使用以下语法:kDefaultXToMovePerSecond += 10,而不是 kDefaultXToMovePerSecond + 10。我不确定为什么第二种方法(您在代码中使用的方法)没有被编译器捕获,因为它没有将此值分配给任何变量。但是我已经在 playground 中测试了这种语法,并且变量的值不会随着这种语法而改变。其次,虽然您创建了移动 Sprite 的 Action ,但它永远不会更新,因此 Sprite 的速度永远不会改变。这是因为通过简单地更改 touchesBegan 中的 kDefaultXToMovePerSecond 变量,您只是更改变量本身,而不是 SKAction 中的参数值没有连接到它。有两个选项可以创建您正在寻找的行为。

  1. 每次调用 touchesBegan 时,向 Sprite 添加一个新的 SKAction。此新操作将覆盖之前的操作。
  2. 删除之前对 Sprite 的操作,然后在每次调用 touchesBegan 时添加一个新操作。尽管这样做的效果与选项 1 相同,但它的好处是可以解除分配您创建的 SKActions。这可以防止它们堆积起来,永远不会被再次使用,从而占用不必要的内存。

如果您想了解如何完成此操作的指导,请参阅我在 Xcode 7 Beta 模拟器中编写和测试的以下代码。

class GameScene: SKScene {

let player = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 100, height: 50))
var kDefaultXToMovePerSecond: CGFloat = 0

override func didMoveToView(view: SKView) {
player.position = CGPoint(x: 100, y: 200)
addChild(player)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */

//Make sure that it is the same kay as below
player.removeActionForKey("anyKeyWillDo")

kDefaultXToMovePerSecond += 10

let moveLeft = SKAction.moveByX(kDefaultXToMovePerSecond, y: 0, duration: 0.7)
player.runAction(SKAction.repeatActionForever(moveLeft), withKey: "anyKeyWillDo")
}

override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
}

注意:为了实现选项 1,取出 player.removeActionForKey("anyKeyWillDo") 行。对于选项 2,保留它。

关于swift - 每次使用 swift 代码触摸屏幕后,如何使对象移动得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31016835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com