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

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

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

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

2434閲覧

swiftでのゲーム作成 配列について

yoyoyo

総合スコア14

SpriteKit

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/03/29 14:55

市販の本を参考にゲームを作っていますが、
enemySprite[i].position.y -= enemySpeed[i]
この一文でエラーになってしまいどうすることもできなくなってしまいました。
何が問題でどのようにすれば良いでしょうか?
エラーで出る文面は、
Thread1:EXC_BAD_INSTRUCTION(code=EXC_l386_INVOP.subcode=0×0)や、
CUICatalog: Invalid Request: requesting subtype without specifying idiom
fatal error: Array index out of range
(lldb) 等です。

swift

1 2import SpriteKit 3 4let rocket = SKSpriteNode(imageNamed:"myself.png") 5//敵の準備をする 6var enemyCount = 8 7var enemySpeed:[CGFloat] = [] 8var enemySprite:[SKSpriteNode] = [] 9 10//このシーンを作る 11class GameScene: SKScene { 12 13 //シーンの最初に一度だけ呼ばれる処理 14 //このシーンで通して使うものを配置 15 override func didMoveToView(view: SKView) { 16 //背景色をつける 17 self.backgroundColor = UIColor(colorLiteralRed: 0.04, green: 0.03, blue: 0.4, alpha: 0.03) 18 //ロケットを表示する,初期位置 19 rocket.position = CGPoint(x: 500, y: 100) 20 //大きさ調整 21 rocket.xScale = 0.1 22 rocket.yScale = 0.1 23 //ロケットをシーンに追加 24 self.addChild(rocket) 25 } 26 27 override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 28 for touch: AnyObject in touches { 29 //ロケットをタッチした位置の少し上に表示する 30 rocket.position = touch.locationInNode(self) 31 rocket.position.y += 120 32 } 33 } 34 35 //敵を作る作業をまとめておく 36 //initはイニシャライズの略 37 func initEnemy() { 38 for i in 0 ... enemyCount{//0〜enemycountまで繰り返す 39 //画面の上の方に隕石を作って表示し、そこから降らせる 40 let enemy = SKSpriteNode(imageNamed: "enemy1.png") 41 let ex = Int(arc4random_uniform(750)) 42 let ey = Int(arc4random_uniform(1334) + 1334) 43 enemy.position = CGPoint(x: ex, y: ey) 44 self.addChild(enemy) 45 //作った敵を配列に追加する 46 enemySprite.append(enemy) 47 //敵の移動スピードをランダムに用意して配列に追加する 48 let speed = CGFloat(arc4random_uniform(15)+5) 49 enemySpeed.append(speed) 50 51 52 53 54 } 55 } 56 //敵を動かす処理 57 func moveEnemy() { 58 for i in 0 ... enemyCount {//0〜enemycountまで繰り返す 59 enemySprite[i].position.y -= enemySpeed[i] 60 //もし画面の下まで来たら 61 if enemySprite[i].position.y < 0{ 62 //画面の上までランダムに移動する 63 let ex = Int(arc4random_uniform(750)) 64 let ey = 1334 65 enemySprite[i].position = CGPoint(x: ex, y: ey) 66 let speed = CGFloat(arc4random_uniform(25)+5) 67 enemySpeed[i] = speed 68 } 69 } 70 71} 72 //素早く繰り返す仕組み最速で1/60秒ごとに呼び出される 73 override func update(currentTime: CFTimeInterval) { 74 moveEnemy() 75 } 76 77 78 79}

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

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

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

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

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

guest

回答2

0

ベストアンサー

for i in 0 ... enemyCountも気になったんですが、
それ以前にinitEnemy()をどこから呼び出していますか?

initEnemy()が最初にちゃんと呼び出されていれば、その中でfor i in 0 ... enemyCountを使って0〜enemyCount(8)までの9個分の要素が作られるので、
moveEnemy()の中でfor i in 0 ... enemyCountで処理しても一応0〜enemyCount(8)までの9個分の処理がされるだろうと思いました。
(たぶん、本当は8個分作って処理したかったのだと思いますので、そうするにはyubaさんの回答を読んでください)

で、ここで例外が発生したということは、そもそもinitEnemy()がどこからも呼ばれてなくて
enemySpriteやenemySpeedの配列要素が1個も作られていないような気がしたのですがいかがでしょうか?

こういうエラーで悩むということは、基本的なプログラムのデバッグ方法がわかってないのだと思いますので、
http://blogios.stack3.net/archives/776
等を参考に、実行しているプログラムを途中で止めて、その時の変数状態を確認する方法を身につけることをお勧めします。
それができるようになれば自分でいろいろ調べて解決できます。

投稿2016/03/29 15:37

TakeOne

総合スコア6299

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

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

yoyoyo

2016/03/29 15:52

ありがとうございます その通りでした。 教えていただいたサイトで勉強します!
guest

0

その前の行、

for i in 0 ... enemyCount

がおかしいですね。

for i in 0 ..< enemyCount

でないと。

エラーの文言にちゃんと Array index out of range と答が書かれているではありませんか。

投稿2016/03/29 15:02

yuba

総合スコア5568

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

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

yoyoyo

2016/03/29 15:42

ありがとうございます。 func moveEnemy() { for i in 0 ..< enemyCount {//0〜enemycountまで繰り返す enemySprite[i].position.y -= enemySpeed[i] で合ってますでしょうか? まだ強制終了されてしまうのですが...他にも気づいたことがあればお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問