2016-01-11 2 views
0

Я пытаюсь вызвать функцию из другого класса в моем комплекте спрайт/быстрой игры с этим кодом:Вызов функции из другого класса в Swift

class StarNode: GameObjectNode { 
    override func collisionWithBall(ball: SKNode) -> Bool { 
     endGame() 

     return true 
    } 
} 

Эта функция находится в другом классе:

func endGame() { 
    gameOver = true 
    GameFile.sharedInstance.saveState() 

    let reveal = SKTransition.fadeWithDuration(0.5) 
    let endGameScene = GameOverScene(size: self.size) 
    self.view!.presentScene(endGameScene, transition: reveal) 
} 

Но когда я звоню endGame() Я получаю это сообщение: Отсутствует аргумент для параметра № 1 при вызове.

Я попытался заставить его работать, но безуспешно. Что я могу сделать, чтобы заставить его работать?

ответ

0

Чтобы вызвать метод другого класса, вам сначала нужно создать объект этого (другого) класса и функцию класса с этим объектом.

Что-то вроде этого,

имя Пусть класс будет AnotherClass, в котором ваша функция EndGame() есть.

class StarNode: GameObjectNode { 
override func collisionWithBall(ball: SKNode) -> Bool { 

let obj = AnotherClass() 
obj.endGame() 
    return true 
    } 
} 
+0

Спасибо за ответ, но когда я использую этот код, я получаю это сообщение: «Невозможно вызвать инициализатор для типа« GameScene »без аргументов» –

+0

Проверьте метод инициализации (т.е. init) вашего класса GameScene, он должен иметь какой-то аргумент, поэтому при инициализации вашего класса вам необходимо передать эти параметры. Если все еще не ясно, дайте мне знать, я дам вам ссылку. –

+0

Я не думаю, что это решение, которое ищет OP.Экземпляр «AnotherClass» в этом примере (я полагаю, «GameScene» в приложении OP: s уже инициализирован и --- императивно --- не «активен». С помощью вышеприведенного решения вы создаете новый неуместный экземпляр GameScene и пытаетесь вызвать '.endGame()' в этом новом экземпляре. Это сопоставимо с созданием случайного экземпляра MyViewController в приложении, чтобы попытаться получить доступ к некоторому методу в экземпляре _actual_ MyViewController, который в настоящее время не является сценой в приложении. Вместо этого подхода я предлагаю использовать делегаты между двумя классами. – dfri

0

Протоколы - это, вероятно, лучший способ общения между классами, особенно если вы хотите, чтобы ваш код был таким, каким он есть.

Над классом starNode вы добавить свой протокол

protocol StarNodeDelegate: class { 
    func endGame() 
} 

чем добавить свойство к классу starNode

weak var delegate: StarNodeDelegate? 

Так что теперь ваш класс starNode должен выглядеть следующим образом.

protocol StarNodeDelegate: class { 
    func endGame() 
} 

class StarNode: GameObjectNode { 

weak var delegate: StarNodeDelegate?  


override func collisionWithBall(ball: SKNode) -> Bool { 
    delegate?.endGame() 

    return true 
    } 
} 

Теперь в сцене, где столкновение происходит и GameOver FUNC, я полагаю, у вас есть экземпляр starNode создан, чтобы получить доступ к классу StarNode вы сделали.

например.

let starNode = StarNode(... 

Теперь вам нужно сделать этот класс подтвержденным протоколом, который вы создали.

class GameScene: SKScene, StarNodeDelegate { 

} 

чем в ViewDidLoad после создания экземпляра starNode добавить этот код

starNode.delegate = self // telling the scene to confirm to the protocol 

и вуаля ваш

func endGame() 

будет вызван.

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