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

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

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

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

Q&A

解決済

1回答

1487閲覧

swiftのエラーメッセージ

kou20

総合スコア5

Swift

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

0グッド

0クリップ

投稿2016/05/28 04:22

###前提・実現したいこと
プログラミング言語初めてで、Swiftでゲームを作っているのですが、タッチするとazarashiが上に上がるというというのをしたいのですがエラーが出てしまい、わかりません。
何が問題なのでしょうか?
###発生している問題・エラーメッセージ

エラーメッセージ EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP,subcode=0x0) ###該当のソースコード ```ここに言語を入力 import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { view.multipleTouchEnabled = false self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) let noboru1 = SKSpriteNode() noboru1.physicsBody = SKPhysicsBody(rectangleOfSize: noboru1.size) noboru1.physicsBody?.friction = 0.5 let yukaSize = CGSizeMake(875.957, 52.089) let yukaColor = SKColor.redColor() let yuka = SKSpriteNode(color: yukaColor, size: yukaSize) self.addChild(yuka) let azarashi = SKSpriteNode(imageNamed: "azarashi") azarashi.physicsBody = SKPhysicsBody(circleOfRadius: azarashi.size.height/2) azarashi.physicsBody?.friction = 0.2 azarashi.position = CGPoint(x:CGRectGetMidX(self.frame) ,y:CGRectGetMidY(self.frame)) self.addChild(azarashi) } override func update(currentTime: CFTimeInterval) { /* Called before each frame is rendered */ } override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?){ let azarashi = childNodeWithName("azarashi") azarashi!.physicsBody?.velocity = CGVectorMake(0, 0) /ここでエラーがでます/ azarashi!.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 30)) } ###試したこと 課題に対してアプローチしたことを記載してください Optionalが原因だということが検索して調べたら判りました。 ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず基本として、このようなエラーが出た時のデバッグ方法については
https://teratail.com/questions/36126
を参考にしてください。
で「Optionalが原因だということが検索して調べたら判りました」ということは、おそらく
「fatal error: unexpectedly found nil while unwrapping an Optional value」
というエラーメッセージがOutputウインドウに表示されたのだろうと思います。

であれば、そのエラーが発生してデバッガーで停止している状態で変数表示ウインドウや変数出力コマンド等で変数の値を出力してnilになっている変数がないか確認してください。

今回は、それを確認すればazarashiという変数がnilであることがわかると思います。
azarashiがnilだということは、それを格納する処理let azarashi = childNodeWithName("azarashi")childNodeWithName("azarashi")がnilを返してきた、つまりazarashiというノード名を持つノードが見つからなかったということです

なぜazarashiノードを見つけられなかったのかを調べるために、基本的なノード登録処理とazarashiの登録処理を調べて、必要な処理が行われているか確認してください。
基本的なノード登録処理は
http://qiita.com/Twintaro/items/12ae4ebc5bce11ece499
とかが、あなたの処理とよく似ていて参考になると思います。
すると、このサイトの説明ではSKSpriteNodeのnameプロパティにノード名を登録しているのに、あなたのazarashiには"azarashi"という名前を登録してないことがわかります。
つまり、let azarashi = SKSpriteNode(imageNamed: "azarashi")でazarashiを作成したら、
azarashi.name = "azarashi"
でノード名を登録する必要があるということです。
(ちなみにimageNamed:に指定している"azarashi"はノード名ではなく、ノードの画像を格納している画像ファイル名です。)
これを追記すれば、childNodeWithName("azarashi")でazarashiがちゃんと検索できるようになり、とりあえず今のエラーは解消されると思います。

投稿2016/05/28 09:04

編集2016/05/28 09:13
TakeOne

総合スコア6299

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

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

kou20

2016/05/28 10:34

回答していただきありがとうございました。無事解決することができました。ノードの登録だけでなくデバックについても詳しく書かれていたので大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問