MSX 雑誌投稿プログラム Wallaby!(ワラビー)にエディット機能を追加する(その2)
前回の記事の続きである。そんな前回の記事は、こちらから。
○今回のミッション
まずは、復習ということで、今回のミッションの確認だ。今回のミッションは、このゲームにエディット機能を追加することなのだが、仕組みのお手本としたのは、ファミコン版の「ロードランナー」のエディット機能の動きだった。
○改造②「エディット機能の追加」
前回までで、取り急ぎエディット機能の追加は完了させたが、いくつか課題を残してきている。それは、大きく次の4つなのだが、今回は、これを一つひとつ解決していきたい。
・(課題1)エディット時に画面が固まる問題の解決
これは、なかなか原因が分からず、判明までにそれなりの時間を要した。というのが、画面が固まると、エラーメッセージの確認すらできないからである。BASIC に潤沢なデバッグ機能があればよいが、そういうのは……ない。
ただ、これを何度か繰り返していたら、固まった際の BEEP音や、その後、カーソルの音が確認できたので、一旦プログラムが終了し、BASIC側に制御が戻っているようにも感じた。であれば、エラーメッセージもでているはずだが、何らかの理由でメッセージが確認できない。
プログラムを細かく追っていくと、途中、画面表示を消す処理が入っている(A=USR(0))。これは、画面描画の途中経過を見せずに、準備ができてからドンと一括表示するためだとは思うが、どうも、この間にエラーが発生しているのではないかと考えられた。ということは、この黒い画面の中で、どうにか画面表示を出す命令(A=USR1(0))を実行すれば、画面が表示され、エラーメッセージも確認できるのではないか、と判断。
ということで、確認できたエラーメッセージは、これだ。
Out of string space in 70
これは、文字領域が足りなくなった、ということだが、まあ、今風に分かりやすく言えば、メモリ不足というところだろうか。
C言語においては、文字列変数宣言時にその領域を確保するが、BASIC は変数の宣言が不要なので、こういうことが起こるのだろうか。対処法としては、プログラム冒頭の CLEAR文の数字を増やせばいいのだが、どのくらい増やせばいいか、逆に、増やし過ぎた際の問題はないか……などと考えると、実は適切な数字が分からない……。取り急ぎ、試行錯誤で数字を大きくしていけばいいのだろうが、まあ、メモリ不足であれば、プログラムを再実行すれば解決できる問題でもあり、今回のエラーは、プログラムの流れに大きく影響を与えるような致命的なバグでもないと思うので……今回は、対処療法で乗り切りたい。
具体的には、取り急ぎ、画面の左上に残りメモリを表示するのだ。この数字が小さくなってきた場合は、プログラムを再実行すればよい。そして、各自の環境に合わせ、冒頭の CLEAR文の数字を増やせばいいだろう。具体的なソースコードは次のとおり。
72 GOSUB2000:FORI=0TO1
2000 '文字列メモリ残量表示
2010 LOCATE0,0:PRINT FRE("")
2020 RETURN
・(課題2)動かさないとその場所のパーツが分からないカーソル問題の解決
これは、それこそロードランナーのように、カーソルを点滅させれば解決できる。具体的には、一定時間経過したら、スプライトを表示したり隠したりすればよい。ここで「隠す」というのは、実は難しく考えず、単に透明色にすればよい。ということで、関係のあるソースコードは、次のとおり。
560 L=0:SC=11:XA=X(F):YA=Y(F)
610 L=L+1:IFL>10THENL=LMOD10:SC=SC+(SC=11)*11-(SC=0)*11
640 PUTSPRITE0,(XA*16,YA*16-1),SC,4
720 L=0:SC=11
820 L=0:SC=0
ここでは、変数L が、ループ回数を表すカウントで、それが 10 を超えた際に、スプライトの色(SC)を、0(透明色)と 11(薄黄色)を反転させるようにしている。また、完全にロードランナーのエディットの動きを真似たいので、カーソルが消えた状態であっても、カーソルを動かした場合は、動いたのがすぐに確認できるようにカーソルを表示させるようにするため、SC=11(薄黄色)とした。加えて、スペースを押した場合は、今度は、切り替わったパーツがすぐに分かるように、SC=0(透明色)とした。
・(課題3)現在のモードが分からない問題の解決
これは、どこか空いたスペースに現在のモードを表示するのがいいか。表示する場所としては、画面下部の領域か。ここには、面数のほか、スコアや残りワラビーの表示もあるが、スコアなどはモード選択時には不要な情報だろう。ということで、このスペースをつぶして、エディット中は、ここに「--EDIT MODE--」と表示をしたい。
また、面セレクト中は、ワラビーの色を黄色に変えたい。ちょうど、ロードランナーのランナーとロボットが、エディット中では色が違うのと同じような雰囲気にもなるか? 関係ソースコードは、次のとおり。
72 PUTSPRITE0,(X,Y-1),10,C:A$=" ":GOSUB470:GOSUB2000:FORI=0TO1
470 'モード表示
480 LOCATE12,23:PRINTA$;
490 RETURN
560 L=0:SC=11:XA=X(F):YA=Y(F):A$="--EDIT MODE-- ":GOSUB470
72行目の 10 という数字が、黄色という意味だ。
・(課題4)操作時の音の反応がないので分かりにくい問題の解決
ゲーム中も多数の効果音が鳴るが、やはり効果音は大事だ。ロードランナーだって、面セレクト時とエディット時とそれぞれにおいて、各種ボタンを押した際に、「プッ」とか「ポッ」とか音が鳴る。やはり、操作時は、音によって操作の反応を分かりやすくさせたい。
音については、ロードランナーと全く同じ音も考えたが、SOUND文との相性が悪いのか、簡単には実現できなかったので、原作に使われている音の使い回しで対応したい。音は、次のように当てた。
具体的なソースコードは、次のとおり。
73 S=STICK(0)ORSTICK(1):IFS=7ORS=3THENFORI=0TO15:SOUND1,15-I:NEXT:F=F+((S=7)-(S=3)):F=F+10:F=FMOD10:GOTO70
77 FORI=0TO10:SOUND0,70-I:SOUND0,50-I:NEXT:SOUND0,0:PUTSPRITE0,(X,Y-1),9,C:GOSUB210
670 FORI=0TO10:SOUND0,70-I:SOUND0,50-I:NEXT:SOUND0,0
710 FORI=0TO15:SOUND1,15-I:NEXT
810 B=105:SOUND0,B+100:SOUND0,255:SOUND0,B:SOUND0,0
これで、とりあえず違和感なく、面セレクトとエディットができるようになったか?
○今回の成果物のご提供
ということで、ここにこれまでのプログラムを置く。前回同様、原作プログラムにマージして実行してもらいたい。
使い方は、繰り返しになるが、原作ワラビーが MSX-BASIC で LOAD されている状態で、このダウンロードした WALLABM2.ASC を、同じく MSX-BASIC 側でマージすればよい。具体的には、
MERGE"WALLABM2.ASC"
と、直接打ち込むのだ。
次回は、このエディット機能を使って、私が作ったいくつかの面を紹介したい。
【関連記事】