前回は判定ライン上でのボタンを押したときにエフェクト(視覚効果)を発生させる部分のプログラムについて説明しました。
今回は前回作ったプログラムにスコアとコンボの回数をカウントするプログラムを付け加えます。
音ゲーは、音楽のリズムに合わせてノートと呼ばれる目印(丸や四角形)を流したり、ボタンを押すタイミングによって得点や視覚エフェクトを変えたり、複数のボタンを押したときでも正確に同時処理を行う必要があったりと、内容が複雑で説明のポイントが多いのでテーマを絞って複数の記事に分けて説明しています。
音ゲーの作り方の第3回目は『スコアとコンボの回数をカウントする方法』について解説します。
完成品
この章の内容をご自身のScratch環境に反映すると、同じ動きを再現することができます。
完成した動き(第三形態)
この記事の内容で到達する状態のGIFアニメーションです。
前回つくった「BAD/GOOD/COOL」のエフェクトが表示されたときにスコアをそれぞれ「50/500/1000ポイント」ずつ増えるようにします。
また、「GOOD」か「COOL」が連続した場合にはコンボを1ずつカウントアップさせます。もし、「BAD」が表示されたり何もキーを押さなくてノートがステージ下端まで到達してしまったらコンボはクリアされて1から数え直しになります。
そのゲーム内でのコンボの最高記録は変数に保持されていて画面右上に表示します。
なお、この段階ではまだ音楽には対応していません。
完成した動き(最終形態)
完成形のイメージをつかんでもらうために最終形態のアニメーションの序盤部分を載せておきます。(フル版はファイルサイズが大きいため、別途ダウンロードできるようにしました)
GIF画像なので音声は聞こえませんが、実際のゲームではパッヘルベルのカノンの楽曲が流れていてその音楽のリズムに合わせてノートが落ちてきています。
mp3やwavの音源をアップロードして曲の長さ(秒)とBPM(1分間の拍数)を入力するだけで自動的にリズムに合わせてノートを生成する機能を付けました。どんな曲にも対応できます(これはちょっと難易度高めでした)
GIFアニメのフル版は下からダウンロード(右クリックで名前を付けてリンク先を保存)して見てください。↓↓↓ ただし、サイズが100MB近くありますので通信環境にご注意ください。
使用したスプライトと背景
スプライトは「Dノート」「Fノート」「Jノート」「Kノート」「DFJKキー押下」「判定ライン」「ノート生成」「エフェクト1」「エフェクト2」「エフェクト3」の10個、それと「ステージ」です。
【D/F/J/Kノートのスプライト】
前々回の記事を参照してください↓↓↓(※リンクをクリックすると対象の文章まで飛びます)
【Scratch 3.0】音楽 音ゲーの作り方①【ノートの生成とキーイベント】(Tips)
【DFJKキー押下のスプライト】
「DFJKキー押下」スプライトはプログラム専用なのでコスチュームはありません。
【判定ラインのスプライト】
前々回の記事を参照してください↓↓↓(※リンクをクリックすると対象の文章まで飛びます)
【Scratch 3.0】音楽 音ゲーの作り方①【ノートの生成とキーイベント】(Tips)
【ノート生成のスプライト】
「ノート生成」スプライトはプログラム専用なのでコスチュームはありません。
【エフェクト1のスプライト】
前回の記事を参照してください↓↓↓(※リンクをクリックすると対象の文章まで飛びます)
【Scratch 3.0】音楽 音ゲーの作り方②【3つのエフェクト(視覚効果)】(Tips)
【エフェクト2のスプライト】
前回の記事を参照してください↓↓↓(※リンクをクリックすると対象の文章まで飛びます)
【Scratch 3.0】音楽 音ゲーの作り方②【3つのエフェクト(視覚効果)】(Tips)
【エフェクト3のスプライト】
前回の記事を参照してください↓↓↓(※リンクをクリックすると対象の文章まで飛びます)
【Scratch 3.0】音楽 音ゲーの作り方②【3つのエフェクト(視覚効果)】(Tips)
【ステージ】
前々回の記事を参照してください↓↓↓(※リンクをクリックすると対象の文章まで飛びます)
【Scratch 3.0】音楽 音ゲーの作り方①【ノートの生成とキーイベント】(Tips)
使用した音源
前々回の記事を参照してください↓↓↓(※リンクをクリックすると対象の文章まで飛びます)
【Scratch 3.0】音楽 音ゲーの作り方①【ノートの生成とキーイベント】(Tips)
完成したスクリプト
完成したスクリプトの全体です。
前回・前々回の記事の内容と変更がないスクリプトは記載していませんので、それぞれの記事を参照してください。
【Dノートのスクリプト】
前回と変更がないスクリプト部分は省略しています。
- コンボ:すべてのスプライト用
- スコア:すべてのスプライト用
- ☆BAD☆回数:すべてのスプライト用
- ☆GOOD☆回数:すべてのスプライト用
- ☆COOL☆回数:すべてのスプライト用
【Fノートのスクリプト】
前回と変更がないスクリプト部分は省略しています。
- コンボ:すべてのスプライト用
- スコア:すべてのスプライト用
- ☆BAD☆回数:すべてのスプライト用
- ☆GOOD☆回数:すべてのスプライト用
- ☆COOL☆回数:すべてのスプライト用
【Jノートのスクリプト】
前回と変更がないスクリプト部分は省略しています。
- コンボ:すべてのスプライト用
- スコア:すべてのスプライト用
- ☆BAD☆回数:すべてのスプライト用
- ☆GOOD☆回数:すべてのスプライト用
- ☆COOL☆回数:すべてのスプライト用
【Kノートのスクリプト】
前回と変更がないスクリプト部分は省略しています。
- コンボ:すべてのスプライト用
- スコア:すべてのスプライト用
- ☆BAD☆回数:すべてのスプライト用
- ☆GOOD☆回数:すべてのスプライト用
- ☆COOL☆回数:すべてのスプライト用
【DFJKキー押下のスクリプト】
前回の記事の内容と同じです。
【判定ラインのスクリプト】
前々回の記事の内容と同じです。
【ノート生成のスクリプト】
前々回の記事の内容と同じです。
【エフェクト1のスクリプト】
前回の記事の内容と同じです。
【エフェクト2のスクリプト】
前回の記事の内容と同じです。
【エフェクト3のスクリプト】
前回の記事の内容と同じです。
【ステージのスクリプト】
前回と変更がないスクリプト部分は省略しています。
- コンボ:すべてのスプライト用
- スコア:すべてのスプライト用
- ☆BAD☆回数:すべてのスプライト用
- ☆GOOD☆回数:すべてのスプライト用
- ☆COOL☆回数:すべてのスプライト用
- MAXコンボ:すべてのスプライト用
スクリプトの作り方
ここからはプログラムを作っていく中でポイントとなる部分を説明します。
ポイント①:スコアとコンボをカウントアップする
前回の記事で「BAD/GOOD/COOL」のエフェクトをそれぞれ出し分ける条件について説明しました。今回はその条件をそのまま活用してスコアとコンボの回数をカウントするブロックを追加していきます。
下の図のように「エフェクト」定義ブロックの上か下かに「スコアを~ずつ変える」ブロックと「コンボを0にする」または「コンボを1ずつ変える」ブロックを追加します。ルールは以下です。
- BADのとき、スコア50ポイントUP、コンボは0クリア
- GOODのとき、スコア500ポイントUP、コンボは1ポイントUP
- COOLのとき、スコア1000ポイントUP、コンボは1ポイントUP
また、これはおまけですが「☆(BAD/GOOD/COOL)☆変数を1ずつ変える」ブロックも追加しています。このブロックは単純に「BAD」「GOOD」「COOL」がゲーム中にそれぞれ何回ずつ表示されたかをカウントしています。
これを「Dノート」「Fノート」「Jノート」「Kノート」の4つのスプライトに同じようにブロックを追加します。
「スコア」変数や「コンボ」変数は「すべてのスプライト用」で作っているので、どのスプライトからでも変数の値を更新することができます。
ポイント②:コンボをクリアする
コンボは「GOOD」か「COOL」が連続している限り、1ずつ増え続けます。しかし、「BAD」が表示されるかキーを押さなかったためにノートがステージ下端まで移動してしまった場合はコンボが0に戻ってしまいます。
下の図はポイント①でも説明した部分ですが、「BAD」が表示されたとき「コンボ」変数の値を0にしています。「D・F・J・K」の4つのノートのスプライトで同じようにプログラムを組みます。
もう1つ、ステージの下端まで移動するのは「0.2秒でx座標を~に、y座標をー180に変える」ブロックで行っているので、その直後に「コンボを0にする」ブロックで変数をクリアしています。これも「D・F・J・K」の4つのノートのスプライトで同じようにプログラムを組みます。
Scratchのステージの大きさは、縦360ピクセル×横480ピクセルです。座標の中央が(x座標, y座標)=(0, 0)の位置なのでx座標の範囲はー240~240まで、y座標の範囲は-180~180までとなっています。
ポイント③:コンボの最高記録を保持する
1回のゲームの中でコンボの最高記録を「MAXコンボ」変数に保持するようにします。
「コンボ」変数の値と「MAXコンボ」変数の値を比べて、「コンボ」の方が大きかったら「MAXコンボ」の値を「コンボ」の値で更新し、逆に「MAXコンボ」の方が大きかったらそのまま何もしない、という風にします。
ここまでのポイントを押さえれば、スコアとコンボの回数をカウントするためのスクリプトを完成させることができると思います。
失敗しやすいポイント
スコアとコンボの回数カウントを一か所にまとめてみた
今回、スコアやコンボの回数をカウントするのに「スコアを~ずつ変える」ブロックや「コンボを~ずつ変える」ブロックを「D・F・J・K」それぞれのノートスプライトに同じブロックを組み込みましたが、同じブロックならまとめてシンプルにできそうに思うかもしれません。そう考えるのが普通です。しかし、今回の場合は上手くいかないケースなのでそれを説明します。
「スコアを~ずつ変える」「コンボを~にする」「コンボを~ずつ変える」ブロックがあったところに「Badを送る」「Goodを送る」「Coolを送る」ブロックにそれぞれ置き換えます。「D・F
・J・K」ノートそれぞれ同じように置き換えます。
そして、「ステージ」のスクリプトに下の図のように「Badを受け取ったとき」「Goodを受け取ったとき」「Coolを受け取ったとき」ブロックでメッセージを受け取って1か所でまとめて処理するようにプログラムを組みます。
そうすると下のアニメーションのような動きになります。おかしい動きになっていることが分かるでしょうか?
たとえば「D・F・J・K」レーンの「COOL」が4つ同時に発生したときのスコアとコンボを見てください。スコアは1000アップしてコンボは1アップしていると思います。
本当は「COOL」1つでスコア1000ポイント&コンボ1アップとしたはずなので、4つ同時であればスコア4000アップ&コンボ4アップとしたいところですがそうなっていません。
下に成功例のアニメーションを載せますので見比べてみてください。
応用編
今回応用編は特にありません。
まとめ
さいごに、今回の記事で説明した『音ゲーのスコアとコンボの回数をカウントするプログラミング』のポイントをまとめます。
- ポイント①:スコアとコンボをカウントアップする
- ポイント②:コンボをクリアする(タイミングをミスった時だけ)
- ポイント③:コンボの最高記録を保持する
音ゲーはタイミングが命なので、このプログラムを仕上げるのには結構苦労しました。最初は音符が読めない???BPMの意味が分からん???という状態から始めたので、音楽理論の初歩中の初歩から勉強しました。そういった基礎知識についても必要最小限に絞って解説に加えるようにしています。
次回は、いよいよ音楽のリズムに合わせてノートを発生させるプログラムを追加します。
どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)