プチコン3号QSP完全マニュアル サポートページ

 2015年夏コミ(コミックマーケット88)で頒布したプチコン3号本「プチコン3号QSP完全マニュアル」において誤植(誤変換)、バグ、説明の抜けた部分などをこのページにて修正を行います。
 記載プログラムの公開キーやファイル名の変更があった場合もこのページで案内します。

 このページに記載のもの以外でミスを見つけた場合にはtwitterの「おちゃめ」、もしくは、おちゃめくらぶ掲示板にてお知らせください。
 「プチコン3号QSP完全マニュアル」の説明文を読んで「ここが分からない」というものがあれば具体的にどこが分からないのかを教えていただけたら返答します。


《 説明の抜けた部分 》



p.4 リスト短縮テクニック(2)条件判断の短縮において「IF文そのものを使わない方が短縮できる場合」の例の抜け

 上記のようにIF文を短縮するのではなくIF文そのものを使わない方が短縮できる場合もあります。

 (例) IF S>H THEN H=S → H=MAX(H,S)  ※変数S(スコア)が変数H(ハイスコア)を上回ったらH=Sにする

 これは論理式でも同等の記述ができますが、MIN関数やMAX関数を使った方が短縮できます。
 MIXMAXの両方を併用すれば範囲を制限したい場合にもIF文を2つ使う必要がなく短縮可能です。

 (例) IF X>49 THEN X=49
IF X<0 THEN X=0
 → X=MIN(MAX(X,0),49)

 MAXX<0にならないように制限して、MINX>49にならないように制限している。

 MINMAX以外にもリスト短縮に使える関数はたくさんありますが、長くなるため省略します。
 ただし、IF文でTHEN以下がマルチステートメント処理となっていた場合にはIF文を使わないで記述するとかえって長くなる場合があるため注意が必要です。



p.5 リスト短縮テクニック(5)表示処理の短縮において「?」の使用例の抜け

 「?」のみを単独記述した場合には改行処理を行うことができます。

 (例) ?"AHO"??"BAKA" ※"AHO"と"BAKA"の間に1行分の改行を行う
 (例) LOCATE,29? ※1番下の行で改行(WIDTH 16の場合は29ではなく14にする)を行うことでスクロールを行う



p.6 リスト短縮テクニックで「(6)文字列操作の短縮」が丸々抜け落ち

(6) 文字列操作の短縮

(a) 文字列の掛け算

 同じ文字列が続く場合には掛け算を使うことによって短縮が可能です。

 (例) ?"ABCABCABC" → ?"ABC"*3

 乗数は整数部分のみ有効です。(小数部は切り捨てられる)
 なお、0を掛ければ0文字を指定できるので特定の動作を「させる」「させない」をIFを使わずに処理が可能になりリスト短縮ができます。

 (例) IF A THEN ?"HELLO" → ?"HELLO"*A
    Aの値が1ならば"HELLO"と表示し、0ならば何も表示しない
 (例) IF A THEN BGMPLAY"CEG" → BGMPLAY"CEG"*A
    Aの値が1ならばドミソの音を鳴らし0ならば何も鳴らさない
     (デフォルトの曲やBEEP音を鳴らさないようにするには文字列操作ではなく音量0にすることで対応可能)

(b) 添え字を使った文字列操作

 文字列から特定の1文字を取り出す場合はMID$を使うよりも短縮できます。

 (例) A$=MID$(B$,N,1) → A$=B$[N]
 (例) A$=MID$("ABC",N,1) → A$="ABC"[N] ※文字列を直接記述した場合でも使用可能

 文字列の特定の1文字を書き換える場合はSUBST$を使うよりも短縮できます。

 (例) A$=SUBST$(A$,N,1,B$) → A$[N]=B$

 置換文字列となるB$は1文字である必要はありません。(2文字以上、もしくは0文字でもOK)
 0文字(B$="")を指定した場合にはそのA$のN番目の文字は削除されます。

 添え字を使った文字列操作は配列変数と同じ使い方ができるためPUSHPOPSHIFTUNSHIFTも使えます。これによってダミー変数を用意すれば1文字減らす場合のLEFT$RIGHT$においてリスト短縮が可能です。

 (例) A$=LEFT$(A$,LEN(A$)-1) → B$=POP(A$) ※B$はダミー変数
 (例) A$=RIGHT$(A$,LEN(A$)-1) → B$=SHIFT(A$) ※B$はダミー変数
    ただし、B$=SHIFT(A$)よりも A$[0]=""とした方が短縮できます。



