Search code examples
swiftsprite-kitaccelerometercore-motion

How to activate This Class to another


I have a question about using another class in my main GameplayScene. What I am trying to do is make the motions of the X-axis of the phone move the character left and right. Here is what I have in my MotionClass.swift

import SpriteKit
import CoreMotion

class MotionClass: SKScene {

    var player: Player?

    var motionManager = CMMotionManager()
    var destX: CGFloat = 0.0

    override func sceneDidLoad() {

            motionManager.accelerometerUpdateInterval = 0.2
            motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
                if let myData = data {

                    let currentX = self.player?.position.x

                    if myData.acceleration.x > 0.2 {
                        self.destX = currentX! + CGFloat(myData.acceleration.x * 100)
                        print("Tilted Right")

                    } else {

                    if myData.acceleration.x < -0.2 {
                        self.destX = currentX! + CGFloat(myData.acceleration.x * 100)
                        print("Tilted Left")
                    }
                }
            }
        }
    }

    override func update(_ currentTime: TimeInterval) {

        let action = SKAction.moveTo(x: destX, duration: 1)
        self.player?.run(action)
    }

}

Now I'm trying to call this class in my GameplayScene.swift in the motionBegan function, but I don't know how to go about doing that. I have the variable 'grapple' as MotionClass? but I don't know where to go from there. Could anyone give a good an example on doing this?


Solution

  • I think you may be confused about the purpose of an SKScene subclass, which is what your MotionClass currently is. (The main idea) is to only use one SKScene at a time: if you need stuff from MotionClass then you should just make it a plain class, not an SKScene subclass.

    I think you may also need to familiarize yourself a bit more with OOP as well... Outside of static properties / functions, you don't "call" a class, you instantiate it ( you make an object :] )

    So, if you have goodies in MotionClass that you want to access in GamePlayClass, you need a reference to a MotionClass object

    This can be done with a simple global variable... I suggest putting it into your GameViewController.swift:

    // Here is a global reference to an 'empty' motion class object..
    var global_motionClassObject = MotionClass()
    
    class GameViewController: UIViewController {
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        // ...
        if let view = self.view as! SKView? else {
          let scene = MotionClass(size: view.frame.size)
          // Assign our global to the new scene just made:
          global_motionClassObject = scene
          scene.scaleMode = .aspectFit
    
          view.presentScene(scene)
        }
    
        // ...
    }
    

    Now inside of your GamePlayClass, or wherever else, you can access MotionClass by calling global_motionClassObject

    However, this may not give the desired results because I'm worried you may need to restructure your MotionClass into something other than an SKScene :)