我有3 SKScenes in SpriteKit,Swift:
在第1级和第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级和第2级上做UISwipeGesture时,在1级-1级-1级-游戏结束等之间来回往返之后,FPS就会急剧下降。
然后,我决定从第1级中删除UISwipeGestureRecognizer,然后在第1级和游戏结束之间有目的地来回移动,然后转到第2级。在第2级中使用UISwipeGestures时没有FPS下降。
因此,我的结论是,每当我一次又一次地用SKScene加载UISwipeGestureRecognizer时,只要您尝试启动一个swipe,它就会创建这个FPS下拉列表。
那么: 1)我是否错误地实施了这个UISwipeGestureRecognizer?
( 2)在不使用UISwipeGestureRecognizer的情况下,还有其他方法可以获得相同的字符运动效果吗?
谢谢,伙计们!
发布于 2015-12-12 13:09:12
在转换到新场景之前,您需要移除手势,否则相同的手势会一次又一次地被添加,这会导致FPS问题。例如,如果你在第2级场景中有与第1级场景不同的手势,你的游戏就会崩溃,因为旧的level1手势没有被移除。在改变场景之前试一试
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
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)这适用于几乎所有的方法,如接触方法,接触开始等。这是前进的道路。
https://stackoverflow.com/questions/34238803
复制相似问题