NegaTogg 製作過程 for プチコン3号 その1

Home PC-6001mkII Program etc

 このページでは、NegaToggのV1.0作成過程を書いています。

NegaTogg 製作過程 for プチコン3号 製作過程


2015/04/01:得点表示
 次は、自機と同色の敵を取った時に表示する得点表示だ。

 任意の位置に表示する事から、スプライトにしようと思うが、この得点部分のグラフィックはどうしよう。と言ったところで、描くしかないよね。という事で、GPUTCHRでGRP4に描きこむ事にする。

 敵と取るたびに毎回得点を描きこむのはさすがにムダなので、得点が変わったタイミングで書き込む事にする。瞬間的には複数種類の得点が同時に画面表示されるため、得点用の描画領域も複数用意する。

 まあ、いくらなんでも8個分用意すれば十分だろう。そして、スプライトは、さらに余裕を持たせて16個を順繰りに使うようにする。

 8個分の得点描画用領域は、あらかじめSPDEFでスプライト定義番号を設定しておく。得点表示時に、前回と得点が変わらない場合は、前回と同じスプライト定義番号を設定する。そして、得点が増えたタイミングで、次の定義番号に対応した位置に新しい得点を描画し、スプライトに割り当てる。

 こんな感じで、いざ実装!

画像

 GRP4への描きこみの様子を見るため、BGレイヤーの表示をOFFにし、グラフィック画面をONにした。少々見づらいが、機能しているようだ。速度的に少し不安があったが、まだまだ余裕のようで一安心。
わかった事:
  • GPUTCHRは、当初思っていたよりは速い。

2015/04/04〜05:音入れ
 さて、次は...音でも入れるか。

 HSP版ではBGMはなかったが、プチコンの曲で良さげなものがあれば入れてみようかな。という事で、SMILEツールで既存のBGMを聞き比べてみる。このあたりは便利になったもんだ。

 いくつかの候補のなか、最終的に「Sencibility」を選択する。緊張感のある旋律が良い感じだ。あとは、自機の色変化音、同色の敵を取った時の音、レベルアップ時の音、異なる敵に当たった時の音を割り当てていく。

 やはり、音が入ると印象が大きく変わるな。
わかった事:
  • BGMはBGMPLAYで鳴らす。曲番号はSMILEツールの「BGM」でわかる。
  • 効果音はBEEPで鳴らす。効果音番号はSMILEツールの「GM」でわかる。

2015/04/05:ゲームオーバー
 これまでおざなりにしていたゲームオーバーの処理に移る。

 一発死のゲームなので、シンプルにオーケストラヒットでも鳴らすか。ついでに、レベルアップ時に作った背景の色変化処理を利用して青く光らせるようにする。

 あとはやっぱりゲームオーバーの瞬間に全ての動きが止まった方が良いだろう。という事で、BGMSTOPでなっているBGMを止めて、全てのスプライトに対しSPSTOPを実行する。これでオーケストラヒットの音の効果も上がるかな。

 ゲームオーバーの表示までは良かったが、ランキング画面に移る時に画面上に敵が残る事がわかった。まあ当然だ。消してないんだから。まあ、画面上に表示されなければいいので、SPOFSで自機と敵のスプライトを画面外に移動させる。これで良し。
わかった事:
  • BGMSTOPで、鳴っているBGMを強制終了する。
  • SPSTOPでスプライトの動きは止まるが、非表示にはならない。