p.10 「音姫〜サウンドプリンセス〜」のSPANIM内で-#Yとしている理由の抜け

 128という値が欲しいときは上記の通り#Yとすればリスト短縮に有用であることは分かると思うのですが、音が鳴っている時間は2秒(120フレーム)なので本来ならば-128(128フレームの間線形補完で移動)ではなく-120(120フレームの間移動)である必要があります。
 しかし、このゲームではスプライトの優先順位設定によって音符はキャラの後ろに隠れて見えなくなるため120フレームくらいでキャラの後ろに達して見えなくなるような速度(終点座標設定)を行えば128フレームでも問題ないためリスト短縮が可能になります。



p.11 「PETIT PAINT QSP」で1ボタンで線の太さが変えられるということの説明の抜け

 ペンと消しゴムの両方を同じ太さで使い続けるということは普通は無くてペンと消しゴムは太さを変えて使う(消しゴムの方がペンより太めのものを使う)という機会がほとんどだと思います。
 その際に「消しゴムは太いものしか使わないから極太サイズで固定」というのもリスト短縮する場合の1つのやり方になりますが、これは使い勝手に直結する部分(消しゴムが太いと細かい部分が消せない)なので下記の「ループ回数を64回に固定」というのとは異なりここは自由に太さを変えられるのが望ましいです。
 しかし、ペンの太さと消しゴムの太さの両方を別々の変数に入れて自由に変えられるようにするとQSPには収まりません。そこで、上記のように1ボタンで瞬時に太さが変えられるようにすることで太さという1つのパラメータをペンにも消しゴムにも適用が可能になり大幅なリスト短縮を可能にしています。こうすることでこのプログラムが求めている直感的操作(タッチペンが示しているペン先以外は全く見ずに操作)も可能にしています。



p.12 「PETIT PAINT QSP」の塗りつぶし円のループ回数が64回である説明の抜け

 塗りつぶし円ルーチンを使って描く場合には前回タッチした座標と今回タッチした座標のXY座標の差分を取って大きな方の回数分だけループを行い線形補完を行えば線が途切れることはありません。その差分処理はZ=MAX(ABS(X-U),ABS(Y-W))としてZの値の分だけループを行えば良いのですが、この差分処理を入れるだけでQSPに収めるのが困難になります。
 幸いにしてプチコン3号の速度は高速であるため「PETIT PAINT QSP」ではループ回数は64回固定としています。これは高速にペンを動かして線を描いてみて線が途切れないようにするにはどれくらいが必要かを確かめた結果です。32回のループでは普通に描く限りは問題ないですが、高速で動かした時には途切れることが確認できました。64回ならば旧3DSでもABXYボタンによる超極太線を使わない限りは処理落ちがほぼないので問題ありません。3264といった2の累乗に拘る理由はプチコン3号の実数型では整数値を2の累乗で割った場合には誤差が出ない(例えば100などの2の累乗以外で割った場合には誤差が出る)というのが理由ですが、この「PETIT PAINT QSP」では誤差が出て困る要素がない(例えば0.0000001ドットずれたとしても実際は1ドット単位でしか描画できない)ため問題はなく単なる気分の問題にすぎません。
 このようにQSPで作る場合には状況によって変わる値であっても「これだけあれば問題ないという数を定数で置く」(この場合は64)ということでリスト短縮が可能になります。



