gpt4 book ai didi

xcode - UISwipeGestureRecognizer 的替代品?

转载 作者:行者123 更新时间:2023-11-28 12:59:35 25 4
gpt4 key购买 nike

我在 SpriteKit、Swift 中有 3 个 SKScenes:

  • 一级

  • 游戏结束

  • 2 级。

在Level 1和Level 2中,我的角色移动是通过以下代码完成的:

class Level1: SKScene, SKPhysicsContactDelegate {

func swipedRight(sender:UISwipeGestureRecognizer){
let moveRIGHT = SKAction.moveBy(CGVectorMake(60, 0), duration: 1)
Character.runAction(moveRIGHT)
}

func swipedLeft(sender:UISwipeGestureRecognizer){
let moveLEFT = SKAction.moveBy(CGVectorMake(-60, 0), duration: 1)
Character.runAction(moveLEFT)
}


let swipeRight:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedRight:"))
swipeRight.direction = .Right
view.addGestureRecognizer(swipeRight)

let swipeLeft:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedLeft:"))
swipeLeft.direction = .Left
view.addGestureRecognizer(swipeLeft)

当角色在关卡 1 中死亡时,我会过渡到“游戏结束”SKScene,如果您愿意,您可以在其中重试关卡 1。

但是,在级别 1 - 游戏结束 - 级别 1 - 游戏结束 - 级别 1 - 游戏结束等之间来回切换后,每当您在级别 1 和级别 2 上执行 UISwipeGesture 时,FPS 都会急剧下降。

然后我决定从 Level 1 中移除 UISwipeGestureRecognizer,然后故意在 Level 1 和 Game Over 之间来回切换,然后转到 Level 2。这样做之后在 Level 2 中使用 UISwipeGestures 时 FPS 没有下降。

因此,我的结论是,每当我用 UISwipeGestureRecognizer 一遍又一遍地加载 SKScene 时,每当您尝试启动滑动时,它都会导致 FPS 下降。

所以:1) 我是否错误地实现了这个 UISwipeGestureRecognizer?

2) 有没有其他方法可以在不使用 UISwipeGestureRecognizer 的情况下获得相同的角色移动效果?

谢谢大家!

最佳答案

您需要在转换到新场景之前删除手势,否则会不断添加相同的手势,从而导致 FPS 问题。例如,如果您在 2 级场景中的手势与 1 级场景中的手势不同,您的游戏将会崩溃,因为旧的 1 级手势尚未被删除。在改变场景之前试试这个

guard let view = view else { return }
guard view.gestureRecognizers != nil else { return }
for gesture in view.gestureRecognizers! {
if let recognizerTap = gesture as? UITapGestureRecognizer {
view.removeGestureRecognizer(recognizerTap)
}
if let recognizerSwipe = gesture as? UISwipeGestureRecognizer {
view.removeGestureRecognizer(recognizerSwipe)
}
}

另外,为了让您的生活更轻松,您或许应该开始子类化。考虑制作一个 BaseScene 类,其中包含您在所有关卡场景中显示的所有属性、控件、玩家 Sprite 、标签等。否则,例如,如果您有 20 个关卡,则需要复制太多代码。 super 简单

像这样制作一个BaseScene

 class BaseScene: SKScene, SKPhysicsContactDelegate {

然后只需在 ViewDidLoad 方法中设置手势和所有级别所需的所有内容。还可以将 baseScene 用于您的联系方法和您需要在关卡之间共享的其他内容(gameOver 方法等)

在你的关卡场景中,你应该像这样子类化它们

  class Level1Scene: BaseScene {

override func didMoveToView(view: SKView) {
super.didMoveToView(view) // imports everything from ViewDidLoad in base scene

// do other setUps specific to level 1 only

这将使您的代码更加灵活。假设您使用 BaseScene 中的 Update 函数来暂停游戏,它将在子类级别场景中工作,如上所述。但是例如,如果在 Level2 中您需要向仅在 Level2 中运行的 Update 函数添加一个方法,您可以执行类似于 ViewDidLoad 方法的操作。所以在你的 2 级场景中你可以这样说

 override func update(currentTime: CFTimeInterval) {
super.update(currentTime) // will use all BaseScene update methods

// do something specific for level 2 only

现在如果你想要更新中的东西只在 Level2 场景中运行并且忽略 BaseScene 中的所有更新方法而不是简单地调用

 super.update(currentTime)

这几乎适用于所有方法,例如接触方法、触摸开始等。这是要走的路。

关于xcode - UISwipeGestureRecognizer 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34238803/

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