2015/04/05〜08:ランキング その1
 次にランキング画面の処理に移る。表示のベースはHSP版で、プチコンmkII版の「ActBarrier」をミックスしたような感じにする。

 ランキングの得点表示は、グラフィック画面に描きこむかな。BGだと16x16ドットキャラになって画面に収まりそうにないし。という事で、GPUTCHRを使ってGRP0に描きこむ。でもこれだと文字が見づらいので、縁取り風に表示する事にする。

 具体的には、本来文字列を描画する位置から縦横4方向に1ドットずつ描画位置をずらして黒色で文字列を描画し、最後に指定色で文字列描画する事にする。同じ文字列を5回描くというムダはあるけど、ここはさほど速さを気にする部分ではないのでまあいいか。

 ついでに、文字の縦横倍率も変えられるようにして関数化する。1位〜10位を全て縦倍角にするとレイアウト的に収まらないため、6位〜10位は等倍表示にする。

 さて、次にランキング情報の保存と読み込み部分を作る。

 mkIIと違い、SAVEで文字列変数の内容を保存できるようだ。文字列で保存した方が保存状態が確認しやすそうなので、この方法でランキング保存する事にする。

 読み込んで変数に入れ直す事も考えて、保存用の文字列はスコア、レベル、コンボ数、日付をそれぞれ固定長にして文字列結合する。さらに、1位〜20位の情報を改行コード区切りで加えていく。

 ランキングの保存を試すと、保存の確認画面が出てくる。うーむ、今回も自動保存はあきらめた方が良いかな。
わかった事:
  • BGMSTOPで、鳴っているBGMを強制終了する。
  • SPSTOPでスプライトの動きは止まるが、非表示にはならない。

2015/04/08〜09:ランキング その2
 ランキングファイルへの書き出しと並行して読み込み部分も作成する。

 SAVEと対の機能となるLOADでは、当然文字列変数にファイルの内容を入れる事が出来る。LOADは確認画面なしで読み込む事が出来るので一安心。

 あと、3号ではFILESでファイル一覧が確認できるようになった。つまりファイルを開く前に開くファイルの存在確認ができるという事だ。という事で、FILES結果を変数に入れて「TXT:NGTGLANK」があるか確かめる処理を追加する。

 ところが、存在するはずの「TXT:NGTGLANK」が見つからない。よくよく見ると、FILES結果に「*NGTGLANK」ならある。「TXT:」がないのはともかくなぜ「*」が付いているのかが良くわからないが、ともかくそんなものなのだろう。

 という事で、「*NGTGLANK」の存在確認をして、ファイルがなかった場合にランキングの初期値指定を行う事にした。

 その他、難易度のメリハリがあった方が良いかな?という事で、レベルにより敵の難易度を変える事にする。

 HSP版では、レベルによって敵の出現最大数が増えて行ったが、プチコン版ではさらに敵の移動速度の最大値を変えてみる。序盤レベルでは、敵のスピードも遅くしたので少し易しくなったが、一方レベル5辺りからは逆に難しくなったような気がする。
わかった事:
  • FILESで、作業用プロジェクトのフォルダ内のファイル一覧を取得できる。
  • FILESで取得したファイル名は、1文字目に「*」が付く?

2015/04/11:縛りプレイ
 プチコン3号では、変数の宣言を厳密化するオプションがついたらしいので、試してみる。

 プログラムの最初に「OPTION STRICT」を付けて実行...案の定「Undefined Variable」エラーが頻発する。エラーがあった変数を1つずつ変数宣言していく。なんか、一種の縛りプレイだな。

 正直、変数宣言は煩わしいが、一方、どういう目的で変数を追加したかを見直すきっかけにもなるという利点もある。という事で、変数宣言ついでに少しだけ変数の説明を加えていく。

 全て変数宣言したからといって、処理が変わるかというとそうでもないのだろうが、気分的にスッキリした。
わかった事:
  • 「OPTION STRICT」を付けると、変数宣言が必須となる。
  • 場当たり的に追加した変数は、案外多い。

