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

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

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

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

Swift

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

Q&A

1回答

1859閲覧

SpriteKitのタッチの処理の質問です

退会済みユーザー

退会済みユーザー

総合スコア0

SpriteKit

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

Swift

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

0グッド

1クリップ

投稿2015/11/23 15:55

初めまして。ゲスト投稿から失礼します。
質問させて頂ける機会にとても感謝しています。
swiftではじめるiPhone開発の教科書(森 巧尚)を参考に
タッチされた時に何をタッチされたか調べるコードを入力しているのですが、エラーになってしまいます。
他の参考書や色々と調べているのですが、参考になるのが見つかりません。お時間がありましたら、回答よろしくお願いします。

ダラダラとコードをお書きして失礼ですが、エラーになるのは、最後の方の
for tNode in touchNodes {
でエラーになります。
エラー内容は
Type"SKNode" not conform to protocol "SequenceType" です。

以下は詳細コードです。
import SpriteKit
import GameplayKit

class GameScene: SKScene {
//ランダム処理
let randomsAurce = GKARC4RandomSource()
//間違いの番号変数
var mistakeNO = 0

//メッセージ let msgLabel = SKLabelNode(fontNamed: "HiraKakuProN-W3") var msg:String = "違う漢字をタップ" let ballMax = 6 var ballList:[SKShapeNode] = [] override func didMoveToView(view: SKView) { self.backgroundColor = UIColor.whiteColor() //メッセージラベル msgLabel.text = msg msgLabel.fontSize = 36 msgLabel.fontColor = UIColor.redColor() msgLabel.position = convertPointFromView(CGPoint(x:130,y:50)) self.addChild(msgLabel) newQuestion()

}
//出題メソッド
func newQuestion() {
//ボール配列リセット
mistakeNO = ballMax
ballList = []

//ballMax個のボール作成 for loopID in 0..<ballMax { //ボールをシェイプノードで作成 let ball = SKShapeNode(circleOfRadius: 45) ball.fillColor = UIColor(red: 1.0, green: 0.9, blue: 0.6, alpha: 1.0) ball.position = CGPoint(x:loopID * 70 + 340,y:600) //シーンに追加 self.addChild(ball) //ボール配列に追加 ballList.append(ball) //漢字を表示するラベルノード let kanji = SKLabelNode(fontNamed: "HiraKakuProN-W6") //問題の設定 if loopID != mistakeNO { kanji.text = "問" }else { kanji.text = "間" } kanji.text = "問" kanji.fontSize = 60 kanji.fontColor = UIColor.blackColor() kanji.position = CGPoint(x:0, y:-25) ball.addChild(kanji)

}
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { for touche in touches { let location = touche.locationInNode(self) let touchNodes = self.nodeAtPoint(location) for tNode in touchNodes { for loopID in 0..<ballMax { if tNode = ballList[loopID] { print("ボール\(loopID)をタッチしました") break } } } } } func answer(NO:Int) { if NO == mistakeNO { msg = "正解" } else { msg = "不正解" } msgLabel.text = msg for loopID in 0..<ballMax { ballList[loopID].removeFromParent() } newQuestion() }

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

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

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

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

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

guest

回答1

0

著者の森です。

P377の動作確認ではエラーが出ていなくて、P378でエラーが出たのであれば、P378で書き足したところに問題があるということになりますね。そこをよく見てみてください。
P378には
let touchNodes = self.nodeAtPoint(location)
ではなく、
let touchNodes = self.nodesAtPoint(location)
と書いていますね。どこが違うかわかりますか?
たった一文字「s」が抜けています。
修正するとこのエラーはなくなります。
たったこれだけで違う処理になってしまうのです

ただし、このプログラムではその後もエラーが出そうですね。

if tNode = ballList[loopID] {

と書いてありますが、正しくは
if tNode == ballList[loopID] {
です。
「=」は値の代入で、「==」は値の比較なので意味が違ってしまいます。

どうしても動かないときは、本書の1ページ目にダウンロードサイトのURLがありますので、そこから動くファイルをダウンロードしてみてください。正しいファイルと比較することで違いがわかりますよ。

がんばってください。

それから、今回たまたま気がつきましたが、ここに質問されても気がつかないことがありますから、他にもわからないことがあれば次はサポートサイトにご質問くださいね。可能な限りお返事いたします。

投稿2015/11/23 18:13

編集2015/11/23 18:52
ymori_tw

総合スコア24

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

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

masayuki07

2015/11/24 14:49

回答ありがとうございます。 ここでつまづいて、ずっと悩んでいました。 何回も何十回も確認していたつもりだったのですが、入力ミスだと気付きませんでした。 サポートサイトもあるんですね! もう一度本を1からしっかりと読み直したいと思います。 それと森さんご本人で驚いています。 いつもこちらの本を参考に勉強しています。 とても分かりやすいです。 今まで本当にずっと悩み、初めて質問して、回答を頂いたのが森さんで 感謝しても感謝しきれません。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問