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

Home PC-6001mkII Program etc

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

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


2015/03/08:はじめに
 プチコン3号をダウンロードしてからしばらく経つ。まあ正確には1つプログラムを作りかけて頓挫したのだが。という事で、ここらで何か作ってみるか。

 題材は...HSP版の「NegaTogg」にする。内容も割とシンプルだし、少し立体っぽい表現も入っているので、ちょうど良いような気がする。ただ、プチコンの構文もだいぶ忘れているし、まずはそこから思い出していかないとな。

 まずは、プチコンmkIIのおまじないだったCLEARから...っていきなりエラーだよ。3号では、実行時に変数の情報をクリアする事になったのだろうか?まあいいや、とりあえずなくても。

 次はスプライトの表示。SPSETはかろうじて覚えていたので命令のヘルプを見ると、定義番号を指定するやら元画像の座標を指定するやら書かれている。ただこの時点では、定義番号がなにかわからないし、元画像もどこにあるのやらわからない。

 デモプログラム「EX8TECDEMO」を見て、とりあえず定義番号を指定する方法がわかった。定義番号とスプライトの絵の対応は、SMILEツールのSPDEFで見れるようだ。SPSET, SPSCALE, SPHOME, SPOFSの動作を確かめつつ、ようやくスプライトを1つ出せた。

 こうして、スロースタートながらプログラムが始まった。
わかった事:
  • CLEARはプログラム中には使えなくなった。
  • SPSETの書式が大幅に変わった。定義番号を指定するらしい。

2015/03/12〜15:お試し
 十字キーやボタンの入力検知はBUTTON。という事で、スプライトを8方向に動かしてみる。ここまでは特に問題なし。

 3号のスクリーン制御には、XSCREEN命令を使うらしい。最終的に下画面にも何か表示したいので、少し試してみる。すると、スプライトの移動でエラーが出るようになった。おそらく、XSCREEN命令の実行で、スプライトの情報がクリアされるのだろう。まあ、このあたりは後回しでいいか。

 次に、スプライトの元画像について調べる。これからスプライト画像の加工を行っていくので、はじめに押さえておきたいところだ。「元画像」は、標準ではグラフィックページの4番目(GRP4)を使っているらしい。GRP4を使うには、GPAGEで表示/操作するグラフィックページを使用、と。

 試しに、少し書き込んでみるかな。今回は大き目のキャラクタにしたいので、既存のキャラクタを2倍の大きさにしてみる。

 まず、GPAGE 4,4でGRP4を選択および表示する。次にGRP4にある戦闘機のグラフィックから1ドットずつ色をGSPOITで取ってくる。取ってきた色を使って、画面左上にGFILLで縦横2倍の四角形を描画、という事を16x16ドット全てで行う。

画像

 まずは、こんなところかな。これをなんやかんやすると、スプライトで使えるようになるのだろう。
わかった事:
  • 十字キーとボタンの入力検出はBUTTON。
  • XSCREEN命令の実行で、スプライトの情報がクリアされる?
  • スプライトの元画像は、GRP4に描かれている。
  • GPAGEの2番目の引数に4を指定すると、GRP4にある元画像を加工できる。

2015/03/22:白黒キャラ
 3DSの十字キーは、8方向に動かすには正直操作性がよろしくない。という事で、スライドパッド入力を試す。

 アナログスティックの入力検出は、また「EX8TECDEMO」を参考にする。...STICKか。STICKでX,Y方向の移動量を検出し、自機の移動に反映させる。当然ながら。自機の動きが滑らかになった。

 次に、本来やりたかった白/黒キャラの作成を試みる。

 まず、元の色の明るさを求める。取り出した色をR,G,Bのそれぞれの明るさに分解し、NTSC系加重平均法を用いてグレースケールの明るさを求める。白っぽいキャラにするために、さらに倍近い明るさにしたあと、R,G,Bの明るさとし色合成する。黒キャラは、白キャラで使用した明るさを反転させる。

 複数のキャラクタで同じ処理を書くのも面倒なので、白黒キャラ生成部分をルーチン化する。という事で、こんな感じになった。

画像

 明るさ具合はまだ調整する必要がありそうだが、大まかにはこんな感じで行こう。
わかった事:
  • スライドパッドの入力検出はSTICK。
  • GSPOITで取得する色情報はA,R,G,Bの4バイトでBが最下位バイト。A部分は0だと完全に透明、255だと不透明。

2015/03/22:背景とBG文字
 続いて、背景オブジェクトに移る。

 HSP版では、毎回四角形を描画していたが、プチコン版ではスプライトにしてみよう。理由は2つ。なんとなく四角形描画よりスプライト移動の方が速そう(根拠はないけど)なのと、3D表現を試したいため。速度的に大丈夫かどうかは、やはりやってみないとわからないな。

 HSP版との画面比を考慮した結果、四角形の大きさを16〜28ドットの7種類とする。明るさを変えて四角形を2つ重ねたキャラクタをGRP4に描きこみ、SPDEFでスプライトの定義番号を設定する。

 背景用のスプライトは49種類確保し、先ほどのスプライト定義番号を均等に割り当てる。小さい四角ほど奥に表示されるようにスプライトを設定する。スプライトの下の灰色部分はBGで表現する。これで実行すると...なかなかいい感じの立体感だ。

 続いて、タイトルやスコア表示を行うために、BGレイヤーへの文字表示処理を作成する。数字やアルファベットのアスキーコードがBGのキャラクタ番号と一致しているので、文字列を1文字ずつ分解し、ASCでアスキーコードに変換後、BGPUTで出力する。

 試しに「NegaTogg」を表示してみると...小文字部分が文字化けだ。BGキャラにはアルファベット小文字はなかったか。新たにBGキャラを作るのも面倒なので、大文字で「NEGATOGG」と表示するようにする。