2015/04/11〜12:二画面表示
 次に、長い間おざなりにしていた二画面表示を試す。

 XSCREEN 2を使って、上画面を3D表示、下画面を2D表示にする。さて、下画面にはどうやって書くんだっけ?...どうやら、DISPLAYで操作対象とする上/下画面を切り替えるようだ。

 次に、下画面のBGレイヤーへの操作を試すが、この段階ではまった。なぜか下画面のBGレイヤーを操作しようとすると「Out of Range」エラーとなるのだ。

 XSCREEN命令でBGレイヤー数の上下画面配分設定があったので2を設定したが、それでも状況は変わらない。0を指定すると下画面には表示されたが、上画面へのBGレイヤー割り当てを0にしているので、今度は当然、上画面にBGが表示できない。

 どうにも原因がわからず、翌日に持ち越しとなった。

 そして翌日に続きを行うと、いきなり上下画面両方のBGレイヤーへの表示が行えた。一瞬、時間が解決したのかと思ったが、そんな訳はない。

 ここで、ようやく二画面使用時の「BGのレイヤー番号」の仕様を理解した。XSCREEN 2で、BGレイヤーを上下2面ずつに設定した場合、下画面のBGレイヤーは0始まりになるようだ。
  • ×:BGレイヤー番号は、上画面 0,1、下画面 2,3
  • ○:BGレイヤー番号は、上画面 0,1、下画面 0,1
 道理で、下画面のBGレイヤー2に描きこもうとすると「Out of Range」エラーになるはずだ。

 下画面に何を表示しようかと少し悩んだ結果、直近のランキングスコアまでの差分をリアルタイム表示する事にした。

 あとは、テストプレイして問題があれば微調整かな。
わかった事:
  • XSCREENの引数で、BGレイヤー数とスプライト数の上下画面配分を設定可能。
  • 上/下画面への出力先切り替えはDISPLAYで行う。
  • 下画面のBGレイヤー番号も0始まり。

2015/04/12:微調整
 一通り完成したので、テストプレイを行う。

 何度もプレイしていると、まれに白キャラと黒キャラがまったく同じ位置に表示される場合がある。処理上、自機と同色の敵の辺り判定を大きくしているので、そこまで理不尽なやられ方はしないとは思う。

 ただ、敵が密集している時に白一色だと思って突っ込むと後ろに黒キャラが混っていてゲームオーバーとなる場合はある。せっかく作り直しているし、このあたり何とかならないかな…。
 そこで目を付けたのが、スプライトの奥行だ。3D表示の機能としては当然なのかもしれないが、スプライトの奥行を変えるだけで、スプライトの表示順が変わるのは地味にすごい事ではなかろうか。

 という事で、白キャラと黒キャラのスプライトの奥行を、TRUE(1)とFALSE(0)に分け、1フレーム単位でTRUEとFALSEを逆転させるようにした。これで、ちょっとした半透明風の表示になり、両方の色のキャラが重なっても両方の色が認識できるようになった。

 少し心配していた処理速度への影響もないようだ。でもこの機能、言わないと誰も気づかないような…。


わかった事:
  • スプライトの表示順は、スプライトの奥行でも変更できる。

2015/04/12:公開
 ようやく公開...って、どうするんだっけ?「作品の公開とダウンロード」から「二次利用可能な作品を他の人に公開」かな?と試してみると、注意事項の了解後の後、公開するファイルがないと言われた。ここでファイル選択するわけではないのか。

 とすると、まず「アップロード(送信)」か。アップロードを行った後に再度「二次利用可能な作品を他の人に公開」を試すと、今度は候補として出てきた。公開に時間がかかるかもしれないという事だったが、すぐ公開キーが発行された。

 この公開キーを使って「公開キーを使ってダウンロード」を試すと、無事ダウンロードされた。これでようやく完成...かな?

 一応ダウンロードも試しておこう。公開キーをメモして、現在のプログラムを退避した後、「公開キーを使ってダウンロード」を試す。ファイル名の入力もなしで、公開キーだけでダウンロードできるのか。といった感じであっさり成功。プログラム実行の一覧で、名前が出るのが良い感じだ。

 ともかく、これで一段落。
わかった事:
  • 公開するファイルは事前にアップロードする。
  • 公開キーは「二次利用可能な作品を他の人に公開」からの画面で確認できる。
  • 公開キーを使ってダウンロードしたファイルには、公開者の名前が付く。


その1 NegaTogg 製作過程 製作過程