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

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

ただいまの
回答率

90.49%

  • Swift

    7457questions

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

  • Swift 2

    1334questions

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

  • ゲーム開発

    167questions

  • SpriteKit

    114questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 673

yoyoyo

score 8

市販の本を参考にゲームを作っていますが、
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) 等です。

import SpriteKit

let rocket = SKSpriteNode(imageNamed:"myself.png")
//敵の準備をする
var enemyCount = 8
var enemySpeed:[CGFloat] = []
var enemySprite:[SKSpriteNode] = []

//このシーンを作る
class GameScene: SKScene {

    //シーンの最初に一度だけ呼ばれる処理
    //このシーンで通して使うものを配置
    override func didMoveToView(view: SKView) {
        //背景色をつける
        self.backgroundColor = UIColor(colorLiteralRed: 0.04, green: 0.03, blue: 0.4, alpha: 0.03)
        //ロケットを表示する,初期位置
        rocket.position = CGPoint(x: 500, y: 100)
        //大きさ調整
        rocket.xScale = 0.1
        rocket.yScale = 0.1
        //ロケットをシーンに追加
        self.addChild(rocket)
    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch: AnyObject in touches {
            //ロケットをタッチした位置の少し上に表示する
            rocket.position = touch.locationInNode(self)
            rocket.position.y += 120
        }
    }

    //敵を作る作業をまとめておく
    //initはイニシャライズの略
    func initEnemy() {
        for i in 0 ... enemyCount{//0〜enemycountまで繰り返す
            //画面の上の方に隕石を作って表示し、そこから降らせる
            let enemy = SKSpriteNode(imageNamed: "enemy1.png")
            let ex = Int(arc4random_uniform(750))
            let ey = Int(arc4random_uniform(1334) + 1334)
            enemy.position = CGPoint(x: ex, y: ey)
            self.addChild(enemy)
            //作った敵を配列に追加する
            enemySprite.append(enemy)
            //敵の移動スピードをランダムに用意して配列に追加する
            let speed = CGFloat(arc4random_uniform(15)+5)
            enemySpeed.append(speed)




        }
    }
        //敵を動かす処理
        func moveEnemy() {
            for i in 0 ... enemyCount {//0〜enemycountまで繰り返す
                enemySprite[i].position.y -= enemySpeed[i]
                //もし画面の下まで来たら
                if enemySprite[i].position.y < 0{
                    //画面の上までランダムに移動する
                    let ex = Int(arc4random_uniform(750))
                    let ey = 1334
                    enemySprite[i].position = CGPoint(x: ex, y: ey)
                        let speed = CGFloat(arc4random_uniform(25)+5)
                    enemySpeed[i] = speed
              }
            }

}
    //素早く繰り返す仕組み最速で1/60秒ごとに呼び出される
    override func update(currentTime: CFTimeInterval) {
         moveEnemy()
    }



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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

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/30 00:52

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

    キャンセル

0

その前の行、

for i in 0 ... enemyCount


がおかしいですね。

for i in 0 ..< enemyCount


でないと。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/30 00:42

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

    キャンセル

関連した質問

  • 解決済

    [swift2]extensionを使用してクラスを拡張したい

    前提・実現したいこと 用意したimageViewに表示した画像から、指定した座標の色情報を取り出したい. その為にUIImageを拡張したい。 発生している問題・エラーメッセー

  • 解決済

    パスの線を徐々に描いていくアニメーション

    UIBezierPathを使ったアニメーションで、線を徐々に描いていくようなアニメーションを実現させたいです。 なんとなくUIBezierPathとCAKeyFrameAni

  • 解決済

    Swift2, SpriteKitのSKActionについて質問です

    問題を出題して、違う答えをタップしたら ×と表示させて、その後消える。 と言った動きをしたいのですが、上手くいきません。 最初の一回目は上手くできるのですが、2回目以降が上手く

  • 解決済

    swift Button タップ スワイプ

    現在、タップとスワイプの二つを一つのボタンで行おうとしています。 ボタンをタップしたらUIViewを出して ボタンをスワイプしたらそのボタンが指に沿って移動する・・・

  • 解決済

    swift スワイプ 座標判定 XY

    前提・実現したいこと 毎度毎度すみません・・・ 現在swiftで作っていて、場所Aにオブジェクトをスワイプし オブジェクトが場所Aに少しでも入っていたら、 オブジェクトを消

  • 受付中

    classからUIButtonを作成したい

    viewcontrollerに複数のボタンを作成したいため、classを使って制御をしようと思いこのサイトを参考に作成しましたが、 self.view.addSubview(my

  • 解決済

    【Swift】CATransform3Dを使って画像を回転したい

    CATransform3Dを使って、画像をy軸もしくはx軸に回転する方法を教えてください。

  • 解決済

    Swift 3.1 touchsMovedメソッドでエラー

    前提・実現したいこと xcode8 swift3 spritekitを使用して かんたんなアプリを作成しており、 画面タップによって反応するtouches関連のメソッドの中に

同じタグがついた質問を見る

  • Swift

    7457questions

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

  • Swift 2

    1334questions

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

  • ゲーム開発

    167questions

  • SpriteKit

    114questions

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