WakuTeki 製作過程

Home PC-6001mkII Program etc

関連リンク WakuTeki

最新の画面 更新日:2014/10/13
作成日:2014/09/15

「Wakuteki」の作成過程を以下少しずつ書き綴っていこうと思います。

2014/09/13:V1.0完成
 いい加減決めねば、タイトルを。

 この時点まで1週間ほど、それらしい単語を集めて組み合わせてみるという事を繰り返していた。
 タイトルのイメージとしては、わらわらと湧いてくる敵を孤軍奮闘で倒していくプレイヤーといった感じだったが、なかなかこれといった名前が出てこない。これに決めようと決めても、検索すると同じ名称が大量に見つかって没になるのもいくつかあったように思う。

 考えも煮詰まっていき、時間だけが過ぎていく。もう今回はシンプルにいくかな…敵が次々と湧いてくるから「WakuTeki」。割とありふれた名称のように見えて意外と検索でも同名称のヒットも少ないし、これで決定する。

 投稿に必要な文章とスクリーンショットを作成して投稿!結果的に、割と早めには投稿できたかな。

2014/09/07〜12:サイズ削減その2
 9/6時点で、start.axのサイズは6,746バイト。あと746バイトの削減だ、とあたかも簡単にできるように言ってみる。

 最初は、配列変数宣言の省略だ。HSPでは配列の範囲を超えた部分に書き込んだ場合、自動的に範囲を拡張してくれる。一方、配列の範囲外を読もうとするとエラーになる。
最初に書き込み最初に読み込み
;ary1の配列宣言なし
ary1(10) = 10
mes ary1(10)
→ エラーにならない
;ary1の配列宣言なし
mes ary1(10)
→ #Error 7
-->配列の要素が無効です

 つまり、読む前に書き込む変数は、dimで初期化をしなくても動く(初期化をしなくても良い という訳ではない。念のため)。

 今回でいうと、例えば敵座標(tx(), ty())の読み込みは敵の状態(tz())が0以外では行われず、かつtzが0から0以外に変更するタイミングで敵座標(tx(), ty())の設定を行う。このため、tx(), ty()のdimによる初期化を省いても動く。
 同様に初期化部分を消す事で、236バイトの削減となった。


 処理の考え方を変える事で、サイズ削減する方法もある。
 ランダムな方向に直進する敵の方向(角度)を決める時に、最初はもう一つの敵の処理の延長で、敵の出現位置とランダム座標との間でatanを使用して計算していた。

 でもよくよく考えると、rnd関数1つのみでも割と同じ結果になるかな?という事で変更。これだけで52バイトの削減なので、バカにはできない。
変更前変更後
r = atan(rnd(640) - tx(z), rnd(480) - ty(z)) r = 0.01 * rnd(628)

 座標(192, 128)に描かれた赤いリンゴの色を抽出して、RGBを入れ替えながら(0,128)、(64,128)、(128,128)に緑、黄、青のリンゴを描く処理だが、変数x, yをなくした処理に変えると32バイト削減する。
変更前変更後
repeat 64
 y = cnt + 128
 repeat 64
  x = cnt + 192
  pos x, y ;描画先Y座標固定
  pget
  r = ginfo_r
  g = ginfo_g
  color g, r, g ;緑系統
  pset x - 192
  color r, r, g ;黄系統
  pset x - 128
  color g, g, r ;青系統
  pset x - 64
 loop
loop
repeat 64
 pos , cnt + 128
 repeat 64


  pget cnt + 192
  r = ginfo_r
  g = ginfo_g
  color g, r, g ;緑系統
  pset cnt
  color r, r, g ;黄系統
  pset cnt + 64
  color g, g, r ;青系統
  pset cnt + 128
 loop
