初めまして。
長文失礼します。
swiftではじめるiPhone開発の教科書(森 巧尚)を参考にさせて頂いて、色と音を使ったアプリケーションを作成しています。
swift初心者で、何も分からずにプログラムを書いているので、おかしなプログラムになっていると思います。
すみません。
上記に書いているように「色と音を使ったアプリケーション(ゲーム)」を作成しています。
色と音は「ド=赤」「レ=オレンジ」「ミ=黄色」「ファ=緑」「ソ=水色」「ラ=青」「シ=紫」といったような対応関係になっています。
1つだけ異なる色のボールをタッチをすると消える、といった形にしています。
今はランダムで色のついたボールが出現するようになっていますが、これを1曲の曲になるようにボールを出現させたいと思っています。
(例:ドレミの歌
ドレ→ミ→ファ→ミ→レ→ド・・・→ミ→レ→ド(終了)
の順に対応した色のボールが落ちてくる(「→=タッチ」です))
「questionNo = randomSource.nextIntWithUpperBound(correct.count)」の部分のランダムを配列にすればいいのではないかと試行錯誤してみましたがわかりませんでした。
説明が下手で申し訳ございません。
よろしくお願いします。
import SpriteKit
import GameplayKit
import AVFoundation
class GameScene: SKScene {
// ランダムを使う準備をします let randomSource = GKARC4RandomSource() // 間違い番号の変数を用意します var mistakeNo = 0 // メッセージを表示するラベルノードを作ります let msgLabel = SKLabelNode(fontNamed: "HiraKakuProN-W3") var msg:String = "違う色をタッチしよう" // 漢字を入れるボール数を6個にします let ballMax = 6 // ボールを入れておく配列を用意します var ballList:[SKShapeNode] = [] // 問題を配列で用意します let correct = [ SKColor.redColor(),SKColor.orangeColor(),SKColor.yellowColor(),SKColor.greenColor(), SKColor.cyanColor(),SKColor.blueColor(),SKColor.magentaColor()] // 問題の番号の変数を用意します var questionNo = 0 override func didMoveToView(view: SKView) { // 物理シミュレーション空間サイズを作ります self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) // 背景を白にします self.backgroundColor = UIColor.whiteColor() // メッセージラベルを表示します msgLabel.text = msg msgLabel.fontSize = 36 msgLabel.fontColor = UIColor.blackColor() msgLabel.position = CGPoint(x: 320, y: 1080) self.addChild(msgLabel) // 次の問題を出題します newQuestion() } // 出題するメゾッド func newQuestion(){ // 問題番号を決めます questionNo = randomSource.nextIntWithUpperBound(correct.count) // 間違い番号をランダムに決めます mistakeNo = ballMax - 1 // ボールの配列をリセットします ballList = [] // ballMax個のボールを作ります for loopID in 0..<ballMax - 1{ // ボールをシュープノードで作ります 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 * 100 + 70, y: 1000) // シーンに表示します self.addChild(ball) // ボールの配列に追加します ballList.append(ball) // ボールを画面の上の方にランダムに配置します let wx = randomSource.nextIntWithUpperBound(440) + 100 let wy = randomSource.nextIntWithUpperBound(200) + 800 ball.position = CGPoint(x: wx, y: wy) // 円の物理シミュレーション物体を作って結びつけます ball.physicsBody = SKPhysicsBody(circleOfRadius: 45) // ボールの反発力を少し上げます ball.physicsBody?.restitution = 0.3 } for loopID in 0...0{ // ボールをシュープノードで作ります let mball = SKShapeNode(circleOfRadius: 45) mball.fillColor = correct[questionNo] mball.position = CGPoint(x: loopID * 100 + 70,y: 1000) // シーンに表示します self.addChild(mball) // ボールの配列に追加します ballList.append(mball) // ボールを画面の上の方にランダムに配置します let wx = randomSource.nextIntWithUpperBound(440) + 100 let wy = randomSource.nextIntWithUpperBound(200) + 800 mball.position = CGPoint(x: wx, y: wy) // 円の物理シミュレーション物体を作って結びつけます mball.physicsBody = SKPhysicsBody(circleOfRadius: 45) // ボールの反発力を少し上げます mball.physicsBody?.restitution = 0.3 } } override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?){ // 1つのタッチ情報を取り出します for touch in touches { // タッチした位置にあるノードを全て調べます let location = touch.locationInNode(self) let touchNodes = self.nodesAtPoint(location) // ノード1つ1つについて調べます for tNode in touchNodes { // ボールの配列と比較して for loopID in 0..<ballMax { // タッチしたノードとボールが同じなら if tNode == ballList[loopID] { print("ボール\(loopID)をタッチしました") // print("ボール\()をタッチしました") answerCheck(loopID) break } } } } } // チェックメソッド func answerCheck(No:Int) { // 番号が間違い番号なら正解、そうでないなら不正解を表示します if No == mistakeNo { if correct[questionNo] == correct[0] { // 効果音データの作成(ド=赤) let mySoundAction: SKAction = SKAction.playSoundFileNamed("1do.mp3", waitForCompletion: true) // 再生アンクション self.runAction(mySoundAction); } if correct[questionNo] == correct[1] { // 効果音データの作成(レ=オレンジ) let mySoundAction: SKAction = SKAction.playSoundFileNamed("2re.mp3", waitForCompletion: true) // 再生アンクション self.runAction(mySoundAction); } if correct[questionNo] == correct[2] { // 効果音データの作成(ミ=黄色) let mySoundAction: SKAction = SKAction.playSoundFileNamed("3mi.mp3", waitForCompletion: true) // 再生アンクション self.runAction(mySoundAction); } if correct[questionNo] == correct[3] { // 効果音データの作成(ファ=緑) let mySoundAction: SKAction = SKAction.playSoundFileNamed("4fa.mp3", waitForCompletion: true) // 再生アンクション self.runAction(mySoundAction); } if correct[questionNo] == correct[4] { // 効果音データの作成(ソ=水色) let mySoundAction: SKAction = SKAction.playSoundFileNamed("5so.mp3", waitForCompletion: true) // 再生アンクション self.runAction(mySoundAction); } if correct[questionNo] == correct[5] { // 効果音データの作成(ラ=青) let mySoundAction: SKAction = SKAction.playSoundFileNamed("6ra.mp3", waitForCompletion: true) // 再生アンクション self.runAction(mySoundAction); } if correct[questionNo] == correct[6] { // 効果音データの作成(シ=紫) let mySoundAction: SKAction = SKAction.playSoundFileNamed("7si.mp3", waitForCompletion: true) // 再生アンクション self.runAction(mySoundAction); } msg = "正解!" // 画面上のボールを削除します for loopID in 0..<ballMax { ballList[loopID].removeFromParent() } // 次の問題を出題します newQuestion() } else{ msg = "不正解!" } msgLabel.text = msg } override func update(currentTime: CFTimeInterval) { /* Called before each frame is rendered */ }
}