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

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

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

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

Swift

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

Q&A

解決済

1回答

1174閲覧

spritekitのUserDefaultsのスコープについて

panda_man

総合スコア20

SpriteKit

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

Swift

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

0グッド

0クリップ

投稿2018/12/31 21:26

編集2018/12/31 21:29

spritekitで、画面タッチしたら次の文字列を表示する処理を作るために、setで配列を保存して、stringArrayでStringの配列をよみとり、ひとつずつ表示していくような処理をしたのですが,「スレッド1:致命的エラー:インデックスが範囲外」となってしまい、うまくできません。自分ではタッチしてcountに足していく方法しか思いつかず、どうしたらいいのかわからずつまっている状況なので、どうかお願いします。

import Foundation import SpriteKit import UIKit class River: SKScene { let window = SKSpriteNode(imageNamed: "メッセージ.png") var count = 0 var listText:[SKLabelNode] = [SKLabelNode(), SKLabelNode(), SKLabelNode()] var theList2:[String] = [] override func didMove(to view: SKView) { let back = SKSpriteNode(imageNamed: "川.png") back.size = CGSize(width: self.size.width, height: self.size.height) back.position = CGPoint(x: self.size.width/2, y: self.size.height/2) addChild(back) window.anchorPoint = CGPoint(x: 0, y: 0) window.size = CGSize(width: self.size.width , height: self.size.height / 5) addChild(window) //setの処理 let list = ["a","b","c"] UserDefaults.standard.set(list,forKey: "myList") UserDefaults.standard.synchronize() //readの処理 if let theList = UserDefaults.standard.stringArray(forKey: "myList"){ theList2 = theList } } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { print(count) print(theList2[count]) var listText2:[SKLabelNode] = [] listText2.append(listText[count]) listText2[count].text = theList2[count] //スレッド1:致命的エラー:「インデックスが範囲外」とでててしまいます。 listText2[count].position = CGPoint(x: 100, y: 0) addChild(listText2[count]) count += 1 } }

デバックエリア:
2019-01-01 06:16:45.623940 + 0900 Gametest [1913:648131] Interface Builderファイルのクラス_TtC8Gametest6SKViewが不明です。
2019-01-01 06:16:45.624681 + 0900ゲームテスト[1913:648131]メタルGPUフレームキャプチャ有効
2019-01-01 06:16:45.625283 + 0900 Gametest [1913:648131] Metal API検証が有効になりました
0
a
1
b
(lldb)

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーが出ている原因はUserDefaultsとは関係ありません。
touchesBeganの中で

swift

1var listText2:[SKLabelNode] = [] 2listText2.append(listText[count])

でlistText2という新しい配列を用意し、
そこにlistText[count]を1個だけ追加している
(つまりlistText2の要素はlistText2[0]の1個しか存在していない)のに、
2回目のタップ(つまりcount=1)で
listText2[count].text = theList2[count]を実行して
listText2[1]にアクセスしようとして、
配列の範囲外アクセスのエラーになったのだと思います。

ここでやりたいのはlistTextのcount番目に入っているSKLabelNodeに
値をセットしてaddChildしたいということだと思うので、
そもそもlistText2は不要で、

swift

1listText[count].text = theList2[count] 2listText[count].position = CGPoint(x: 100, y: 0) 3addChild(listText[count])

でよさそうに思います。
ただ、listTextやtheList2の配列要素数が3個しかないので、
このままでは4回目のタップでまた範囲外アクセスのエラーになると思います。

投稿2019/01/02 00:29

TakeOne

総合スコア6299

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

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

panda_man

2019/01/04 01:58

丁寧にありがとうございました!おかげで解決しました。 実家に帰っていたため返信が遅くなってしまい申し訳ありません。 また質問があるときに助けていただけたら、ありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問