loop

 この他も細かくサイズ削減しているが、なんとも説明しづらいので、ポイントのみ列挙しておく。
  • 実質使われていない処理を消す(2つのcolor設定処理の間に描画系処理が無ければ、1つ目のcolorは要らない 等)
  • パラメータの1番目もしくは最後をできるだけ省略する。
  • マイナス符号や、配列変数の添字を極力使わないようにする。
    HSPでは、添字0はvar1(0)→var1のように省略可能。
    配列変数の同じ値を繰り返し(3回以上)使う時はdup命令を使う。
    同じ配列変数の参照であれば、一旦配列でない変数に代入する。
  • rnd()は意外とサイズを食うので、同じ乱数値を使い回せるよう処理を変更する。
  • int(〜)よりも(0 + 〜)の方がサイズが小さくなる
  • 同じような処理が複数個所になる場合は、変数の値だけ変えれば同じ処理になるようにして、ユーザー関数もしくはサブルーチンにする。
 そんなこんなで、毎日少しずつサイズ削減した効果もあり、10/12時点でstart.axのサイズが6,085バイトまで削減した。もう一息だ。

2014/09/06:一気に作成
 さて、土曜日だ。今日はやる気を出して行こう。

 敵と自機との当たり判定は、他でやっている処理を流用するのでサクッと実装。ぶつかった時はどうしようかな?とりあえず、放射線状に自機を散らすというイメージで。

 次!ランキング画面に移る。基本処理は、前作NegaToggの使い回しだけど、記録する情報はどうするか。スコアや敵の撃退数は入れるとして…、そうだ、自分でもまだ掴めていない、パワーアップの取得順を取ってみるか。

 という事で、パワーアップの取得履歴を記録する処理を別途作成する。これで、こっそり集計ができるかな?

 次!我ながらやめとけばいいのにと思うが、背景のスクロールを行う事にする。ランキング画面では単純に上方向にスクロールをして、ゲーム中は自機の進行方向を元にスクロールを行う。

 次!音だ。プログラム容量の都合上、mmplayを使用する事にするが、これだと同時に一音のみの発声となる。自機弾の発射音を鳴らすと、ほとんど他の音が聞こえなくなるので、最終的に敵の撃破音、パワーアップ取得音、自機破壊音の3つに絞る。

 次!クリア(タイムオーバー)の処理。これまで、残り時間が0でいきなりクリアとしていたのを、敵の出現が終了するよう変更した。これで少なくとも唐突に終わる感は少なくなったと思う。

 これで、主だった部分はほぼ出来た。あとは、いつもの微調整とサイズ削減と、
...タイトルだな。

2014/09/01〜05:パワーアップその2
 パワーアップの処理を進める。

 一人会議の結果、以下の4種類のパワーアップに決定した。
  • 緑:自機の旋回力アップ
  • 黄:得点倍率アップ
  • 青:敵数増加
  • 赤:自機弾の連射力アップ
 パワーアップの効果具合は後で調整するとして、パワーアップの段階を各パラメータの変数に反映させる処理を作成する。

 各パワーアップの段階は3段階くらいにしようかと思っていたが、ボーナス的にもう1段階あっても良いかな?という事で、4種類のパワーアップが全て3段階目まで到達すると4段階目のパワーアップができるように細工する。

 しかし、そもそも制限時間内にパワーアップ4段階目まで行けるんだろうか?と心配になり何度かテストプレイを行った。…効率よく取っていけば、フルパワーアップもできるようだ。

 あと、現在のパワーアップ段階をなんらかの方法で表示しなきゃな。という事で、画面下に色別パワーアップ段階を実装した。
 処理としては、はじめに変数str_lvに「●●●●○○○○」の固定文字列を入れておいて、表示時に以下のような感じで文字列を切り出したものを表示する。
 getstr s, str_lv, 8 - mp(cnt) * 2, 0, mp_max * 2

 もう一つ、パワーアップ段階の限界がわかるように、パワーアップの上限に達した時にリンゴを半透明表示するようにする。

画面

 この段階で、start.axは5,304バイト。ただ、敵との当たり判定やゲームオーバー、ランキング画面、音といった部分が残っている。とりあえず6,000バイトには収まらないだろうが、最終的に収まるだろうか?

履歴

ページ項目
その1 2014/08/xx:はじめに
2014/08/09:蛇っぽいもの
2014/08/17:連射
2014/08/24:敵追加
2014/08/24:ゲームバランス
2014/08/24:見た目向上
2014/08/25〜30:サイズ削減その1
2014/08/31:パワーアップ


NegaTogg