画像


わかった事:
  • スプライトの奥行(Z値)は、値が多いほど奥に表示される。
  • BGの元画像は、GRP5に描かれている。スプライトと違い、BGキャラクタの定義番号はユーザ指定できない。
  • 既存のBGキャラクタにはアルファベットの小文字はない。

2015/03/23〜29:アニメーション
 敵を出すため、HSP版のプログラムリストを、プチコン用に少し変えつつ入力する。

 敵部分のみ入力したところで、いざ動かしていく。なんか色々挙動がおかしいが、入力を間違えた部分があるのかな?という事で、致命的な部分を中心に少しずつ修正していく。

 とりあえず動いたところで、今度はスプライトのアニメーションを行ってみる。命令は...SPANIM。mkIIの時は、キャラ番号をここからここまで繰り返し、みたいな指定方法だったと思うが、今回は1コマずつ細かく指定できるようになったらしい。

 複数コマの単純アニメーションだと、mkIIよりも指定する項目が多くなるので少々面倒かな。逆に、mkIIで複数の処理に分けざるを得ない場面でも1命令で行えるので、この辺りは一長一短なんだろうな。

 3コマのアニメーションは特に問題なくできたのだが、スプライト定義番号1206〜1209を元に作成した白黒キャラのアニメーションを行ったところ、なにか違和感がある。2コマ目と4コマ目が同じ絵になっているような?

画像

 定義番号の指定が間違っているかと思ったが、特に間違っていないようだ。だとするとなんだ?という事で色々試してようやく原因が分かった。白黒キャラクタ生成時に左右反転のアトリビュート情報が抜けてたんだ。

 という事で、SPCHRからの情報取得として、X,Y座標の他に幅、高さ、原点XY座標、アトリビュートの情報を取ってアトリビュートを意識して処理を行うよう、白黒キャラクタ生成ルーチンを作りかえる。これでよし。
わかった事:
  • SPANIMの書式が大幅に変わっている。1コマずつ指定するイメージ?
  • SPCHRで取り出す情報は、元画像のX,Y座標だけでは不十分。

2015/03/29:色変化
 さて次は...「GAME START」表示をするか。

 BGレイヤーへの文字表示処理はもう作ってあるので、これを使ってあっさり実装...と思いきや、文字が背景スプライトの下に隠れてしまう。そりゃそうだ。背景の灰色1色を描くためにBGレイヤーの奥行を一番奥にしたのだから。という事で、もう一つ背景スプライトよりも前面になるよう奥行を設定したBGレイヤー(BG1)を使う。なかなか贅沢な作りだ。

 ともかく、これで「GAME START」表示は問題なさそうだ。

 さて次!HSP版で行っていたレベルアップ時の背景色変化を実装する事にする。スプライトの色変化は、そうSPANIM "C"。最初の1フレームで赤っぽく色変化し、その後30フレームかけて元の色に戻す。3号では、これが1命令でできる。

 ただ、SPANIMによる色変化では、元の色より明るい色にする事ができない(多分)。むむ、ならば...元の色を明るくすれば良いか。
 という事で、明るい灰色+暗い灰色の四角の組み合わせにしていた背景スプライトを、白+明るい灰色にし、通常はSPCOLORで半分の明るさ(&HFF808080)に抑えて表示する。

 あとは、レベルアップ時に以下の命令を入れるだけで、勝手に赤っぽい色から灰色に色変化してくれる。(「I」は、スプライト番号が入った変数)
  SPANIM I,"C",1,&HFFFF8080,-30,&HFF808080

画像

 その他、白黒キャラの色合いを若干変更する。元絵の各ドットで明るさを求める所までは同じだが、この明るさを2倍した値にする。輪郭が淡い色になったので良くなったような、そうでもないような?

 少しずつではあるが、HSP版に近づいてきた。
わかった事:
  • 各画面の奥行をちゃんと指定しないと、不本意に隠れる場合があるので注意。
  • SPCOLOR(SPANIM "C")は、元画像の明るさを最大としたA,R,G,B各色の乗算。
  • なので、明るく色変化させたければ、元画像をもっと明るくしておくと良い。

2015/03/30:当たり判定
 次は、当たり判定だ。

 ここまで、HSP版と同様に自機と敵との距離を測って当たり判定を行っていたが、スプライトの衝突判定を間に入れる事にする。

 スプライトの衝突は、確かSPHIT...あれ?SPHITがない。
 少し戸惑ったが、SPHITの機能が無くなったわけではなく、SPHITSPに統合されたようだ。ヘルプを見る限りでは、mkIIのSPHITと同じような使い方ができるようだ。

 という事で、ActBarrierで行った衝突判定処理と同様、SPHITSPによる判定とスプライト間の距離による判定の2段階判定を行う事にする。この辺りは、ActBarrier for プチコンmkII 製作過程を参考という事で。

わかった事:
  • SPHITの機能はSPHITSPに移った。
  • SPHITSPはスプライト番号の範囲指定もできるようになった。


NegaTogg 製作過程 製作過程 その2