首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代UISwipeGestureRecognizer?

替代UISwipeGestureRecognizer?
EN

Stack Overflow用户
提问于 2015-12-12 10:31:10
回答 1查看 143关注 0票数 0

我有3 SKScenes in SpriteKit,Swift:

  • 1级
  • 游戏结束
  • 2级。

在第1级和第2级中,我的字符移动由以下代码完成:

代码语言:javascript
复制
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级和第2级上做UISwipeGesture时,在1级-1级-1级-游戏结束等之间来回往返之后,FPS就会急剧下降。

然后,我决定从第1级中删除UISwipeGestureRecognizer,然后在第1级和游戏结束之间有目的地来回移动,然后转到第2级。在第2级中使用UISwipeGestures时没有FPS下降。

因此,我的结论是,每当我一次又一次地用SKScene加载UISwipeGestureRecognizer时,只要您尝试启动一个swipe,它就会创建这个FPS下拉列表。

那么: 1)我是否错误地实施了这个UISwipeGestureRecognizer?

( 2)在不使用UISwipeGestureRecognizer的情况下,还有其他方法可以获得相同的字符运动效果吗?

谢谢,伙计们!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-12 13:09:12

在转换到新场景之前,您需要移除手势,否则相同的手势会一次又一次地被添加,这会导致FPS问题。例如,如果你在第2级场景中有与第1级场景不同的手势,你的游戏就会崩溃,因为旧的level1手势没有被移除。在改变场景之前试一试

代码语言:javascript
复制
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类,它包含了在所有级别场景中显示的所有属性、控件、播放器精灵、标签等。否则,如果您有20个级别,您需要复制太多的代码。超简单

做一个像这样的BaseScene

代码语言:javascript
复制
 class BaseScene: SKScene, SKPhysicsContactDelegate {

然后在ViewDidLoad方法中设置所有级别所需的手势和所有东西。还可以使用baseScene来处理您的联系人方法和其他需要在级别之间共享的内容(gameOver方法等)。

而不是在您的级别场景中,您应该像这样对它们进行子类划分。

代码语言:javascript
复制
  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级场景中你可以这么说

代码语言:javascript
复制
 override func update(currentTime: CFTimeInterval) {
     super.update(currentTime) // will use all BaseScene update methods

    // do something specific for level 2 only

现在,如果您希望在更新中只运行在Level2场景中,并且忽略BaseScene中的所有更新方法,那么就不需要调用

代码语言:javascript
复制
 super.update(currentTime)

这适用于几乎所有的方法,如接触方法,接触开始等。这是前进的道路。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34238803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档