2016-08-19 4 views
1

Я пытаюсь вызвать функцию, называемую «удар». Внутри это CAAnimation, что я играю на этом человеке, которого я создал. Поэтому обычно я бы просто вызвал функцию в том же контроллере представления, что и в ней. Но потому, что у меня есть HUD/overlay scene, отображаются над моей 3D-игрой. И HUD/overlayscene производится в другом контроллере представления, а именно для настройки HUD. Я не могу получить контроллер представления HUD. Распознавать любые функции из Main View Controller.Как вызвать функцию, определенную в другом контроллере?

MainViewController:
Код:

class GameViewController: UIViewController, ADBannerViewDelegate, SKPhysicsContactDelegate, SKSceneDelegate, SCNSceneRendererDelegate, SCNPhysicsContactDelegate{ 

var HUDView: HUD! 

required init?(coder: NSCoder) { 
    super.init(coder: coder) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //-----Scene-Setup---------- 
    let scnView = self.view as! SCNView 
    scnView.scene = FieldScene 
    scnView.playing = true 
    scnView.loops = true 
    self.HUDView = HUD(size: CGSizeMake(100, 100)) 
    scnView.overlaySKScene = self.HUDView 
    scnView.delegate = self 
    scnView.overlaySKScene!.delegate = self 
    scnView.overlaySKScene!.userInteractionEnabled = true 
    scnView.backgroundColor = UIColor.whiteColor() 
    scnView.allowsCameraControl = true 
    scnView.showsStatistics = false 

    let GuyScene = SCNScene(named: "art.scnassets/The1.dae") 
    let Guy: SCNNode = GuyScene!.rootNode.childNodeWithName("Armature", recursively: true)! 
    let GuyBody: SCNNode = GuyScene!.rootNode.childNodeWithName("Cube", recursively: true)! 
    //----Giveing it a physics--------- 
    let collisionCapsuleRadius2 = CGFloat(0.1) 
    let collisionCapsuleHeight2 = CGFloat(0.1) 
    Guy.position = SCNVector3(x: -30.0, y: 30.0, z: 0.0) 
    Guy.scale = SCNVector3Make(50, 50, 50) 
    Guy.rotation = SCNVector4Make(0, 1, 0, 1) 
    Guy.physicsBody = SCNPhysicsBody(type: .Dynamic, shape:SCNPhysicsShape(geometry: SCNCapsule(capRadius: collisionCapsuleRadius2, height: collisionCapsuleHeight2), options:nil)) 
    Guy.physicsBody?.affectedByGravity = true 
    Guy.physicsBody?.friction = 0 // 
    Guy.physicsBody?.restitution = 1 //bounceness of the object 
    Guy.physicsBody?.angularDamping = 1 // rotationess 
    Guy.physicsBody?.mass = 1 
    Guy.physicsBody?.rollingFriction = 0 
    scnView.scene!.rootNode.addChildNode(Guy) 
    scnView.scene!.rootNode.addChildNode(GuyBody) 
    } 

    //Ok Kick function gets declared right here 


    func Kick() { 
    //-----Animate-Guy-----Working-Perfectly----------- 
    let KickAnimation = CAAnimation.animationWithSceneNamed("art.scnassets/The1Anima.dae")! 
    Guy.addAnimation(KickAnimation, forKey: "Go") 
    Guy.removeAnimationForKey("Go", fadeOutDuration: 3.0) 
    } 


} 

    extension CAAnimation { 
class func animationWithSceneNamed(name: String) -> CAAnimation? { 
    var animation: CAAnimation? 
    if let scene = SCNScene(named: name) { 
     scene.rootNode.enumerateChildNodesUsingBlock({ (child, stop) in 
      if child.animationKeys.count > 0 { 
       animation = child.animationForKey(child.animationKeys.first!) 
       stop.initialize(true) 
      } 
     }) 
    } 
    return animation 
} 
} 



    //Ok Below is my HUD/Overlayscene which holds the button that i would like call the function in. 


    extension GameViewController { 
    // was never used 
} 

