2015-08-12 3 views
1

Я создал проект SpriteKit и определил функцию в файле GameScene.swift. Указанная функция создает SKSpriteNode и без проблем запускается при вызове внутри класса.Как вы называете функцию, определенную в другом классе?

func generateShip() { 
    self.removeAllChildren() 
    let SKSprite1 = SKSpriteNode(imageNamed: "Spaceship") 
    SKSprite1.size = CGSize(width: CGFloat(arc4random_uniform(UInt32(200))), height: CGFloat(arc4random_uniform(UInt32(200)))) 
    SKSprite1.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
    self.addChild(SKSprite1) 
} 
//if I called it here with touchesBegan, it worked. 

Теперь, в моем ViewController, я создал простую кнопку и связал ее с ее быстрым файлом. Я сделал несколько вещей перед следующим кодом, но это та часть, с которой у меня проблемы.

let gameScene = GameScene() 

@IBAction func newShip(sender: AnyObject) { 
    gameScene.generateShip() // am I doing this wrong? 
} 

При запуске приложения и нажатии кнопки ничего не происходит. Что мне нужно изменить/сделать, чтобы функция ... хорошо ... функция?

Ссылки: Full Code, Iphone

+0

вы телеграфировать вашей сцены игры в остальной части приложения? –

+0

Где эта строка в коде? 'let gameScene = GameScene()'. Похоже, вы не можете работать с правильным экземпляром сцены. –

+0

Я также интересуюсь полным кодом, в котором вы создаете и представляете свой GameScene –

ответ

2

Проблема в этом коде:

let gameScene = GameScene() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let skView = self.view as! SKView 
    skView.presentScene(GameScene(fileNamed: "GameScene")) 
} 

Ваш gameScene свойство не такой же, как на сцене вы представили. Это два отдельных объекта. Вам нужно сделать две вещи.

  1. Изменить ваше gameScene заявление, чтобы быть похожим на новый, созданный в коде предлежащей.Как так:

    let gameScene = GameScene(fileNamed: "GameScene") 
    
  2. В viewDidLoad, представьте, что GameScene объект вместо того, чтобы сделать новую, как это:

    skView.presentScene(gameScene) 
    

Таким образом, вы создаете один GameScene объект, настоящее и вызовите generateShip() на том же объекте.

+0

О, черт возьми, отлично. Спасибо, что помогли мне в этом разобраться. Цените это человек. – Austin

+0

Без проблем, рад помочь :) –

2

В теории Swift должен быть в состоянии связать все файлы автоматически, что внутри вашего проекта, так что ваш код должен быть в состоянии работать в одиночку. Однако единственная проблема, которая может возникнуть, заключается в том, что теперь вы также полагаетесь на StoryBoard, поэтому вам нужно убедиться, что они правильно связаны. Убедитесь, что its linked correctly.

Отъезд this question для получения дополнительной информации о связи с Swift.

EDIT: Кроме того, посмотрите на свой код. Вы вызываете функцию для космического корабля на самом классе, а не на экземпляр его, поэтому поэтому его, вероятно, не работает. Вам нужно сначала инициализировать gameScene, а затем использовать эту сцену для вызова метода. Я думаю, что это может быть намного больше, поэтому мой совет будет заключаться в том, чтобы держать все внутри вашего класса gameScene и создавать там кнопку спрайта.

+0

Да, это то, что я намеревался сделать вначале, но мне было любопытно, можете ли вы сделать это с помощью UIButton. Цените наконечник, хотя. – Austin

1

Ваш код кажется прекрасным для меня.

Если возникла проблема с доступом с кодом неизвестного класса/модуля и т. Д., Вы получите предупреждение об этом компилятору. Кажется, это не так.

Мое предположение: ваша кнопка неправильно подключена! Двойной щелчок, который вызывает @IBAction func newShip(sender: AnyObject), когда вы нажимаете кнопку: установите контрольную точку внутри функции newShip.

Редактировать: И если он останавливается на этом: перейдите в функцию, используя отладчик.

+0

Да, он остановился, когда я установил точку останова. Спасибо за предложение. – Austin

+0

хорошо, хорошо! Затем продолжайте использовать отладчик, входите в функцию и смотрите, что там происходит. – Goodsquirrel

0

Вы неправильно используете два разных экземпляра GameScene в своем контроллере просмотра! Один из них добавляется в иерархию представлений, и при нажатии кнопки вызывается экземпляр OTHER.

Это не может быть видно из кода в исходный вопрос, но из кода вы предоставили в комментарии: screenshot of full code

В контроллере представления вашего сначала создать GameScene с:

let gameScene = GameScene() 

, но тогда вы создаете и добавление второго экземпляра GameScene в иерархии представлений с:

skView.presentScene(GameScene(fileNamed:"GameScene")) 

и вашей кнопки действия кал ls метод generateShip() по первому объекту, хранящемуся в gameScene, который не был представлен SKView.

Таким образом, решение, чтобы изменить приведенный выше код:

let gameScene = GameScene(fileNamed:"GameScene")) 

и позже:

skView.presentScene(gameScene) 
Смежные вопросы