2017-02-01 8 views
2

Я пытаюсь обнаружить дрожание жест в SKScene .Эта код, я использую:обнаруживая встряхивания Жест SpriteKit в Swift

import SpriteKit 
import UIKit 
import CoreMotion 

class Menu: SKScene { 

override func didMove(to view: SKView) {  

    self.becomeFirstResponder() 

    //Game Code 

} 

    override func becomeFirstResponder() -> Bool { 
     return true 
    } 

override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) { 
     if event?.subtype == UIEventSubtype.motionShake { 
      //Run Code 
     } 
    } 

    override func willMove(from view: SKView) { 
     resignFirstResponder() 
    } 


} 

motionEnded Но код не работает, это как если бы это Безразлично Не обнаруживайте жест встряхивания. Это находится в SKScene, поэтому я не уверен, отличается ли код.

Любая помощь была бы принята с благодарностью.

ответ

3

По-видимому, вы не можете обнаружить события тряски от подкласса SKScene, например GameScene. Однако вы можете обнаружить их с контроллера вида, например GameViewController. Когда запускается событие shake, вы можете вызвать обработчик встряски в GameScene с контроллера вида.

В вашем GameViewController добавить это обнаружить сотрясение событие

override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) { 
    if motion == .motionShake { 
     if let skView = view as? SKView, let scene = skView.scene as? GameScene { 
      scene.shake() 
     } 
    } 
} 

и добавить к GameScene

func shake() { 
    print("Shake") 
} 

EDIT

Если вам нужно определить сотрясение событие из нескольких SKScene подклассы, вы можете определить следующие расширения:

extension SKScene { 
    func shake() { 
    } 
} 

extension SKView { 
    open override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) { 
     if let scene = self.scene { 
      scene.shake() 
     } 
    } 
} 

и добавьте следующие строки в соответствующие SKScene подклассов

override func shake() { 
    print("Shake") 
} 
+0

Проблема заключается в том, что действие трясти отличается от каждого SKScene и у меня есть несколько. Мне нужно уметь определить, на какой сцене я вхожу, когда она трясется, прежде чем использовать строку if let skView, иначе я думаю, что у меня получится авария –

+0

Интересный код, молодец. –

+0

Спасибо, действительно хороший код! –

Смежные вопросы