class HUD: SKScene { 
//-----------------Controller-Buttons---------------------- 
var ButtonA = SKSpriteNode(imageNamed:"EnhancedAButton") 

    override init(size: CGSize) { 
    super.init(size: size) 

    //----A-Button--Creation ------------------- 
    ButtonA.size = CGSize(width: 7, height: 11) 
    ButtonA.anchorPoint = CGPointMake(-11.35, -0.6) 
    ButtonA.zPosition = 0 
    ButtonA.alpha = 0.45 
    self.addChild(ButtonA) 
    } 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 


    //Ok here is the function I need to put "Kick()" inside it but when I do it doenst recognize it because the function wasnt declared in this view controller 


func AButtonPressed() { 

} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    super.touchesBegan(touches, withEvent: event) 
    for touch: AnyObject in touches { 
     let location1 = touch.locationInNode(self) 
     if self.nodeAtPoint(location1) == self.ButtonA { 
      AButtonPressed() 
      print("AButtonPressed") 
     } 
    } 
} 
} 

enter image description here

enter image description here

+0

'static func Kick() { // ----- Animate-Guy ----- Работает идеально ----------- let KickAnimation = CAAnimation.animationWithSceneNamed (" art .scnassets/The1Anima.dae ")! Guy.addAnimation (KickAnimation, forKey: «Go») Guy.removeAnimationForKey («Go», fadeOutDuration: 3.0) } ' –

+0

Хорошо спасибо, но я получаю сообщение об ошибке« статические методы могут быть объявлены только по типу », а затем скажет мне удалить статику или скажет: «Использование неразрешенного идентификатора« Guy » –

+0

Я только что обновил вопрос, пожалуйста, взгляните, я положил изображение внизу –

ответ

0

Это практически самый лучший способ справиться с этим. Другие методы беспорядочны, тогда как это самый развязанный естественный способ справиться с этим. Если у вас есть какие-либо вопросы, дайте мне знать.

extension GameViewController: GameDelegate { 
    func Kick() { 
     //-----Animate-Guy-----Working-Perfectly----------- 
     let KickAnimation = CAAnimation.animationWithSceneNamed("art.scnassets/The1Anima.dae")! 
     Guy.addAnimation(KickAnimation, forKey: "Go") 
     Guy.removeAnimationForKey("Go", fadeOutDuration: 3.0) 
    } 
} 

protocol GameDelegate { 
    func Kick() 
} 

class HUD: SKScene { 

    var delegate: GameDelegate? 

    override init(size: CGSize) { 
     super.init(size: size) 

     //this calls Kick anywhere in the HUD class 
     delegate?.Kick() 


     //----A-Button--Creation ------------------- 
     ButtonA.size = CGSize(width: 7, height: 11) 
     ButtonA.anchorPoint = CGPointMake(-11.35, -0.6) 
     ButtonA.zPosition = 0 
     ButtonA.alpha = 0.45 
     self.addChild(ButtonA) 
    } 
} 

после того, как линии, которая находится внутри viewDidLoad GameViewController (в)

//below this line 
self.HUDView = HUD(size: CGSizeMake(100, 100)) 
//add in 
self.HUDView.delegate = self 

После всего этого, добавляется в систему, вы можете удалить копию кика, который не в расширении. Оба контроллера могут получить доступ к этой функции.

+0

Хорошо немного смутился, поэтому я поставил расширение и протокол на верхушка моего контроллера HUD, тогда я прекрасно добавляю строку self.HUDView.delegate = self, но тут я был смущен, и я поставил «var delegate: GameDelegate?» прямо под «Класс HUD: SkScene», но затем я получаю сообщение об ошибке «не может переопределить свойство с типом« SkSceneDelegate ». А также есть «viewDidLoad()» в классе HUD –

+0

ok Позвольте мне попробовать сейчас, если это хорошо, что я уверен, что его большой, а затем плохо отмечают его как ответ –

+0

ok все хорошо, за исключением этой ошибки, которая мешает мне запускать программу , На var delelgate: GameDelegate? "error Свойство 'delegate' с типом 'GameDelegate?' не может переопределить propety с типом 'SKSceneDelegate?' (aka «Необязательный ») –

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