p.13 「PETIT PAINT QSP」の色の切り替えに関する説明の抜け

 ペンの色と消しゴムの色(キャンバスの元の色)の切り替えは C=-!!C+!C*#RED という式で実現しています。 右辺の変数Cはその前に記述しているC=B AND 768という式によってLボタンもしくはRボタンが押されていれば0以外の値(具体的には256512768のいずれかの値)になります。そこで!!Cのように論理反転を2つ重ねることで(C0以外の値の時)「!!Cの値は1」になります。したがって、-!!C-1となりますが、これは白色(キャンバスの色)を示します。このように「!!」は、0以外の値を強制的に1にしたい場合に使用可能SGNや論理式を使うよりもリスト短縮が可能です。
 LボタンもRボタンを押してない時はCの値は0になります。したがって、!Cの値は1になり、!C*#REDの値は#REDと同じ値(-65536)になります。これによって、LボタンやRボタンを押すことで「ペン」から「消しゴム」へと切り替えができるわけです。

 ちなみに C=-!!C+!C*#RED よりも C=!C*#RED-!!C の方が1文字短縮できるので一見すると「1文字分無駄な処理をしている」というように思えます。これは、この「PETIT PAINT QSP」で描画する色を変更するには定数リテラルとなる#REDの部分を書き換える必要があるのですが、#REDを行の最後に記述することで定数リテラルの変更を容易にするためです。(DIRECTモードからLIST 3(十字キー)左でカーソルが2行の末尾に来るためバックスペース(Yボタン)で簡単に削除できる)
 これは、要するにQSPであっても可能な限りユーザーへの配慮を怠らないようにするというものです。何かを削らないとその配慮を実現できないのならば変わって来ますが、今回の場合は1文字分余裕があったのでそれを有効活用しました。



p.14 「PETIT PAINT QSP」のカーソル表示機能に関する説明の抜け

 ちなみにカーソル機能はVSYNCをメインループから意図的に省くことによって実現しています。(WAITVSYNCは入れるのがベターですが、省略しても問題ないこともありこのプログラムではこれによってリスト短縮にも貢献)
 ほとんどの場合において一番重い処理である塗りつぶし円の部分で表示更新のタイミングがやってくるためその直前に行われていた色コード8(見た目では黒色)の輪郭線が画面に表示された状態になり、それがカーソルとなっています。つまり、この「PETIT PAINT QSP」に使われている塗りつぶし円ルーチンを使いVSYNCを使わないというだけで特別なことをせずにペンの太さによって変わるカーソル表示機能をいとも簡単に実現できているわけです。
 「PETIT PAINT QSP typeB」では誤動作防止のためメインループにVSYNCを入れる必要があります。そのためカーソル表示機能はサポートできなくなりました。メインループのVSYNCとは別に塗りつぶし円の最後のループでVSYNCを実行し、その際はメインループのVSYNCを実行しないようにすれば「PETIT PAINT QSP」と同じくカーソル表示は可能ですが、その場合はQSPには収まらなくなります。


《 掲載プログラムのバグ 》



p.6 100m走ゲーム試作品

000002 A=16:X=37:GCLS #GREEN
000010 A=B:B=BUTTON()
000011 IF A==16 && B==32 THEN A=B:X=X+3
000012 IF A==32 && B==16 THEN A=B:X=X+3
  ※A=16:を追加
  ※A=B:を削除
  ※A=B:を追加
  ※A=B:を追加


《 誤植(誤変換)など 》



p.1 もくじにおいてページ数の記載漏れ

第1章 QSPとは何か
第2章 完成度が高いQSPを作るための基礎知識
第3章 実践編1 100m走ゲームを作る
第4章 実践編2 音当てゲームを作る
第5章 実践編3 お絵かきソフトを作る
第6章 まとめ
  p.1
  p.2
  p.6
  p.9
  p.11
  p.15



p.9 … 2行目
ドレミファソラシ → ドレミファソラシ ※最後の「ド」は不要



p.9 … 4行目
音の数が大きく → 音の数が多く



p.14 … 9行目
PETIT PAINT QSP ver.B → PETIT PAINT QSP typeB


《 公開キー、ファイル名 》



 記載のものから変更無し


RETURN/RETURN *MAIN

inserted by FC2 system