質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

405閲覧

画面推移後もSKSceneが稼働し続けてしまうのを止めたい

Hkr-Y

総合スコア96

SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/01/24 05:47

問題

SKSceneが下位層にあるViewControllerから別のViewControllerへ画面推移するとSKSceneが裏で稼働したまま、推移後の画面に移ってしまいます。

やりたいこと

画面推移が完了すると、SKSceneの活動を停止したい。

コード

swift

1//ViewController 2 3 //ResultViewControllerとTestViewControllerは別々のswiftファイルに書いてあります。 4 //可読性を高めるために分けずに記入してあります。 5class ResultViewController: UIViewController { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 } 10} 11 12class TestViewController: UIViewController, ChangeViewDelegate { 13 14 let mainSKView = MainSKView() 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 mainSKView.chageViewDlgt = self 20 self.view.addSubview(mainSKView) 21 22 //mainSKViewの位置等の細かい設定は省略しました。 23 } 24 func changeView(){ 25 let resultViewController = self.storyboard?.instantiateViewController(withIdentifier: "ResultViewController") as! ResultViewController 26 self.present(resultViewController, animated: true, completion: nil) 27 28 } 29}

swift

1// SKView 2protocol MainSKViewDelegate { 3 func reloadScore(score: Int) 4 func setResultView(result: Bool) 5} 6 7protocol ChangeViewDelegate { 8 func changeView() 9} 10 11class MainSKView: SKView, MainSKViewDelegate { 12 13 var mainGameScene: MainGameScene? 14 var chageViewDlgt: ChangeViewDelegate? 15 16 override init(frame: CGRect) { 17 super.init(frame: frame) 18 19 if let scene = SKScene(fileNamed: "MainGameScene") { 20 21 mainGameScene = scene as? MainGameScene 22 mainGameScene?.mainSKViewDlgt = self 23 scene.scaleMode = .aspectFill 24 self.presentScene(scene) 25 } 26 } 27 28 func setResultView(result: Bool) { 29 if result { chageViewDlgt?.changeView() } 30 } 31 32 required init?(coder: NSCoder) { 33 fatalError("init(coder:) has not been implemented") 34 } 35}

swift

1//SKScene 2 3class MainGameScene: SKScene { 4 5 var timer: Timer? 6 var time: Int = 0 7 var mainSKViewDlgt: MainSKViewDelegate? 8 9 override func didMove(to view: SKView) { 10 11 setTimer() 12 } 13 14 private func setTimer() { 15 timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { _ in self.setting() 16 }) 17 } 18 19 private func setting() { 20 time += 1 21 print("\(time)")// 画面推移後もこのprint()がプリントされ続けてしまう 22 23 if time == 5 { 24 mainSKViewDlgt?.setResultView(result: true) 25 } 26 } 27}

補足

不要だと判断したコードを勝手に省略したので、要所要所おかしな部分がありますが、本来のコードは正しく稼働します。
質問内容の修正が必要な場合はお申し付けください。即座に対応いたします。

この問題を解決できる方法をご存知の方、何卒ご教授ください。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomato45

2022/01/26 06:51

ただNotificationを使ってTestViewControllerにchangeViewを呼ばせればいいのでは?
guest

回答1

0

自己解決

無理やりタイマーを止めるということで問題を解決しました。しかしそれでSKSceneが停止しているのかはわかりませんでした。

投稿2022/02/02 00:00

Hkr-Y

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問